github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/blhelm.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 /* helm.c */ 17 18 package eeslism 19 20 import ( 21 "fmt" 22 "io" 23 ) 24 25 /* 要素別熱損失・熱取得(記憶域確保) */ 26 27 func Helminit(errkey string, helmkey rune, _Room []*ROOM, Qetotal *QETOTAL) { 28 var Nmax, k int 29 30 if helmkey != 'y' { 31 for i := range _Room { 32 Room := _Room[i] 33 Room.rmqe = nil 34 } 35 return 36 } 37 38 for i := range _Room { 39 Room := _Room[i] 40 41 Room.rmqe = &RMQELM{} 42 43 if Room.rmqe != nil { 44 Rq := Room.rmqe 45 Rq.rmsb = nil 46 Rq.WSCwk = nil 47 } 48 49 N := Room.N 50 if N > 0 { 51 Room.rmqe.rmsb = make([]*RMSB, N) 52 } 53 54 if Room.rmqe.rmsb != nil { 55 for k = 0; k < N; k++ { 56 Rs := Room.rmqe.rmsb[k] 57 Rs.Told = nil 58 Rs.Tw = nil 59 } 60 } 61 62 for j := 0; j < Room.N; j++ { 63 Sd := Room.rsrf[j] 64 Rs := Room.rmqe.rmsb[j] 65 66 if Sd.mw != nil { 67 N := Sd.mw.M 68 if N > 0 { 69 Rs.Tw = make([]*BHELM, N) 70 Rs.Told = make([]*BHELM, N) 71 } 72 } else { 73 Rs.Tw = nil 74 Rs.Told = nil 75 } 76 77 switch Sd.ble { 78 case BLE_ExternalWall, BLE_Roof, BLE_Floor, BLE_Window: 79 if Sd.typ != RMSRFType_E && Sd.typ != RMSRFType_e { 80 Rs.Type = RMSBType_E 81 } else { 82 Rs.Type = RMSBType_G 83 } 84 break 85 case BLE_InnerWall, BLE_InnerFloor, BLE_Ceil, BLE_d: 86 Rs.Type = RMSBType_i 87 break 88 } 89 } 90 if Room.N > Nmax { 91 Nmax = Room.N 92 } 93 } 94 95 for i := range _Room { 96 Room := _Room[i] 97 if i == 0 { 98 if Nmax > 0 { 99 Room.rmqe.WSCwk = make([]*BHELM, Nmax) 100 101 Bh := Room.rmqe.WSCwk[0] 102 Bh.trs = 0.0 103 Bh.so = 0.0 104 Bh.sg = 0.0 105 Bh.rn = 0.0 106 Bh.in = 0.0 107 Bh.pnl = 0.0 108 } 109 } else { 110 Room.rmqe.WSCwk = _Room[0].rmqe.WSCwk 111 } 112 } 113 Qetotal.Name = "Qetotal" 114 } 115 116 /* ----------------------------------------------------- */ 117 118 // 要素別熱損失・熱取得(計算) 119 // 入力値: 120 // 外気温度 Ta [C] 121 // 絶対湿度 xa [kg/kg] 122 func Helmroom(Room []*ROOM, Qrm []*QRM, Qetotal *QETOTAL, Ta, xa float64) { 123 qelmclear(&Qetotal.Qelm) 124 125 for i := range Room { 126 Rm := Room[i] 127 Qr := Qrm[i] 128 qe := &Rm.rmqe.qelm 129 130 helmrmsrt(Rm, Ta) 131 helmq(Room, Ta, xa) 132 133 qe.slo = Qr.Solo 134 qe.slw = Qr.Solw 135 qe.asl = Qr.Asl 136 qe.tsol = Qr.Tsol 137 qe.hins = Qr.Hgins 138 139 qelmsum(qe, &Qetotal.Qelm) 140 } 141 142 for i := range Room { 143 Rm := Room[i] 144 helmwall(Rm, Ta) 145 } 146 } 147 148 /* ----------------------------------------------------- */ 149 150 /* 要素別熱損失・熱取得(時刻別出力) */ 151 152 var __Helmprint_id int = 0 153 154 func Helmprint(fo io.Writer, mrk string, Simc *SIMCONTL, mon, day int, time float64, 155 Room []*ROOM, Qetotal *QETOTAL) { 156 var j int 157 158 if __Helmprint_id == 0 { 159 ttlprint(fo, mrk, Simc) 160 161 for j = 0; j < 2; j++ { 162 if j == 0 { 163 fmt.Fprintf(fo, "-cat\n") 164 } 165 helmrmprint(fo, __Helmprint_id, Room, Qetotal) 166 if j == 0 { 167 fmt.Fprintf(fo, "*\n#\n") 168 } 169 __Helmprint_id++ 170 } 171 } 172 173 fmt.Fprintf(fo, "%02d %02d %5.2f\n", mon, day, time) 174 helmrmprint(fo, __Helmprint_id, Room, Qetotal) 175 } 176 177 /* ----------------------------------------------------- */ 178 179 func helmrmprint(fo io.Writer, id int, _Room []*ROOM, Qetotal *QETOTAL) { 180 var q *BHELM 181 var qh *QHELM 182 var name string 183 184 Nroom := len(_Room) 185 186 switch id { 187 case 0: 188 if Nroom > 0 { 189 fmt.Fprintf(fo, "%s %d\n", ROOM_TYPE, Nroom+1) 190 } 191 192 for i := 0; i < Nroom; i++ { 193 Room := _Room[i] 194 if Room.rmqe != nil { 195 fmt.Fprintf(fo, "%s 1 %d\n", Room.Name, 29) 196 } 197 } 198 fmt.Fprintf(fo, "%s 1 %d\n", Qetotal.Name, 29) 199 break 200 201 case 1: 202 for i := 0; i < Nroom+1; i++ { 203 if i < Nroom { 204 name = _Room[i].Name 205 } else { 206 name = Qetotal.Name 207 } 208 209 fmt.Fprintf(fo, "%s_qldh q f %s_qldc q f ", name, name) 210 fmt.Fprintf(fo, "%s_slo q f %s_slw q f %s_asl q f %s_tsol q f %s_hins q f\n", 211 name, name, name, name, name) 212 fmt.Fprintf(fo, "%s_so q f %s_sw q f %s_rn q f %s_in q f %s_pnl q f\n", 213 name, name, name, name, name) 214 fmt.Fprintf(fo, "%s_trs q f %s_qew q f %s_qwn q f %s_qgd q f %s_qnx q f ", 215 name, name, name, name, name) 216 fmt.Fprintf(fo, "%s_qi q f %s_qc q f %s_qf q f\n", 217 name, name, name) 218 fmt.Fprintf(fo, "%s_vo q f %s_vr q f %s_sto q f\n", name, name, name) 219 fmt.Fprintf(fo, "%s_qldhl q f %s_qldcl q f %s_hinl q f\n", name, name, name) 220 fmt.Fprintf(fo, "%s_vol q f %s_vrl q f %s_stol q f\n", name, name, name) 221 } 222 break 223 224 default: 225 for i := 0; i < Nroom+1; i++ { 226 if i < Nroom { 227 Room := _Room[i] 228 q = &(Room.rmqe.qelm.qe) 229 qh = &Room.rmqe.qelm 230 231 fmt.Fprintf(fo, "%3.0f %3.0f ", qh.loadh, qh.loadc) 232 fmt.Fprintf(fo, "%3.0f %3.0f %3.0f %3.0f %3.0f ", 233 qh.slo, qh.slw, qh.asl, qh.tsol, qh.hins) 234 235 fmt.Fprintf(fo, "%3.0f %3.0f %3.0f %3.0f %3.0f ", 236 q.so, q.sg, q.rn, q.in, q.pnl) 237 fmt.Fprintf(fo, "%3.0f %3.0f %3.0f %3.0f %3.0f ", 238 q.trs, qh.ew, qh.wn, qh.gd, qh.nx) 239 fmt.Fprintf(fo, "%3.0f %3.0f %3.0f %3.0f %3.0f %3.0f ", 240 qh.i, qh.c, qh.f, qh.vo, qh.vr, qh.sto) 241 fmt.Fprintf(fo, "%3.0f %3.0f %3.0f %3.0f %3.0f %3.0f\n", 242 qh.loadhl, qh.loadcl, qh.hinl, qh.vol, qh.vrl, qh.stol) 243 } else { 244 q = &Qetotal.Qelm.qe 245 qh = &Qetotal.Qelm 246 fmt.Fprintf(fo, "%3.0f %3.0f ", qh.loadh, qh.loadc) 247 fmt.Fprintf(fo, "%3.0f %3.0f %3.0f %3.0f %3.0f ", 248 qh.slo, qh.slw, qh.asl, qh.tsol, qh.hins) 249 250 fmt.Fprintf(fo, "%3.0f %3.0f %3.0f %3.0f %3.0f ", 251 q.so, q.sg, q.rn, q.in, q.pnl) 252 fmt.Fprintf(fo, "%3.0f %3.0f %3.0f %3.0f %3.0f ", 253 q.trs, qh.ew, qh.wn, qh.gd, qh.nx) 254 fmt.Fprintf(fo, "%3.0f %3.0f %3.0f %3.0f %3.0f %3.0f ", 255 qh.i, qh.c, qh.f, qh.vo, qh.vr, qh.sto) 256 fmt.Fprintf(fo, "%3.0f %3.0f %3.0f %3.0f %3.0f %3.0f\n", 257 qh.loadhl, qh.loadcl, qh.hinl, qh.vol, qh.vrl, qh.stol) 258 } 259 } 260 break 261 } 262 } 263 264 /* ----------------------------------------------------- */ 265 266 /* 要素別熱損失・熱取得(時刻別出力) */ 267 268 var __Helmsurfprint_id int = 0 269 270 func Helmsurfprint(fo io.Writer, mrk string, Simc *SIMCONTL, mon, day int, time float64, Room []*ROOM) { 271 var j int 272 273 if __Helmsurfprint_id == 0 { 274 ttlprint(fo, mrk, Simc) 275 276 for j = 0; j < 2; j++ { 277 if j == 0 { 278 fmt.Fprintf(fo, "-cat\n") 279 } 280 helmsfprint(fo, __Helmsurfprint_id, Room) 281 if j == 0 { 282 fmt.Fprintf(fo, "*\n#\n") 283 } 284 __Helmsurfprint_id++ 285 } 286 } 287 288 fmt.Fprintf(fo, "%02d %02d %5.2f\n", mon, day, time) 289 helmsfprint(fo, __Helmsurfprint_id, Room) 290 } 291 292 /* ----------------------------------------------------- */ 293 294 func helmsfprint(fo io.Writer, id int, _Room []*ROOM) { 295 switch id { 296 case 0: 297 if len(_Room) > 0 { 298 fmt.Fprintf(fo, "%s %d\n", ROOM_TYPE, len(_Room)) 299 } 300 301 for i := range _Room { 302 Room := _Room[i] 303 Nsf := 0 304 for j := 0; j < Room.N; j++ { 305 Sd := Room.rsrf[j] 306 if Sd.sfepri { 307 Nsf++ 308 } 309 } 310 fmt.Fprintf(fo, "%s 1 %d\n", Room.Name, 6*Nsf) 311 312 } 313 break 314 315 case 1: 316 for i := range _Room { 317 Room := _Room[i] 318 for j := 0; j < Room.N; j++ { 319 Sd := Room.rsrf[j] 320 if Sd.sfepri { 321 var s string 322 if len(Sd.Name) == 0 { 323 s = fmt.Sprintf(s, "%s-%d-%c", Room.Name, j, Sd.ble) 324 } else { 325 s = fmt.Sprintf(s, "%s-%s", Room.Name, Sd.Name) 326 } 327 328 fmt.Fprintf(fo, "%s_trs t f %s_so f %s_sg t f ", s, s, s) 329 fmt.Fprintf(fo, "%s_rn t f %s_in t f %s_pnl t f\n", s, s, s) 330 } 331 } 332 } 333 break 334 335 default: 336 for i := range _Room { 337 Room := _Room[i] 338 for j := 0; j < Room.N; j++ { 339 Sd := Room.rsrf[j] 340 rmsb := Room.rmqe.rmsb[j] 341 if Sd.sfepri { 342 Ts := &rmsb.Ts 343 fmt.Fprintf(fo, "%5.2f %5.2f %5.2f ", Ts.trs, Ts.so, Ts.sg) 344 fmt.Fprintf(fo, "%5.2f %5.2f %5.2f\n", Ts.rn, Ts.in, Ts.pnl) 345 } 346 } 347 348 } 349 break 350 } 351 } 352 353 /* ----------------------------------------------------- */ 354 355 /* 要素別熱損失・熱取得(日積算値) */ 356 357 var __Helmdy_oldday int = -1 358 359 func Helmdy(day int, Room []*ROOM, Qetotal *QETOTAL) { 360 if day != __Helmdy_oldday { 361 helmdyint(Room, Qetotal) 362 __Helmdy_oldday = day 363 } 364 365 for i := range Room { 366 rmq := Room[i].rmqe 367 368 if rmq != nil { 369 qelmsum(&rmq.qelm, &rmq.qelmdy) 370 } 371 } 372 373 qelmsum(&Qetotal.Qelm, &Qetotal.Qelmdy) 374 } 375 376 /* ----------------------------------------------------- */ 377 378 func helmdyint(Room []*ROOM, Qetotal *QETOTAL) { 379 for i := range Room { 380 if Room[i].rmqe != nil { 381 qelmclear(&Room[i].rmqe.qelmdy) 382 } 383 } 384 385 qelmclear(&Qetotal.Qelmdy) 386 } 387 388 /* ----------------------------------------------------- */ 389 390 /* 要素別熱損失・熱取得(日積算値出力) */ 391 392 var __Helmdyprint_id int 393 394 func Helmdyprint(fo io.Writer, mrk string, Simc *SIMCONTL, mon, day int, Room []*ROOM, Qetotal *QETOTAL) { 395 var j int 396 397 if __Helmdyprint_id == 0 { 398 ttldyprint(fo, mrk, Simc) 399 400 for j = 0; j < 2; j++ { 401 if j == 0 { 402 fmt.Fprintf(fo, "-cat\n") 403 } 404 helmrmdyprint(fo, __Helmdyprint_id, Room, Qetotal) 405 if j == 0 { 406 fmt.Fprintf(fo, "*\n#\n") 407 } 408 __Helmdyprint_id++ 409 } 410 } 411 412 fmt.Fprintf(fo, "%02d %02d\n", mon, day) 413 helmrmdyprint(fo, __Helmdyprint_id, Room, Qetotal) 414 } 415 416 /* ----------------------------------------------------- */ 417 418 func helmrmdyprint(fo io.Writer, id int, _Room []*ROOM, Qetotal *QETOTAL) { 419 var i int 420 var q *BHELM 421 var qh *QHELM 422 423 Nroom := len(_Room) 424 425 switch id { 426 case 0: 427 if Nroom > 0 { 428 fmt.Fprintf(fo, "%s %d\n", ROOM_TYPE, Nroom+1) 429 } 430 431 for i = 0; i < Nroom; i++ { 432 Room := _Room[i] 433 if Room.rmqe != nil { 434 fmt.Fprintf(fo, "%s 1 %d\n", Room.Name, 29) 435 } 436 } 437 fmt.Fprintf(fo, "%s 1 %d\n", Qetotal.Name, 29) 438 break 439 440 case 1: 441 for i = 0; i < Nroom+1; i++ { 442 var name string 443 if i < Nroom { 444 Room := _Room[i] 445 name = Room.Name 446 } else { 447 name = Qetotal.Name 448 } 449 450 fmt.Fprintf(fo, "%s_qldh Q f %s_qldc Q f ", name, name) 451 fmt.Fprintf(fo, "%s_slo Q f %s_slw Q f %s_asl Q f %s_tsol Q f %s_hins Q f\n", 452 name, name, name, name, name) 453 fmt.Fprintf(fo, "%s_so Q f %s_sw Q f %s_rn Q f %s_in Q f %s_pnl Q f\n", 454 name, name, name, name, name) 455 fmt.Fprintf(fo, "%s_trs Q f %s_qew Q f %s_qwn Q f %s_qgd Q f %s_qnx Q f ", 456 name, name, name, name, name) 457 fmt.Fprintf(fo, "%s_qi Q f %s_qc Q f %s_qf Q f\n", 458 name, name, name) 459 fmt.Fprintf(fo, "%s_qvo Q f %s_qvr Q f %s_sto Q f\n", name, name, name) 460 fmt.Fprintf(fo, "%s_qldhl Q f %s_qldcl Q f %s_hinl Q f\n", name, name, name) 461 fmt.Fprintf(fo, "%s_vol Q f %s_vrl Q f %s_stol Q f\n", name, name, name) 462 } 463 break 464 465 default: 466 for i = 0; i < Nroom+1; i++ { 467 if i < Nroom { 468 Room := _Room[i] 469 q = &Room.rmqe.qelmdy.qe 470 qh = &Room.rmqe.qelmdy 471 fmt.Fprintf(fo, "%3.1f %3.1f ", 472 qh.loadh*Cff_kWh, qh.loadc*Cff_kWh) 473 fmt.Fprintf(fo, "%3.1f %3.1f %3.1f %3.1f %3.1f ", 474 qh.slo*Cff_kWh, qh.slw*Cff_kWh, qh.asl*Cff_kWh, 475 qh.tsol*Cff_kWh, qh.hins*Cff_kWh) 476 fmt.Fprintf(fo, "%3.1f %3.1f %3.1f %3.1f %3.1f ", 477 q.so*Cff_kWh, q.sg*Cff_kWh, q.rn*Cff_kWh, 478 q.in*Cff_kWh, q.pnl*Cff_kWh) 479 fmt.Fprintf(fo, "%3.1f %3.1f %3.1f %3.1f %3.1f ", 480 q.trs*Cff_kWh, qh.ew*Cff_kWh, 481 qh.wn*Cff_kWh, qh.gd*Cff_kWh, qh.nx*Cff_kWh) 482 fmt.Fprintf(fo, "%3.1f %3.1f %3.1f %3.1f %3.1f %3.1f ", 483 qh.i*Cff_kWh, qh.c*Cff_kWh, qh.f*Cff_kWh, 484 qh.vo*Cff_kWh, qh.vr*Cff_kWh, qh.sto*Cff_kWh) 485 fmt.Fprintf(fo, "%3.1f %3.1f %3.1f %3.1f %3.1f %3.1f\n", 486 qh.loadhl*Cff_kWh, qh.loadcl*Cff_kWh, qh.hinl*Cff_kWh, 487 qh.vol*Cff_kWh, qh.vrl*Cff_kWh, qh.stol*Cff_kWh) 488 } else { 489 q = &Qetotal.Qelmdy.qe 490 qh = &Qetotal.Qelmdy 491 fmt.Fprintf(fo, "%3.1f %3.1f ", 492 qh.loadh*Cff_kWh, qh.loadc*Cff_kWh) 493 fmt.Fprintf(fo, "%3.1f %3.1f %3.1f %3.1f %3.1f ", 494 qh.slo*Cff_kWh, qh.slw*Cff_kWh, qh.asl*Cff_kWh, 495 qh.tsol*Cff_kWh, qh.hins*Cff_kWh) 496 497 fmt.Fprintf(fo, "%3.1f %3.1f %3.1f %3.1f %3.1f ", 498 q.so*Cff_kWh, q.sg*Cff_kWh, q.rn*Cff_kWh, 499 q.in*Cff_kWh, q.pnl*Cff_kWh) 500 fmt.Fprintf(fo, "%3.1f %3.1f %3.1f %3.1f %3.1f ", 501 q.trs*Cff_kWh, qh.ew*Cff_kWh, 502 qh.wn*Cff_kWh, qh.gd*Cff_kWh, qh.nx*Cff_kWh) 503 fmt.Fprintf(fo, "%3.1f %3.1f %3.1f %3.1f %3.1f %3.1f ", 504 qh.i*Cff_kWh, qh.c*Cff_kWh, qh.f*Cff_kWh, 505 qh.vo*Cff_kWh, qh.vr*Cff_kWh, qh.sto*Cff_kWh) 506 fmt.Fprintf(fo, "%3.1f %3.1f %3.1f %3.1f %3.1f %3.1f\n", 507 qh.loadhl*Cff_kWh, qh.loadcl*Cff_kWh, qh.hinl*Cff_kWh, 508 qh.vol*Cff_kWh, qh.vrl*Cff_kWh, qh.stol*Cff_kWh) 509 } 510 } 511 break 512 } 513 } 514 515 /* ----------------------------------------------------- */