github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/mcpump.go (about) 1 //This file is part of EESLISM. 2 // 3 //Foobar is free software : you can redistribute itand /or modify 4 //it under the terms of the GNU General Public License as published by 5 //the Free Software Foundation, either version 3 of the License, or 6 //(at your option) any later version. 7 // 8 //Foobar is distributed in the hope that it will be useful, 9 //but WITHOUT ANY WARRANTY; without even the implied warranty of 10 //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the 11 //GNU General Public License for more details. 12 // 13 //You should have received a copy of the GNU General Public License 14 //along with Foobar.If not, see < https://www.gnu.org/licenses/>. 15 16 /* pump.c */ 17 18 /* ポンプ */ 19 20 package eeslism 21 22 import ( 23 "fmt" 24 "io" 25 "math" 26 "os" 27 "strconv" 28 "strings" 29 ) 30 31 /* 機器仕様入力 */ 32 33 func Pumpdata(cattype EqpType, s string, Pumpca *PUMPCA, pfcmp []*PFCMP) int { 34 st := strings.IndexByte(s, '=') 35 var dt float64 36 var id int 37 38 if st == -1 { 39 Pumpca.name = s 40 Pumpca.Type = "" 41 Pumpca.Wo = -999.0 42 Pumpca.Go = -999.0 43 Pumpca.qef = -999.0 44 Pumpca.val = nil 45 46 if cattype == PUMP_TYPE { 47 Pumpca.pftype = PUMP_PF 48 } else if cattype == FAN_TYPE { 49 Pumpca.pftype = FAN_PF 50 } else { 51 Pumpca.pftype = rune(OFF_SW) 52 } 53 } else { 54 s1, s2 := s[:st], s[st+1:] 55 56 if s1 == "type" { 57 Pumpca.Type = s2 58 if Pumpca.Type == "P" { 59 Pumpca.val = make([]float64, 4) 60 } 61 62 for _, pfc := range pfcmp { 63 if Pumpca.pftype == pfc.pftype && Pumpca.Type == pfc.Type { 64 Pumpca.pfcmp = pfc 65 break 66 } 67 } 68 } else { 69 dt, _ = strconv.ParseFloat(s[st+1:], 64) 70 if s == "qef" { 71 Pumpca.qef = dt 72 } else { 73 if Pumpca.Type != "P" { 74 switch s { 75 case "Go": 76 Pumpca.Go = dt 77 case "Wo": 78 Pumpca.Wo = dt 79 default: 80 id = 1 81 } 82 } else { 83 switch s { 84 case "a0": 85 Pumpca.val[0] = dt 86 case "a1": 87 Pumpca.val[1] = dt 88 case "a2": 89 Pumpca.val[2] = dt 90 case "Ic": 91 Pumpca.val[3] = dt 92 default: 93 id = 1 94 } 95 } 96 } 97 } 98 } 99 return id 100 } 101 102 /* --------------------------- */ 103 104 /* 太陽電池ポンプの太陽電池パネルの方位設定 */ 105 106 func Pumpint(Pump []*PUMP, Exs []*EXSF) { 107 for _, p := range Pump { 108 if p.Cat.Type == "P" { 109 p.Sol = nil 110 for j := 0; j < len(Exs); j++ { 111 if p.Cmp.Exsname == Exs[j].Name { 112 p.Sol = Exs[j] 113 break 114 } 115 } 116 if p.Sol == nil { 117 Eprint("Pumpint", p.Cmp.Exsname) 118 } 119 } 120 } 121 } 122 123 /* --------------------------- */ 124 125 // ポンプ流量設定(太陽電池ポンプのみ 126 func (eqsys *EQSYS) Pumpflow() { 127 for i, p := range eqsys.Pump { 128 if p.Cat.Type == "P" { 129 S := p.Sol.Iw 130 131 if DEBUG { 132 fmt.Printf("<Pumpflow> i=%d S=%f Ic=%f a0=%f a1=%e a2=%e\n", 133 i, S, p.Cat.val[3], p.Cat.val[0], 134 p.Cat.val[1], p.Cat.val[2]) 135 } 136 137 if S > p.Cat.val[3] { 138 p.G = p.Cat.val[0] + (p.Cat.val[1]+p.Cat.val[2]*S)*S 139 } else { 140 p.G = -999.0 141 } 142 143 p.E = 0 144 } else { 145 if p.Cmp.Control != OFF_SW { 146 p.G = p.Cat.Go 147 p.E = p.Cat.Wo 148 } else { 149 p.G = -999.0 150 p.E = 0.0 151 } 152 153 if DEBUG { 154 fmt.Printf("<Pumpflow> control=%c G=%f E=%f\n", 155 p.Cmp.Control, p.G, p.E) 156 } 157 } 158 } 159 } 160 161 /* --------------------------- */ 162 163 /* 特性式の係数 */ 164 165 // 166 // +------+ ---> [OUT 1] 空気 or 温水温度 ? 167 // | PUMP | 168 // +------+ ---> [OUT 2] 湿度? (FAN_PFのみ) 169 // 170 func Pumpcfv(Pump []*PUMP) { 171 for _, p := range Pump { 172 if p.Cmp.Control != OFF_SW { 173 Eo1 := p.Cmp.Elouts[0] 174 cG := Spcheat(Eo1.Fluid) * Eo1.G 175 p.CG = cG 176 Eo1.Coeffo = cG 177 p.PLC = PumpFanPLC(Eo1.G/p.G, p) 178 Eo1.Co = p.Cat.qef * p.E * p.PLC 179 Eo1.Coeffin[0] = -cG 180 181 if p.Cat.pftype == FAN_PF { 182 Eo2 := p.Cmp.Elouts[1] 183 Eo2.Coeffo = Eo2.G 184 Eo2.Co = 0.0 185 Eo2.Coeffin[0] = -Eo2.G 186 } 187 } else { 188 p.G = 0.0 189 p.E = 0.0 190 } 191 } 192 } 193 194 // ----------------------------------------- 195 // 196 // ポンプ、ファンの部分負荷特性曲線 197 // 198 199 func PumpFanPLC(XQ float64, Pump *PUMP) float64 { 200 var Buff, dQ float64 201 var i int 202 cat := Pump.Cat 203 204 dQ = math.Min(1.0, math.Max(XQ, 0.25)) 205 206 if cat.pfcmp == nil { 207 Err := fmt.Sprintf("<PumpFanPLC> PFtype=%c type=%s", cat.pftype, cat.Type) 208 Eprint("PUMP oir FAN", string(Err[:])) 209 Buff = 0.0 210 } else { 211 Buff = 0.0 212 213 for i = 0; i < 5; i++ { 214 Buff += cat.pfcmp.dblcoeff[i] * math.Pow(dQ, float64(i)) 215 } 216 } 217 return Buff 218 } 219 220 /* --------------------------- */ 221 222 /* 供給熱量、エネルギーの計算 */ 223 224 func Pumpene(Pump []*PUMP) { 225 for _, p := range Pump { 226 p.Tin = p.Cmp.Elins[0].Sysvin 227 Eo := p.Cmp.Elouts[0] 228 229 if Eo.Control != OFF_SW { 230 p.Q = p.CG * (Eo.Sysv - p.Tin) 231 } else { 232 p.Q = 0.0 233 } 234 } 235 } 236 237 /* --------------------------- */ 238 239 func pumpprint(fo io.Writer, id int, Pump []*PUMP) { 240 var G float64 241 242 switch id { 243 case 0: 244 if len(Pump) > 0 { 245 fmt.Fprintf(fo, "%s %d\n", PUMP_TYPE, len(Pump)) 246 } 247 for _, p := range Pump { 248 fmt.Fprintf(fo, " %s 1 6\n", p.Name) 249 } 250 case 1: 251 for _, p := range Pump { 252 fmt.Fprintf(fo, "%s_c c c %s_Ti t f %s_To t f ", p.Name, p.Name, p.Name) 253 fmt.Fprintf(fo, "%s_Q q f %s_E e f %s_G m f\n", p.Name, p.Name, p.Name) 254 } 255 default: 256 for _, p := range Pump { 257 if p.Cmp.Elouts[0].G > 0.0 && p.Cmp.Elouts[0].Control != OFF_SW { 258 G = p.Cmp.Elouts[0].G 259 } else { 260 G = 0.0 261 } 262 fmt.Fprintf(fo, "%c %4.1f %4.1f %4.0f %4.0f %.5g\n", p.Cmp.Elouts[0].Control, 263 p.Tin, p.Cmp.Elouts[0].Sysv, p.Q, p.E*p.PLC, G) 264 } 265 } 266 } 267 268 /* --------------------------- */ 269 270 /* 日積算値に関する処理 */ 271 272 func pumpdyint(Pump []*PUMP) { 273 for _, p := range Pump { 274 edyint(&p.Qdy) 275 edyint(&p.Edy) 276 edyint(&p.Gdy) 277 } 278 } 279 280 func pumpmonint(Pump []*PUMP) { 281 for _, p := range Pump { 282 edyint(&p.MQdy) 283 edyint(&p.MEdy) 284 edyint(&p.MGdy) 285 } 286 } 287 288 func pumpday(Mon, Day, ttmm int, Pump []*PUMP, Nday, SimDayend int) { 289 Mo := Mon - 1 290 tt := ConvertHour(ttmm) 291 292 for _, p := range Pump { 293 // 日集計 294 edaysum(ttmm, p.Cmp.Elouts[0].Control, p.Q, &p.Qdy) 295 edaysum(ttmm, p.Cmp.Elouts[0].Control, p.E, &p.Edy) 296 edaysum(ttmm, p.Cmp.Elouts[0].Control, p.G, &p.Gdy) 297 298 // 月集計 299 emonsum(Mon, Day, ttmm, p.Cmp.Elouts[0].Control, p.Q, &p.MQdy, Nday, SimDayend) 300 emonsum(Mon, Day, ttmm, p.Cmp.Elouts[0].Control, p.E, &p.MEdy, Nday, SimDayend) 301 emonsum(Mon, Day, ttmm, p.Cmp.Elouts[0].Control, p.G, &p.MGdy, Nday, SimDayend) 302 303 // 月・時刻のクロス集計 304 emtsum(Mon, Day, ttmm, p.Cmp.Elouts[0].Control, p.E, &p.MtEdy[Mo][tt]) 305 } 306 } 307 308 func pumpdyprt(fo io.Writer, id int, Pump []*PUMP) { 309 switch id { 310 case 0: 311 if len(Pump) > 0 { 312 fmt.Fprintf(fo, "%s %d\n", PUMP_TYPE, len(Pump)) 313 } 314 for _, p := range Pump { 315 fmt.Fprintf(fo, " %s 1 12\n", p.Name) 316 } 317 case 1: 318 for _, p := range Pump { 319 fmt.Fprintf(fo, "%s_Hq H d %s_Q Q f %s_tq h d %s_Qm q f\n", 320 p.Name, p.Name, p.Name, p.Name) 321 fmt.Fprintf(fo, "%s_He H d %s_E E f %s_te h d %s_Em e f\n", 322 p.Name, p.Name, p.Name, p.Name) 323 fmt.Fprintf(fo, "%s_Hg H d %s_G M f %s_tg h d %s_Gm m f\n\n", 324 p.Name, p.Name, p.Name, p.Name) 325 } 326 default: 327 for _, p := range Pump { 328 fmt.Fprintf(fo, "%1d %3.1f ", p.Qdy.Hrs, p.Qdy.D) 329 fmt.Fprintf(fo, "%1d %2.0f ", p.Qdy.Mxtime, p.Qdy.Mx) 330 fmt.Fprintf(fo, "%1d %3.1f ", p.Edy.Hrs, p.Edy.D) 331 fmt.Fprintf(fo, "%1d %2.0f ", p.Edy.Mxtime, p.Edy.Mx) 332 fmt.Fprintf(fo, "%1d %3.1f ", p.Gdy.Hrs, p.Gdy.D) 333 fmt.Fprintf(fo, "%1d %2.0f\n", p.Gdy.Mxtime, p.Gdy.Mx) 334 } 335 } 336 } 337 338 func pumpmonprt(fo io.Writer, id int, Pump []*PUMP) { 339 switch id { 340 case 0: 341 if len(Pump) > 0 { 342 fmt.Fprintf(fo, "%s %d\n", PUMP_TYPE, len(Pump)) 343 } 344 for _, p := range Pump { 345 fmt.Fprintf(fo, " %s 1 12\n", p.Name) 346 } 347 case 1: 348 for _, p := range Pump { 349 fmt.Fprintf(fo, "%s_Hq H d %s_Q Q f %s_tq h d %s_Qm q f\n", 350 p.Name, p.Name, p.Name, p.Name) 351 fmt.Fprintf(fo, "%s_He H d %s_E E f %s_te h d %s_Em e f\n", 352 p.Name, p.Name, p.Name, p.Name) 353 fmt.Fprintf(fo, "%s_Hg H d %s_G M f %s_tg h d %s_Gm m f\n\n", 354 p.Name, p.Name, p.Name, p.Name) 355 } 356 default: 357 for _, p := range Pump { 358 fmt.Fprintf(fo, "%1d %3.1f ", p.MQdy.Hrs, p.MQdy.D) 359 fmt.Fprintf(fo, "%1d %2.0f ", p.MQdy.Mxtime, p.MQdy.Mx) 360 fmt.Fprintf(fo, "%1d %3.1f ", p.MEdy.Hrs, p.MEdy.D) 361 fmt.Fprintf(fo, "%1d %2.0f ", p.MEdy.Mxtime, p.MEdy.Mx) 362 fmt.Fprintf(fo, "%1d %3.1f ", p.MGdy.Hrs, p.MGdy.D) 363 fmt.Fprintf(fo, "%1d %2.0f\n", p.MGdy.Mxtime, p.MGdy.Mx) 364 } 365 } 366 } 367 func pumpmtprt(fo io.Writer, id int, Pump []*PUMP, Mo, tt int) { 368 switch id { 369 case 0: 370 if len(Pump) > 0 { 371 fmt.Fprintf(fo, "%s %d\n", PUMP_TYPE, len(Pump)) 372 } 373 for _, p := range Pump { 374 fmt.Fprintf(fo, " %s 1 1\n", p.Name) 375 } 376 case 1: 377 for _, p := range Pump { 378 fmt.Fprintf(fo, "%s_E E f \n", p.Name) 379 } 380 default: 381 for _, p := range Pump { 382 fmt.Fprintf(fo, " %.2f \n", p.MtEdy[Mo-1][tt-1].D*Cff_kWh) 383 } 384 } 385 } 386 387 func NewPFCMP() *PFCMP { 388 Pfcmp := new(PFCMP) 389 Pfcmp.pftype = ' ' 390 Pfcmp.Type = "" 391 matinit(Pfcmp.dblcoeff[:], 5) 392 return Pfcmp 393 } 394 395 func PFcmpdata() []*PFCMP { 396 var s string 397 var c byte 398 var i int 399 400 fl, err := os.Open("pumpfanlst.efl") 401 if err != nil { 402 Eprint(" file ", "pumpfanlst.efl") 403 } 404 Pfcmp := make([]*PFCMP, 0) 405 406 for { 407 _, err := fmt.Fscanf(fl, "%s", &s) 408 if err != nil || s[0] == '*' { 409 break 410 } 411 412 if s == "!" { 413 for { 414 _, err = fmt.Fscanf(fl, "%c", &c) 415 if err != nil || c == '\n' { 416 break 417 } 418 } 419 } else { 420 pfcmp := NewPFCMP() 421 422 if s == string(PUMP_TYPE) { 423 pfcmp.pftype = PUMP_PF 424 } else if s == string(FAN_TYPE) { 425 pfcmp.pftype = FAN_PF 426 } else { 427 Eprint("<pumpfanlst.efl>", s) 428 } 429 430 _, err = fmt.Fscanf(fl, "%s", &s) 431 if err != nil { 432 break 433 } 434 435 pfcmp.Type = s 436 437 i = 0 438 for { 439 _, err = fmt.Fscanf(fl, "%s", &s) 440 if err != nil || s[0] == ';' { 441 break 442 } 443 444 var err error 445 pfcmp.dblcoeff[i], err = strconv.ParseFloat(s, 64) 446 if err != nil { 447 panic(err) 448 } 449 i++ 450 } 451 452 Pfcmp = append(Pfcmp, pfcmp) 453 } 454 } 455 456 fl.Close() 457 458 return Pfcmp 459 }