github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/mcrefas.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 /* refas.c */ 17 18 package eeslism 19 20 import ( 21 "errors" 22 "fmt" 23 "io" 24 "os" 25 "strconv" 26 "strings" 27 ) 28 29 /* 圧縮式冷凍機 30 31 機器仕様入力 */ 32 var __Refadata_hpch *HPCH 33 34 func Refadata(s string, Refaca *REFACA, Rfcmp []*RFCMP) int { 35 var c ControlSWType 36 var dt float64 37 var id int 38 39 if !strings.ContainsAny(s, "=-") { 40 // イコールとハイフンが含まれていない場合の処理 41 Refaca.name = s 42 Refaca.Nmode = 0 43 Refaca.unlimcap = 'n' 44 Refaca.cool = nil 45 Refaca.heat = nil 46 Refaca.awtyp = ' ' 47 Refaca.plf = ' ' 48 Refaca.rfc = nil 49 Refaca.Ph = -999.0 50 } else { 51 if s[0] == 'a' { 52 Refaca.awtyp = rune(s[1]) 53 } else if strings.Compare(s, "-U") == 0 { 54 Refaca.unlimcap = 'y' 55 } else if s[0] == 'c' { 56 var i int 57 Nrfcmp := len(Rfcmp) 58 for i = 0; i < Nrfcmp; i++ { 59 rfc := Rfcmp[i] 60 if strings.Compare(s[1:], rfc.cname) == 0 { 61 Refaca.rfc = rfc 62 break 63 } 64 } 65 if i == Nrfcmp { 66 id = 1 67 } 68 } else if s[0] == 'p' { 69 Refaca.plf = rune(s[1]) 70 } else if s[0] == 'm' { 71 c = ControlSWType(s[1]) 72 Refaca.mode[Refaca.Nmode] = c 73 if c == COOLING_SW { 74 Refaca.cool = new(HPCH) 75 __Refadata_hpch = Refaca.cool 76 } else if c == HEATING_SW { 77 Refaca.heat = new(HPCH) 78 __Refadata_hpch = Refaca.heat 79 } 80 Refaca.Nmode++ 81 } else { 82 dt, _ = strconv.ParseFloat(s[1:], 64) 83 switch { 84 case strings.HasPrefix(s, "Qo"): 85 __Refadata_hpch.Qo = dt 86 case strings.HasPrefix(s, "Go"): 87 __Refadata_hpch.Go = dt 88 case strings.HasPrefix(s, "Two"): 89 __Refadata_hpch.Two = dt 90 case strings.HasPrefix(s, "eo"): 91 __Refadata_hpch.eo = dt 92 case strings.HasPrefix(s, "Qex"): 93 __Refadata_hpch.Qex = dt 94 case strings.HasPrefix(s, "Gex"): 95 __Refadata_hpch.Gex = dt 96 case strings.HasPrefix(s, "Tex"): 97 __Refadata_hpch.Tex = dt 98 case strings.HasPrefix(s, "eex"): 99 __Refadata_hpch.eex = dt 100 case s[0] == 'W': 101 __Refadata_hpch.Wo = dt 102 case strings.HasPrefix(s, "Ph"): 103 Refaca.Ph = dt 104 default: 105 id = 1 106 } 107 } 108 } 109 return id 110 } 111 112 /* -------------------------------------------- */ 113 114 /* 冷凍機/ヒ-トポンプの圧縮機特性設定 */ 115 116 func Refaint(Refa []*REFA, Wd *WDAT, Compnt []*COMPNT) { 117 var Cmp *RFCMP 118 var Teo, Tco, cGex, Qeo, Qco float64 119 var Qes, Qcs, Ws, ke, kc, kw, E float64 120 var i int 121 122 for _, refa := range Refa { 123 refa.Ta = &Wd.T 124 125 if refa.Cat.awtyp != 'a' { 126 fmt.Printf("Refcfi awtyp=%c\n", refa.Cat.awtyp) 127 } 128 if refa.Cmp.Roomname != "" { 129 refa.Room = roomptr(refa.Cmp.Roomname, Compnt) 130 fmt.Printf("RefaRoom=%s\n", refa.Cmp.Roomname) 131 } 132 133 for m := 0; m < refa.Cat.Nmode; m++ { 134 if refa.Cat.mode[m] == COOLING_SW { 135 cGex = Ca * refa.Cat.cool.Gex 136 E = (1.0 - refa.Cat.cool.eo) / refa.Cat.cool.eo 137 Qeo = refa.Cat.cool.Qo 138 Qco = refa.Cat.cool.Qex 139 Teo = Qeo*E/(Cw*refa.Cat.cool.Go) + refa.Cat.cool.Two 140 Tco = Qco/(refa.Cat.cool.eex*cGex) + refa.Cat.cool.Tex 141 } else if refa.Cat.mode[m] == HEATING_SW { 142 cGex = Ca * refa.Cat.heat.Gex 143 E = (1.0 - refa.Cat.heat.eo) / refa.Cat.heat.eo 144 Qeo = refa.Cat.heat.Qex 145 Qco = refa.Cat.heat.Qo 146 Tco = Qco*E/(Cw*refa.Cat.heat.Go) + refa.Cat.heat.Two 147 Teo = Qeo/(refa.Cat.heat.eex*cGex) + refa.Cat.heat.Tex 148 } 149 150 Cmp = refa.Cat.rfc 151 Qes = Cmp.e[0] + Cmp.e[1]*Teo + Cmp.e[2]*Tco + Cmp.e[3]*Teo*Tco 152 Qcs = Cmp.d[0] + Cmp.d[1]*Teo + Cmp.d[2]*Tco + Cmp.d[3]*Teo*Tco 153 Ws = Cmp.w[0] + Cmp.w[1]*Teo + Cmp.w[2]*Tco + Cmp.w[3]*Teo*Tco 154 ke = Qeo / Qes 155 kc = Qco / Qcs 156 if refa.Cat.mode[m] == COOLING_SW { 157 kw = refa.Cat.cool.Wo / Ws 158 } else if refa.Cat.mode[m] == HEATING_SW { 159 kw = refa.Cat.heat.Wo / Ws 160 } 161 162 if refa.Cat.mode[m] == COOLING_SW { 163 for i = 0; i < 4; i++ { 164 refa.c_e[i] = ke * Cmp.e[i] 165 refa.c_d[i] = kc * Cmp.d[i] 166 refa.c_w[i] = kw * Cmp.w[i] 167 } 168 } else if refa.Cat.mode[m] == HEATING_SW { 169 for i = 0; i < 4; i++ { 170 refa.h_e[i] = ke * Cmp.e[i] 171 refa.h_d[i] = kc * Cmp.d[i] 172 refa.h_w[i] = kw * Cmp.w[i] 173 } 174 } 175 } 176 if refa.Cat.Nmode == 1 { 177 refa.Chmode = refa.Cat.mode[0] 178 } 179 } 180 } 181 182 /* -------------------------------------------- */ 183 184 /* 冷凍機/ヒ-トポンプのシステム方程式の係数 */ 185 186 // 187 // +------+ 188 // [IN 1] ---> | REFA | --> [OUT 1] 189 // +------+ 190 // 191 func Refacfv(Refa []*REFA) { 192 for _, refa := range Refa { 193 if refa.Cmp.Control != OFF_SW { 194 Eo1 := refa.Cmp.Elouts[0] 195 196 cG := Spcheat(Eo1.Fluid) * Eo1.G 197 refa.cG = cG 198 Eo1.Coeffo = cG 199 200 if Eo1.Control != OFF_SW { 201 if Eo1.Sysld == 'y' { 202 Eo1.Co = 0.0 203 Eo1.Coeffin[0] = -cG 204 } else { 205 var err int 206 refacoeff(refa, &err) 207 if err == 0 { 208 Eo1.Co = refa.Do 209 Eo1.Coeffin[0] = refa.D1 - cG 210 } else { 211 s := fmt.Sprintf("xxxxx refacoeff xxx stop xx %s chmode=%c monitor=%s", 212 refa.Name, refa.Chmode, refa.Cmp.Elouts[0].Emonitr.Cmp.Name) 213 Eprint("<Refacfv>", s) 214 os.Exit(EXIT_REFA) 215 } 216 } 217 } 218 } 219 } 220 } 221 222 /* ------------------------------------------------------------- */ 223 224 /* 冷凍機/ヒ-トポンプの能力特性一次式の係数 */ 225 226 func refacoeff(Refa *REFA, err *int) { 227 var E, EGex, Px float64 228 *err = 0 229 230 if Refa.Chmode == COOLING_SW { 231 if Refa.Cat.cool != nil { 232 EGex = Refa.Cat.cool.eex * Ca * Refa.Cat.cool.Gex 233 Compca(&Refa.c_e, &Refa.c_d, EGex, Refa.Cat.rfc.Teo, *Refa.Ta, &Refa.Ho, &Refa.He) 234 E = Refa.cG * Refa.Cat.cool.eo 235 } else { 236 *err = 1 237 } 238 } else if Refa.Chmode == HEATING_SW { 239 if Refa.Cat.heat != nil { 240 EGex = Refa.Cat.heat.eex * Ca * Refa.Cat.heat.Gex 241 Compha(&Refa.h_e, &Refa.h_d, EGex, Refa.Cat.rfc.Tco, *Refa.Ta, &Refa.Ho, &Refa.He) 242 E = Refa.cG * Refa.Cat.heat.eo 243 } else { 244 *err = 1 245 } 246 } 247 248 if *err == 0 { 249 Px = E / (E + Refa.He) 250 Refa.Do = Refa.Ho * Px 251 Refa.D1 = Refa.He * Px 252 } else { 253 Refa.Do = 0.0 254 Refa.D1 = 0.0 255 } 256 } 257 258 /* ------------------------------------------------------------- */ 259 260 // 冷却熱量/加熱量、エネルギーの計算 261 func Refaene(Refa []*REFA, LDreset *int) { 262 var err, reset int 263 var Emax float64 264 var Eo *ELOUT 265 266 for i, refa := range Refa { 267 refa.Tin = refa.Cmp.Elins[0].Sysvin 268 Eo = refa.Cmp.Elouts[0] 269 refa.E = 0.0 270 271 if Eo.Control != OFF_SW { 272 refa.Ph = refa.Cat.Ph 273 refa.Q = refa.cG * (Eo.Sysv - refa.Tin) 274 275 if Eo.Sysld == 'n' { 276 refa.Qmax = refa.Q 277 278 if refa.Cat.Nmode > 0 { 279 refa.E = Refpow(refa, refa.Q) / refa.Cat.rfc.Meff 280 } 281 282 } else { 283 reset = chswreset(refa.Q, refa.Chmode, Eo) 284 285 if reset != 0 { 286 (*LDreset)++ 287 refa.Cmp.Control = OFF_SW 288 } else { 289 if refa.Cat.Nmode > 0 { 290 refacoeff(refa, &err) 291 292 if err == 0 { 293 refa.Qmax = refa.Do - refa.D1*refa.Tin 294 Emax = Refpow(refa, refa.Qmax) / refa.Cat.rfc.Meff 295 refa.E = (refa.Q / refa.Qmax) * Emax 296 297 if refa.Cat.unlimcap == 'n' { 298 reset = maxcapreset(refa.Q, refa.Qmax, refa.Chmode, Eo) 299 } 300 if reset != 0 { 301 Refacfv(Refa[i : i+1]) 302 (*LDreset)++ 303 } 304 } 305 } else { 306 refa.Qmax = refa.Q 307 } 308 309 } 310 } 311 } else { 312 refa.Q = 0.0 313 refa.Ph = 0.0 314 } 315 } 316 } 317 318 func Refaene2(Refa []*REFA) { 319 for _, refa := range Refa { 320 if refa.Room != nil { 321 refa.Room.Qeqp += (refa.Q * refa.Cmp.Eqpeff) 322 } 323 } 324 } 325 326 /* ------------------------------------------------------------- */ 327 328 /* 負荷計算指定時の設定値のポインター */ 329 330 func refaldptr(load *ControlSWType, key []string, Refa *REFA) (VPTR, error) { 331 var err error 332 var vptr VPTR 333 334 if key[1] == "Tout" { 335 vptr.Ptr = &Refa.Toset 336 vptr.Type = VAL_CTYPE 337 Refa.Load = load 338 } else { 339 err = errors.New("Tout expected") 340 } 341 return vptr, err 342 } 343 344 /* ------------------------------------------------------------- */ 345 346 /* 冷暖運転切換のポインター */ 347 348 func refaswptr(key []string, Refa *REFA) (VPTR, error) { 349 if key[1] == "chmode" { 350 return VPTR{ 351 Ptr: &Refa.Chmode, 352 Type: SW_CTYPE, 353 }, nil 354 } 355 356 return VPTR{}, errors.New("refaswptr error") 357 } 358 359 /* --------------------------- */ 360 361 /* 負荷計算指定時のスケジュール設定 */ 362 363 func refaldschd(Refa *REFA) { 364 Eo := Refa.Cmp.Elouts[0] 365 366 if Refa.Load != nil { 367 if Eo.Control != OFF_SW { 368 if Refa.Toset > TEMPLIMIT { 369 Eo.Control = LOAD_SW 370 Eo.Sysv = Refa.Toset 371 } else { 372 Eo.Control = OFF_SW 373 } 374 } 375 } 376 } 377 378 /* --------------------------- */ 379 380 func refaprint(fo io.Writer, id int, Refa []*REFA) { 381 switch id { 382 case 0: 383 if len(Refa) > 0 { 384 fmt.Fprintf(fo, "%s %d\n", REFACOMP_TYPE, len(Refa)) 385 } 386 for _, refa := range Refa { 387 fmt.Fprintf(fo, " %s 1 7\n", refa.Name) 388 } 389 case 1: 390 for _, refa := range Refa { 391 fmt.Fprintf(fo, "%s_c c c %s_G m f %s_Ti t f %s_To t f ", 392 refa.Name, refa.Name, refa.Name, refa.Name) 393 fmt.Fprintf(fo, "%s_Q q f %s_E e f %s_P e f\n", 394 refa.Name, refa.Name, refa.Name) 395 } 396 default: 397 for _, refa := range Refa { 398 fmt.Fprintf(fo, "%c %6.4g %4.1f %4.1f %3.0f %3.0f %2.0f\n", 399 refa.Cmp.Elouts[0].Control, refa.Cmp.Elouts[0].G, refa.Tin, 400 refa.Cmp.Elouts[0].Sysv, refa.Q, refa.E, refa.Ph) 401 } 402 } 403 } 404 405 /* --------------------------- */ 406 407 /* 日積算値に関する処理 */ 408 409 func refadyint(Refa []*REFA) { 410 for _, refa := range Refa { 411 svdyint(&refa.Tidy) 412 qdyint(&refa.Qdy) 413 edyint(&refa.Edy) 414 edyint(&refa.Phdy) 415 } 416 } 417 418 func refamonint(Refa []*REFA) { 419 for _, refa := range Refa { 420 svdyint(&refa.mTidy) 421 qdyint(&refa.mQdy) 422 edyint(&refa.mEdy) 423 edyint(&refa.mPhdy) 424 } 425 } 426 427 func refaday(Mon int, Day int, ttmm int, Refa []*REFA, Nday int, SimDayend int) { 428 Mo := Mon - 1 429 tt := ConvertHour(ttmm) 430 for _, refa := range Refa { 431 432 // 日集計 433 svdaysum(int64(ttmm), refa.Cmp.Control, refa.Tin, &refa.Tidy) 434 qdaysum(int64(ttmm), refa.Cmp.Control, refa.Q, &refa.Qdy) 435 edaysum(ttmm, refa.Cmp.Control, refa.E, &refa.Edy) 436 edaysum(ttmm, refa.Cmp.Control, refa.Ph, &refa.Phdy) 437 438 // 月集計 439 svmonsum(Mon, Day, ttmm, refa.Cmp.Control, refa.Tin, &refa.mTidy, Nday, SimDayend) 440 qmonsum(Mon, Day, ttmm, refa.Cmp.Control, refa.Q, &refa.mQdy, Nday, SimDayend) 441 emonsum(Mon, Day, ttmm, refa.Cmp.Control, refa.E, &refa.mEdy, Nday, SimDayend) 442 emonsum(Mon, Day, ttmm, refa.Cmp.Control, refa.Ph, &refa.mPhdy, Nday, SimDayend) 443 444 // 月・時刻のクロス集計 445 emtsum(Mon, Day, ttmm, refa.Cmp.Control, refa.E, &refa.mtEdy[Mo][tt]) 446 emtsum(Mon, Day, ttmm, refa.Cmp.Control, refa.E, &refa.mtPhdy[Mo][tt]) 447 } 448 } 449 450 func refadyprt(fo io.Writer, id int, Refa []*REFA) { 451 switch id { 452 case 0: 453 if len(Refa) > 0 { 454 fmt.Fprintf(fo, "%s %d\n", REFACOMP_TYPE, len(Refa)) 455 } 456 for _, refa := range Refa { 457 fmt.Fprintf(fo, " %s 1 22\n", refa.Name) 458 } 459 case 1: 460 for _, refa := range Refa { 461 fmt.Fprintf(fo, "%s_Ht H d %s_T T f ", refa.Name, refa.Name) 462 fmt.Fprintf(fo, "%s_ttn h d %s_Tn t f %s_ttm h d %s_Tm t f\n", 463 refa.Name, refa.Name, refa.Name, refa.Name) 464 fmt.Fprintf(fo, "%s_Hh H d %s_Qh Q f %s_Hc H d %s_Qc Q f\n", 465 refa.Name, refa.Name, refa.Name, refa.Name) 466 fmt.Fprintf(fo, "%s_th h d %s_qh q f %s_tc h d %s_qc q f\n", 467 refa.Name, refa.Name, refa.Name, refa.Name) 468 fmt.Fprintf(fo, "%s_He H d %s_E E f %s_te h d %s_Em e f\n", 469 refa.Name, refa.Name, refa.Name, refa.Name) 470 fmt.Fprintf(fo, "%s_Hp H d %s_P E f %s_tp h d %s_Pm e f\n\n", 471 refa.Name, refa.Name, refa.Name, refa.Name) 472 } 473 default: 474 for _, refa := range Refa { 475 fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ", 476 refa.Tidy.Hrs, refa.Tidy.M, 477 refa.Tidy.Mntime, refa.Tidy.Mn, 478 refa.Tidy.Mxtime, refa.Tidy.Mx) 479 480 fmt.Fprintf(fo, "%1d %3.1f ", refa.Qdy.Hhr, refa.Qdy.H) 481 fmt.Fprintf(fo, "%1d %3.1f ", refa.Qdy.Chr, refa.Qdy.C) 482 fmt.Fprintf(fo, "%1d %2.0f ", refa.Qdy.Hmxtime, refa.Qdy.Hmx) 483 fmt.Fprintf(fo, "%1d %2.0f ", refa.Qdy.Cmxtime, refa.Qdy.Cmx) 484 485 fmt.Fprintf(fo, "%1d %3.1f ", refa.Edy.Hrs, refa.Edy.D) 486 fmt.Fprintf(fo, "%1d %2.0f ", refa.Edy.Mxtime, refa.Edy.Mx) 487 488 fmt.Fprintf(fo, "%1d %3.1f ", refa.Phdy.Hrs, refa.Phdy.D) 489 fmt.Fprintf(fo, "%1d %2.0f\n", refa.Phdy.Mxtime, refa.Phdy.Mx) 490 } 491 } 492 } 493 494 func refamonprt(fo io.Writer, id int, Refa []*REFA) { 495 switch id { 496 case 0: 497 if len(Refa) > 0 { 498 fmt.Fprintf(fo, "%s %d\n", REFACOMP_TYPE, len(Refa)) 499 } 500 for _, refa := range Refa { 501 fmt.Fprintf(fo, " %s 1 22\n", refa.Name) 502 } 503 case 1: 504 for _, refa := range Refa { 505 fmt.Fprintf(fo, "%s_Ht H d %s_T T f ", refa.Name, refa.Name) 506 fmt.Fprintf(fo, "%s_ttn h d %s_Tn t f %s_ttm h d %s_Tm t f\n", 507 refa.Name, refa.Name, refa.Name, refa.Name) 508 fmt.Fprintf(fo, "%s_Hh H d %s_Qh Q f %s_Hc H d %s_Qc Q f\n", 509 refa.Name, refa.Name, refa.Name, refa.Name) 510 fmt.Fprintf(fo, "%s_th h d %s_qh q f %s_tc h d %s_qc q f\n", 511 refa.Name, refa.Name, refa.Name, refa.Name) 512 fmt.Fprintf(fo, "%s_He H d %s_E E f %s_te h d %s_Em e f\n", 513 refa.Name, refa.Name, refa.Name, refa.Name) 514 fmt.Fprintf(fo, "%s_Hp H d %s_P E f %s_tp h d %s_Pm e f\n\n", 515 refa.Name, refa.Name, refa.Name, refa.Name) 516 } 517 default: 518 for _, refa := range Refa { 519 fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ", 520 refa.mTidy.Hrs, refa.mTidy.M, 521 refa.mTidy.Mntime, refa.mTidy.Mn, 522 refa.mTidy.Mxtime, refa.mTidy.Mx) 523 524 fmt.Fprintf(fo, "%1d %3.1f ", refa.mQdy.Hhr, refa.mQdy.H) 525 fmt.Fprintf(fo, "%1d %3.1f ", refa.mQdy.Chr, refa.mQdy.C) 526 fmt.Fprintf(fo, "%1d %2.0f ", refa.mQdy.Hmxtime, refa.mQdy.Hmx) 527 fmt.Fprintf(fo, "%1d %2.0f ", refa.mQdy.Cmxtime, refa.mQdy.Cmx) 528 529 fmt.Fprintf(fo, "%1d %3.1f ", refa.mEdy.Hrs, refa.mEdy.D) 530 fmt.Fprintf(fo, "%1d %2.0f ", refa.mEdy.Mxtime, refa.mEdy.Mx) 531 532 fmt.Fprintf(fo, "%1d %3.1f ", refa.mPhdy.Hrs, refa.mPhdy.D) 533 fmt.Fprintf(fo, "%1d %2.0f\n", refa.mPhdy.Mxtime, refa.mPhdy.Mx) 534 } 535 } 536 } 537 538 func refamtprt(fo io.Writer, id int, Refa []*REFA, Mo int, tt int) { 539 switch id { 540 case 0: 541 if len(Refa) > 0 { 542 fmt.Fprintf(fo, "%s %d\n", REFACOMP_TYPE, len(Refa)) 543 } 544 for _, refa := range Refa { 545 fmt.Fprintf(fo, " %s 1 2\n", refa.Name) 546 } 547 case 1: 548 for _, refa := range Refa { 549 fmt.Fprintf(fo, "%s_E E f %s_Ph E f \n", refa.Name, refa.Name) 550 } 551 default: 552 for _, refa := range Refa { 553 fmt.Fprintf(fo, " %.2f %.2f\n", refa.mtEdy[Mo-1][tt-1].D*Cff_kWh, refa.mtPhdy[Mo-1][tt-1].D*Cff_kWh) 554 } 555 } 556 }