seuif97/common/
region.rs

1//! Check the Region
2//! * Basic input pairs :  (p,T) (p,h) (p,s) (h,s)  
3//! * Extented input pairs:: (p,v) (t,v) (t,h)
4
5use crate::common::boundaries::*;
6use crate::common::constant::*;
7use crate::common::propertry_id::*;
8
9use crate::r1::region1_T_phps::*;
10use crate::r1::region1_pT::*;
11
12use crate::r2::region2_T_ps::*;
13use crate::r2::region2_pT::*;
14use crate::r2::region2_p_hs::*;
15
16use crate::r3::region3::*;
17use crate::r3::region3_Td::*;
18use crate::r3::region3_Tv_phps::*;
19use crate::r3::region3_v_pT::*;
20
21use crate::r4::region4_pTx::*;
22use crate::r4::region4_sat_pT::*;
23
24use crate::r5::region5_pT::*;
25use crate::r5::region5_ph_ps_hs::*;
26
27/// const for none region input
28pub const REGION_NONE: i32 = 10;
29
30/// T in up-order  to check region,
31///    p in MPa ,  T in K, returns the region
32pub fn pT_sub_region(p: f64, T: f64) -> i32 {
33    if p < P_MIN || p > 100.0 {
34        return INVALID_P;
35    }
36    if T < 273.15 || T > 2273.15 {
37        return INVALID_T;
38    }
39    if T > 1073.15 && T <= 2273.15 && p > 50.0 {
40        return INVALID_P;
41    }
42
43    // ON TOP: to check the Saturaton lines、critical point firstly
44    // to reduce the complex
45
46    //TODO: Saturaton Pressure Tolerance
47    const psatTol: f64 = 1.0e-6;
48    if T >= 273.15 && T < TC_WATER {
49        let ps: f64 = p_saturation(T);
50        if (p - ps).abs() / ps < psatTol {
51            return 4;
52        }
53    }
54    // the critical point in region 3
55    if T == TC_WATER && p == PC_WATER {
56        return 3;
57    }
58
59    if T >= 273.15 && T <= 623.15 {
60        if p >= p_saturation(T) && p <= 100.0 {
61            return 1;
62        }
63        if p < p_saturation(T) && p > P_MIN {
64            return 2;
65        }
66    };
67
68    // T(623.15,tc_water)
69    if T > 623.15 && T <= 863.15 {
70        if p >= P_MIN && p <= B23_T2p(T) {
71            return 2;
72        }
73        if p > B23_T2p(T) && p <= 100.0 {
74            return 3;
75        }
76    };
77
78    if T > 863.15 && T <= 1073.15 && p >= P_MIN && p <= 100.0 {
79        return 2;
80    }
81
82    if 1073.15 < T && T <= 2273.15 && P_MIN <= p && p <= 50.0 {
83        return 5;
84    }
85    INVALID_VALUE
86}
87
88/// Pmin -> Ps_623-> Pc-> 100MP ,3 range to check region
89///  in each sub region use(hmin, hmax) to chack region
90pub fn ph_sub_region(p: f64, h: f64) -> i32 {
91    let hmin: f64 = pT2h_reg1(p, 273.15);
92    let hmax: f64 = pT2h_reg5(p, 2273.15);
93
94    if P_MIN <= p && p <= Ps_623
95    // Ps_623
96    {
97        let T_sat: f64 = T_saturation(p);
98        let h14: f64 = pT2h_reg1(p, T_sat);
99        let h24: f64 = pT2h_reg2(p, T_sat);
100        let h25: f64 = pT2h_reg2(p, 1073.15);
101
102        if hmin <= h && h <= h14 {
103            return 1;
104        } else if h14 < h && h < h24 {
105            return 4;
106        } else if h24 <= h && h <= h25 {
107            return 2;
108        } else if h25 < h && h <= hmax {
109            return 5;
110        }
111    };
112
113    if Ps_623 < p && p < PC_WATER {
114        let h13: f64 = pT2h_reg1(p, 623.15);
115        let h32: f64 = pT2h_reg2(p, B23_p2T(p)); //boundaries
116        let h25: f64 = pT2h_reg2(p, 1073.15);
117
118        if hmin <= h && h <= h13 {
119            return 1;
120        }
121
122        if h13 < h && h < h32 {
123            let p34: f64 = h2p_sat_reg3(h); //boundaries
124            if p < p34 {
125                return 4;
126            } else {
127                return 3;
128            }
129        };
130
131        if h32 <= h && h <= h25 {
132            return 2;
133        }
134        if h25 < h && h <= hmax {
135            return 5;
136        }
137    };
138
139    if PC_WATER <= p && p <= 100.0 {
140        let h13: f64 = pT2h_reg1(p, 623.15);
141        let h32: f64 = pT2h_reg2(p, B23_p2T(p));
142        let h25: f64 = pT2h_reg2(p, 1073.15);
143
144        if hmin <= h && h <= h13 {
145            return 1;
146        }
147        if h13 < h && h < h32 {
148            return 3;
149        }
150        if h32 <= h && h <= h25 {
151            return 2;
152        }
153        if (p <= 50.0) && (h25 <= h && h <= hmax) {
154            return 5;
155        }
156    };
157    INVALID_VALUE
158}
159
160/// Pmin -> Ps_623-> Pc-> 100MP ,3 range to check region
161///  in each sub region use(smin ,smax) to chack region
162pub fn ps_sub_region(p: f64, s: f64) -> i32 {
163    let smin: f64 = pT2s_reg1(p, 273.15);
164    let smax: f64 = pT2s_reg5(p, 2273.15);
165
166    // 1. First Range: [P_MIN ,Ps_623]
167    if P_MIN <= p && p <= Ps_623 {
168        let Tsat: f64 = T_saturation(p);
169        let s14: f64 = pT2s_reg1(p, Tsat);
170        let s24: f64 = pT2s_reg2(p, Tsat);
171        let s25: f64 = pT2s_reg2(p, 1073.15);
172
173        if smin <= s && s <= s14 {
174            return 1;
175        }
176        if s14 < s && s < s24 {
177            return 4;
178        }
179        if s24 <= s && s <= s25 {
180            return 2;
181        }
182        if s25 < s && s <= smax {
183            return 5;
184        }
185    };
186
187    // 2. Secode Range: (Ps_623,PC_WATER)
188    if Ps_623 < p && p < PC_WATER {
189        let s13: f64 = pT2s_reg1(p, 623.15);
190        let s32: f64 = pT2s_reg2(p, B23_p2T(p));
191        let s25: f64 = pT2s_reg2(p, 1073.15);
192        if smin <= s && s <= s13 {
193            return 1;
194        }
195        if s13 < s && s < s32 {
196            let p34: f64 = s2p_sat_reg3(s); // boundaries;
197            if p < p34 {
198                return 4;
199            } else {
200                return 3;
201            }
202        };
203
204        if s32 <= s && s <= s25 {
205            return 2;
206        }
207        if s25 < s && s <= smax {
208            return 5;
209        }
210    };
211    // 3. Third: [PC_WATER,100.0]
212    if PC_WATER <= p && p <= 100.0 {
213        let s13: f64 = pT2s_reg1(p, 623.15);
214        let s32: f64 = pT2s_reg2(p, B23_p2T(p));
215        let s25: f64 = pT2s_reg2(p, 1073.15);
216        if smin <= s && s <= s13 {
217            return 1;
218        }
219        if s13 < s && s < s32 {
220            return 3;
221        }
222        if s32 <= s && s <= s25 {
223            return 2;
224        }
225
226        if p <= 50.0 && s25 <= s && s <= smax {
227            return 5;
228        }
229    };
230    INVALID_VALUE
231}
232
233///  region 1,2,3,4 (smin ->smax), region 5
234pub fn hs_sub_region(h: f64, s: f64) -> i32 {
235    let mut T: f64 = 0.0;
236    let mut p: f64 = 0.0;
237    let mut v: f64 = 0.0;
238    let mut hs: f64 = 0.0;
239    let s13: f64 = pT2s_reg1(100.0, 623.15);
240    let s13s: f64 = pT2s_reg1(Ps_623, 623.15);
241    let sTPmax: f64 = pT2s_reg2(100.0, 1073.15);
242    let s2ab: f64 = pT2s_reg2(4.0, 1073.15); // TODO: p=4 2ab s2ab
243
244    // Left point in h-s plot
245    let mut smin: f64 = pT2s_reg1(100.0, 273.15);
246    let mut hmin: f64 = pT2h_reg1(P_MIN, 273.15);
247
248    // Right point in h-s plot
249    let mut hmax: f64 = pT2h_reg2(P_MIN, 1073.15);
250    let mut smax: f64 = pT2s_reg2(P_MIN, 1073.15);
251
252    // Region 4 left and right point
253    let h4l: f64 = pT2h_reg1(P_MIN, 273.15);
254    let s4l: f64 = pT2s_reg1(P_MIN, 273.15);
255
256    let h4v: f64 = pT2h_reg2(P_MIN, 273.15);
257    let s4v: f64 = pT2s_reg2(P_MIN, 273.15);
258
259    // !!!! Check region 5 MUST On TOP !!!
260    // if (s4v <= s && s<= smax) (h,s)may be setup to error region2
261    if pT2s_reg5(50.0, 1073.15) < s
262        && s <= pT2s_reg5(P_MIN, 2273.15)
263        && pT2h_reg5(50.0, 1073.15) < h
264        && h <= pT2h_reg5(P_MIN, 2273.15)
265    {
266        p = hs2p_reg5(h, s);
267        T = ph2T_reg5(p, h);
268        if 1073.15 < T && T <= 2273.15 && P_MIN <= p && p <= 50.0 {
269            return 5;
270        }
271    };
272    if smin <= s && s <= s13 {
273        hmin = h4l + (s - s4l) / (s4v - s4l) * (h4v - h4l);
274        hs = hs_region_h1_s(s);
275        T = ps2T_reg1(100.0, s) - 0.0218;
276        hmax = pT2h_reg1(100.0, T);
277        if hmin <= h && h < hs {
278            return 4;
279        }
280        if hs <= h && h <= hmax {
281            return 1;
282        }
283    };
284
285    if s13 < s && s <= s13s {
286        hmin = h4l + (s - s4l) / (s4v - s4l) * (h4v - h4l);
287        hs = hs_region_h1_s(s);
288        let h13: f64 = hs_region_h13_s(s);
289        v = ps2v_reg3(100.0, s) * (1.0 + 9.6e-5);
290        T = ps2T_reg3(100.0, s) - 0.0248;
291        hmax = Td2h_reg3(T, 1.0 / v);
292        if hmin <= h && h < hs {
293            return 4;
294        }
295        if hs <= h && h < h13 {
296            return 1;
297        }
298        if h13 <= h && h <= hmax {
299            return 3;
300        }
301    };
302
303    if s13s < s && s <= SC_WATER {
304        hmin = h4l + (s - s4l) / (s4v - s4l) * (h4v - h4l);
305        hs = hs_region_h3a_s(s);
306        v = ps2v_reg3(100.0, s) * (1.0 + 9.6e-5);
307        T = ps2T_reg3(100.0, s) - 0.0248;
308        hmax = Td2h_reg3(T, 1.0 / v);
309        if hmin <= h && h < hs {
310            return 4;
311        }
312        if hs <= h && h <= hmax {
313            return 3;
314        }
315    };
316
317    if SC_WATER < s && s < 5.049096828 {
318        hmin = h4l + (s - s4l) / (s4v - s4l) * (h4v - h4l);
319        hs = hs_region_h2c3b_s(s);
320        v = ps2v_reg3(100.0, s) * (1.0 + 9.6e-5);
321        T = ps2T_reg3(100.0, s) - 0.0248;
322        hmax = Td2h_reg3(T, 1.0 / v);
323        if hmin <= h && h < hs {
324            return 4;
325        }
326        if hs <= h && h <= hmax {
327            return 3;
328        }
329    };
330
331    if 5.049096828 <= s && s < 5.260578707 {
332        // Specific zone with 2-3 boundary in s shape
333        hmin = h4l + (s - s4l) / (s4v - s4l) * (h4v - h4l);
334        hs = hs_region_h2c3b_s(s);
335        let h23max: f64 = pT2h_reg2(100.0, 863.15);
336        let h23min: f64 = pT2h_reg2(Ps_623, 623.15);
337        T = ps2T_reg2(100.0, s) - 0.019;
338        hmax = pT2h_reg2(100.0, T);
339
340        if hmin <= h && h < hs {
341            return 4;
342        }
343        if hs <= h && h < h23min {
344            return 3;
345        }
346
347        if h23min <= h && h < h23max {
348            if hs2p_reg2c(h, s) <= B23_T2p(hs_region_t_hs(h, s))
349            //hs2p_reg2c r2::region2_p_hs
350            {
351                return 2;
352            } else {
353                return 3;
354            }
355        }
356
357        if h23max <= h && h <= hmax {
358            return 2;
359        }
360    };
361
362    if 5.260578707 <= s && s < 5.85 {
363        hmin = h4l + (s - s4l) / (s4v - s4l) * (h4v - h4l);
364        hs = hs_region_h2c3b_s(s);
365        T = ps2T_reg2(100.0, s) - 0.019;
366        hmax = pT2h_reg2(100.0, T);
367        if hmin <= h && h < hs {
368            return 4;
369        }
370        if hs <= h && h <= hmax {
371            return 2;
372        }
373    }
374
375    if 5.85 <= s && s < sTPmax {
376        hmin = h4l + (s - s4l) / (s4v - s4l) * (h4v - h4l);
377        hs = hs_region_h2ab_s(s);
378        T = ps2T_reg2(100.0, s) - 0.019;
379        hmax = pT2h_reg2(100.0, T);
380        if hmin <= h && h < hs {
381            return 4;
382        }
383        if hs <= h && h <= hmax {
384            return 2;
385        }
386    };
387
388    if sTPmax <= s && s < s2ab {
389        hmin = h4l + (s - s4l) / (s4v - s4l) * (h4v - h4l);
390        hs = hs_region_h2ab_s(s);
391        p = hs2p_reg2(h, s);
392        hmax = pT2h_reg2(p, 1073.15);
393        if hmin <= h && h < hs {
394            return 4;
395        }
396        if hs <= h && h <= hmax {
397            return 2;
398        }
399    };
400
401    if s2ab <= s && s < s4v {
402        hmin = h4l + (s - s4l) / (s4v - s4l) * (h4v - h4l);
403        hs = hs_region_h2ab_s(s);
404        p = hs2p_reg2(h, s);
405        hmax = pT2h_reg2(p, 1073.15);
406        if hmin <= h && h < hs {
407            return 4;
408        }
409        if hs <= h && h <= hmax {
410            return 2;
411        }
412    }
413
414    if s4v <= s && s <= smax {
415        hmin = pT2h_reg2(P_MIN, 273.15);
416        p = hs2p_reg2a(h, s); //hs2p_reg2a r2::region2_p_hs
417        hmax = pT2h_reg2(p, 1073.15);
418        if P_MIN <= p && p <= 100.0 && hmin <= h && h <= hmax {
419            return 2;
420        }
421    }
422    INVALID_VALUE
423}
424
425///  Region for extended input pairs (p,v),(t,v),(t,s),(t,h)
426///     Region (p,v)
427pub fn pv_sub_region(p: f64, v: f64) -> i32 {
428    if (p < P_MIN2) || (p > P_MAX2) {
429        return INVALID_VALUE;
430    }
431
432    let vt273: f64 = pT2v_reg1(p, 273.15);
433    let vt1073: f64 = pT2v_reg2(p, 1073.15);
434    let mut vt2273: f64 = 0.0;
435    if (p >= P_MIN5) && (p <= P_MAX5) {
436        vt2273 = pT2v_reg5(p, 2273.15);
437    }
438
439    let mut T1: f64 = 0.0;
440    let mut vsw: f64 = 0.0;
441    let mut vss: f64 = 0.0;
442    let mut vt623: f64 = 0.0;
443    let mut vB23: f64 = 0.0;
444
445    if (p > 0.000611213) && (p <= P_MIN3) {
446        T1 = T_saturation(p);
447        vsw = pT2v_reg1(p, T1);
448        vss = pT2v_reg2(p, T1);
449    } else if (p > P_MIN3) && (p <= P_MAX3) {
450        vt623 = pT2v_reg1(p, 623.15);
451        T1 = B23_p2T(p);
452        vB23 = pT2v_reg2(p, T1); //
453        if p <= PC_WATER {
454            T1 = T_saturation(p);
455            vsw = pT2v_sat_reg3(p, T1, 0.0);
456            vss = pT2v_sat_reg3(p, T1, 1.0);
457        }
458    }
459    if ((p >= P_MIN1) && (p <= P_MIN3)) && ((v >= vt273) && (v <= vsw))
460        || ((p > P_MIN3) && (p <= P_MAX1)) && ((v >= vt273) && (v <= vt623))
461    {
462        return 1;
463    };
464    if ((p >= P_MIN2) && (p <= P_MIN3) && (v > vss) && (v <= vt1073))
465        || ((p > P_MIN3) && (p <= P_MAX2) && (v >= vB23) && (v <= vt1073))
466    {
467        return 2;
468    };
469    if ((p > P_MIN3) && (p <= PC_WATER) && (((v > vt623) && (v < vsw)) || ((v > vss) && (v < vB23))))
470        || ((p > PC_WATER) && (p <= P_MAX3) && (v > vt623) && (v < vB23))
471    {
472        return 3;
473    };
474    if (p > P_MIN) && (p <= PC_WATER) && (v >= vsw) && (v <= vss) {
475        return 4; // x is obtained in r4::region4_pair_ext::pv2x_reg4
476    };
477    if (p > P_MIN5) && (p <= P_MAX5) && (v > vt1073) && (v <= vt2273) {
478        return 5;
479    };
480    INVALID_VALUE
481}
482
483///  Region (t,v)
484pub fn tv_sub_region(t: f64, v: f64) -> i32 {
485    let T: f64 = t + 273.15;
486    if (T < 273.15) || (T > 2273.15) {
487        return INVALID_VALUE;
488    }
489
490    let mut vpmax2: f64 = 0.0;
491    if (T >= T_MIN2) && (T <= T_MAX2) {
492        vpmax2 = pT2v_reg2(P_MIN2, T);
493    }
494
495    let mut vpmax5: f64 = 0.0;
496    let mut vp50: f64 = 0.0;
497    if (T >= T_MIN5) && (T <= T_MAX5) {
498        vpmax5 = pT2v_reg5(P_MIN5, T);
499        vp50 = pT2v_reg5(50.0, T);
500    }
501
502    // p=100MPa
503    let mut vp100: f64 = 0.0;
504    if (T >= T_MIN1) && (T <= T_MAX1) {
505        vp100 = pT2v_reg1(100.0, T);
506    }
507    if (T > T_MIN3) && (T <= T_MAX3) {
508        vp100 = pT2v_reg3(100.0, T);
509    }
510
511    if (T > T_MAX3) && (T <= T_MAX2) {
512        vp100 = pT2v_reg2(100.0, T);
513    }
514
515    let mut vsw: f64 = 0.0;
516    let mut vss: f64 = 0.0;
517    let mut vB23: f64 = 0.0;
518    let mut p1: f64 = 0.0;
519
520    if (T >= T_MIN1) && (T <= T_MAX1) {
521        vsw = T2sat_water(T, OV);
522        vss = T2sat_steam(T, OV);
523    } else if (T > T_MIN3) && (T <= T_MAX3) {
524        p1 = B23_T2p(T);
525        vB23 = pT2v_reg2(p1, T); //
526        if T <= TC_WATER {
527            p1 = p_saturation(T);
528            vsw = pT2v_sat_reg3(p1, T, 0.0);
529            vss = pT2v_sat_reg3(p1, T, 1.0);
530        };
531    };
532
533    //
534    if (T >= T_MIN1) && (T <= T_MAX1) && (v < vsw) && (v > vp100) {
535        return 1;
536    };
537    if ((T >= T_MIN2) && (T <= T_MAX1) && (v > vss) && (v < vpmax2))
538        || ((T > T_MAX1) && (T <= T_MAX3) && (v >= vB23) && (v < vpmax2))
539    {
540        return 2;
541    };
542    if ((T > T_MIN3) && (T <= TC_WATER) && (((v > vss) && (v < vB23)) || ((v >= vp100) && (v < vsw))))
543        || ((T > TC_WATER) && (T <= T_MAX3) && (v >= vp100) && (v < vB23))
544    {
545        return 3;
546    };
547
548    if (T >= T_MIN1) && (T <= TC_WATER) && (v >= vsw) && (v <= vss) {
549        return 4; // x is obtained in r4::region4_pair_ext::Tv2x_reg4
550    };
551
552    if (T > T_MIN5) && (T <= T_MAX5) && (v >= vp50) && (v <= vpmax5) {
553        return 5;
554    };
555    INVALID_VALUE
556}
557
558/// Region (t,h)
559pub fn th_sub_region(t: f64, h: f64) -> i32 {
560    let T: f64 = t + 273.15;
561    if T < 273.15 || T > 2273.15 {
562        return INVALID_VALUE;
563    }
564
565    let mut hpmax2: f64 = 0.0;
566    if (T >= T_MIN2) && (T <= T_MAX2) {
567        hpmax2 = pT2h_reg2(P_MIN2, T);
568    }
569
570    let mut hpm50: f64 = 0.0;
571    let mut hpmax5: f64 = 0.0;
572    if (T > T_MIN5) && (T <= T_MAX5) {
573        hpm50 = pT2h_reg5(P_MAX5, T);
574        hpmax5 = pT2h_reg5(P_MIN5, T);
575    }
576    // p=100MPa
577    let mut hp100: f64 = 0.0;
578    if (T >= T_MIN1) && (T <= T_MAX1) {
579        hp100 = pT2h_reg1(100.0, T);
580    } else if (T > T_MIN3) && (T <= T_MAX3) {
581        hp100 = pt_reg3(100.0, T - 273.15, OH);
582    }
583
584    let mut hsw: f64 = 0.0;
585    let mut hss: f64 = 0.0;
586    let mut p1: f64 = 0.0;
587    let mut hB23: f64 = 0.0;
588    if (T >= T_MIN1) && (T <= T_MAX1) {
589        hsw = T2sat_water(T, OH);
590        hss = T2sat_steam(T, OH);
591    } else if (T > T_MIN3) && (T <= T_MAX3) {
592        p1 = B23_T2p(T);
593        hB23 = pT2h_reg2(p1, T);
594        if T <= TC_WATER {
595            p1 = p_saturation(T);
596            let mut v: f64 = pT2v_sat_reg3(p1, T, 0.0);
597            hsw = Td2h_reg3(T, 1.0 / v);
598            v = pT2v_sat_reg3(p1, T, 1.0);
599            hss = Td2h_reg3(T, 1.0 / v);
600        };
601    };
602
603    // if T is very small , P^ -> h^, h1 > hsat_water(T)
604    if (T >= T_MIN1) && (T < (250.0 + T_MIN1)) && (h > hsw) && (h <= hp100) {
605        return 1;
606    }
607    //  if p>Ps, p^, h--, Hmin,p^,h++, h<hsat_water(T)
608    if (T >= (250.0 + 273.15)) && (T <= T_MAX1) && (h < hsw) && (h <= hp100) {
609        let mut Hmin: f64 = hsw;
610        let mut p11: f64 = p1 + 0.1;
611        let mut Hmid: f64 = pT2h_reg1(p11, T);
612        if Hmid < Hmin {
613            let mut HminFounded: bool = false;
614
615            while !HminFounded {
616                p11 += 0.1;
617                Hmid = pT2h_reg1(p11, T);
618                if Hmid < Hmin {
619                    Hmin = Hmid;
620                } else {
621                    HminFounded = true;
622                }
623            }
624            if h >= Hmin {
625                return 1;
626            } else {
627                return INVALID_VALUE;
628            };
629        } else {
630            return INVALID_VALUE;
631        }
632    };
633
634    if (T >= T_MIN2) && (T <= T_MAX1) && (h > hss) && (h < hpmax2) {
635        return 2;
636    };
637    if (T > T_MAX1) && (T <= T_MAX3) && (h >= hB23) && (h < hpmax2) {
638        return 2;
639    };
640    if (T > T_MIN3) && (T <= TC_WATER) && (((h > hss) && (h < hB23)) || ((h >= hp100) && (h < hsw)))
641        || ((T > TC_WATER) && (T <= T_MAX3) && (h >= hp100) && (h < hB23))
642    {
643        return 3;
644    };
645
646    //  (t,h)
647    if (T >= T_MIN1) && (T <= TC_WATER) && (h >= hsw) && (h <= hss) {
648        return 4;
649    };
650
651    if (T > T_MIN5) && (T <= T_MAX5) && (h >= hpm50) && (h <= hpmax5) {
652        return 5;
653    };
654    INVALID_VALUE
655}
656
657///  Region (t,s)
658pub fn ts_sub_region(t: f64, s: f64) -> i32 {
659    let T: f64 = t + 273.15;
660    if (T < 273.15) || (T > 2273.15) {
661        return INVALID_T;
662    }
663
664    if (s > S_MAX) || (s < S_MIN) {
665        return INVALID_S;
666    }
667
668    let mut spmax2: f64 = 0.0;
669    if (T >= T_MIN2) && (T <= T_MAX2) {
670        spmax2 = pT2s_reg2(P_MIN2, T);
671    }
672
673    let mut spmax5: f64 = 0.0;
674    let mut sp50: f64 = 0.0;
675    if (T >= T_MIN5) && (T <= T_MAX5) {
676        spmax5 = pT2s_reg5(P_MIN5, T);
677        sp50 = pT2s_reg5(50.0, T);
678    }
679    // p=100MPa
680    let mut sp100: f64 = 0.0;
681    if (T >= T_MIN1) && (T <= T_MAX1) {
682        sp100 = pT2s_reg1(100.0, T);
683    }
684
685    if (T > T_MIN3) && (T <= T_MAX3) {
686        sp100 = pT_reg3(100.0, T, OS);
687    }
688
689    if (T > T_MAX3) && (T <= T_MAX2) {
690        sp100 = pT2s_reg2(100.0, T);
691    }
692
693    let mut p1: f64 = 0.0;
694    let mut ssw: f64 = 0.0;
695    let mut sss: f64 = 0.0;
696    let mut sB23: f64 = 0.0;
697    if (T >= T_MIN1) && (T <= T_MAX1) {
698        p1 = p_saturation(T);
699        ssw = pT2s_reg1(p1, T);
700        sss = pT2s_reg2(p1, T);
701    } else if (T > T_MIN3) && (T <= T_MAX3) {
702        p1 = B23_T2p(T);
703        sB23 = pT2s_reg2(p1, T); //
704        if T <= TC_WATER {
705            p1 = p_saturation(T);
706            let mut v: f64 = pT2v_sat_reg3(p1, T, 0.0);
707            ssw = Td2s_reg3(T, 1.0 / v);
708            v = pT2v_sat_reg3(p1, T, 1.0);
709            sss = Td2s_reg3(T, 1.0 / v);
710        };
711    };
712    //
713    if (T >= T_MIN1) && (T <= T_MAX1) && (s < ssw) && (s > sp100) {
714        return 1;
715    };
716    if ((T >= T_MIN2) && (T <= T_MAX1) && (s > sss) && (s < spmax2))
717        || ((T > T_MAX1) && (T <= T_MAX3) && (s >= sB23) && (s < spmax2))
718    {
719        return 2;
720    };
721    if ((T > T_MIN3) && (T <= TC_WATER) && (((s > sss) && (s < sB23)) || ((s >= sp100) && (s < ssw))))
722        || ((T > TC_WATER) && (T <= T_MAX3) && (s >= sp100) && (s < sB23))
723    {
724        return 3;
725    };
726    if (T >= T_MIN1) && (T <= TC_WATER) && (s >= ssw) && (s <= sss) {
727        return 4;
728    };
729    if (T > T_MIN5) && (T <= T_MAX5) && (s >= sp50) && (s <= spmax5) {
730        return 5;
731    };
732    INVALID_VALUE
733}