github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/blhelmlib.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 /* helmlib.c */ 17 18 package eeslism 19 20 import "fmt" 21 22 // 外乱要素別表面温度の計算 23 // 入力値: 24 // 外気温度 Ta [C] 25 func helmrmsrt(Room *ROOM, Ta float64) { 26 if Room.rmqe == nil { 27 return 28 } 29 30 for i := 0; i < Room.N; i++ { 31 Sd := Room.rsrf[i] 32 Rmsb := Room.rmqe.rmsb[i] 33 WSC := Room.rmqe.WSCwk[i] 34 35 helmclear(WSC) 36 37 if Mw := Sd.mw; Mw != nil { 38 helmsumpd(Mw.M, Mw.UX, Rmsb.Told, WSC) 39 } 40 WSC.trs += Sd.FI * (Sd.alic / Sd.ali) * Room.Tr 41 42 if Sd.rpnl != nil { 43 Twmp := Sd.mw.Tw[Sd.mw.mp] 44 WSC.pnl += Sd.FP * (Sd.rpnl.Tpi - Twmp) 45 WSC.trs += Sd.FP * Twmp 46 } 47 48 switch Rmsb.Type { 49 case RMSBType_E: // 外気に接する壁 50 WSC.trs += Sd.FO * Ta 51 WSC.rn += Sd.FO * Sd.TeErn 52 if Sd.ble == BLE_ExternalWall { 53 WSC.so += Sd.FO * Sd.TeEsol 54 } else if Sd.ble == BLE_Window { 55 WSC.sg += Sd.FO * Sd.TeEsol 56 } 57 case RMSBType_G: // 地盤に接する壁 58 WSC.trs += Sd.FO * Sd.Te 59 case RMSBType_i: // 内壁 60 WSC.trs += Sd.FO * Sd.nextroom.Trold 61 } 62 63 WSC.sg += Sd.FI * Sd.RSsol / Sd.ali 64 WSC.in += Sd.FI * Sd.RSin / Sd.ali 65 } 66 67 for i := 0; i < Room.N; i++ { 68 Rmsb := Room.rmqe.rmsb[i] 69 XA := Room.XA[Room.N*i : Room.N*(i+1)] 70 Ts := &Rmsb.Ts 71 helmclear(Ts) 72 helmsumpd(Room.N, XA, Room.rmqe.WSCwk, Ts) 73 } 74 } 75 76 /* ---------------------------------------------- */ 77 78 /* 壁体内温度 */ 79 // 入力値: 80 // 外気温度 Ta [C] 81 func helmwall(Room *ROOM, Ta float64) { 82 if Room.rmqe == nil { 83 return 84 } 85 86 for i := 0; i < Room.N; i++ { 87 alr := Room.alr[Room.N*i : Room.N*(i+1)] 88 Sd := Room.rsrf[i] 89 rmsb := Room.rmqe.rmsb[i] 90 91 if Mw := Sd.mw; Mw != nil { 92 var Tie, Te, Tpe BHELM 93 var Tm BHELM 94 95 helmclear(&Tie) 96 helmclear(&Te) 97 helmclear(&Tpe) 98 99 helmwlsft(i, Room.N, alr, Room.rmqe.rmsb, &Tm) 100 101 helmsumpf(1, Sd.alir, &Tm, &Tie) 102 103 Tie.trs += Sd.alic * Room.Tr 104 105 if Sd.rpnl != nil { 106 Twp := Mw.Tw 107 Twmp := Twp[Mw.mp] 108 Tpe.pnl = Sd.rpnl.Tpi - Twmp 109 Tpe.trs = Twmp 110 } 111 112 switch rmsb.Type { 113 case 'E': // 外気に接する壁 114 Te.trs = Ta 115 Te.so = Sd.TeEsol 116 Te.rn = Sd.TeErn 117 case 'G': // 地盤に接する壁 118 Te.trs = Sd.Te 119 case 'i': // 内壁 120 Te.trs = Sd.nextroom.Trold 121 } 122 123 Tie.sg += Sd.RSsol 124 Tie.in += Sd.RSin 125 helmdiv(&Tie, Sd.ali) 126 127 helmwlt(Mw.M, Mw.mp, Mw.UX, Mw.uo, Mw.um, Mw.Pc, []*BHELM{&Tie}, []*BHELM{&Te}, []*BHELM{&Tpe}, rmsb.Told, rmsb.Tw) 128 129 for m := 0; m < Mw.M; m++ { 130 Told := rmsb.Told[m] 131 Tw := rmsb.Tw[m] 132 helmcpy(Tw, Told) 133 } 134 } 135 } 136 } 137 138 /* ---------------------------------------------- */ 139 140 /* 面 i についての平均表面温度 */ 141 142 func helmwlsft(i, N int, alr []float64, rmsb []*RMSB, Tm *BHELM) { 143 Ralr := alr[i] 144 145 helmclear(Tm) 146 147 for j := 0; j < N; j++ { 148 if j != i { 149 helmsumpf(1, alr[0], &rmsb[j].Ts, Tm) 150 } 151 } 152 153 helmdiv(Tm, Ralr) 154 } 155 156 /* ---------------------------------------------- */ 157 158 func helmwlt(M, mp int, UX []float64, uo, um, Pc float64, Tie, Te, Tpe, Told, Tw []*BHELM) { 159 helmsumpd(1, []float64{uo}, Tie, Told[0]) 160 helmsumpd(1, []float64{um}, Te, Told[M-1]) 161 162 if Pc > 0.0 { 163 helmsumpd(1, []float64{Pc}, Tpe, Told[mp]) 164 } 165 166 for m := 0; m < M; m++ { 167 helmclear(Tw[m]) 168 helmsumpd(M, UX, Told, Tw[m]) 169 UX = UX[M:] 170 } 171 } 172 173 /* ---------------------------------------------- */ 174 175 /* 要素別熱損失・熱取得 */ 176 177 // 入力値: 178 // 外気温度 Ta [C] 179 // 絶対湿度 xa [kg/kg] 180 func helmq(_Room []*ROOM, Ta, xa float64) { 181 var q, Ts *BHELM 182 var qh *QHELM 183 var Sd *RMSRF 184 var rmsb *RMSB 185 var achr *ACHIR 186 var Aalc, qloss float64 187 188 Room := _Room[0] 189 190 qelmclear(&Room.rmqe.qelm) 191 q = &Room.rmqe.qelm.qe 192 qh = &Room.rmqe.qelm 193 194 qh.loadh = 0.0 195 qh.loadc = 0.0 196 qh.loadcl = 0.0 197 qh.loadhl = 0.0 198 if Room.rmld != nil { 199 if Room.rmld.Qs > 0.0 { 200 qh.loadh = Room.rmld.Qs 201 } else { 202 qh.loadc = Room.rmld.Qs 203 } 204 205 if Room.rmld.Ql > 0.0 { 206 qh.loadhl = Room.rmld.Ql 207 } else { 208 qh.loadcl = Room.rmld.Ql 209 } 210 } 211 212 for i := 0; i < Room.N; i++ { 213 Sd = Room.rsrf[i] 214 rmsb = Room.rmqe.rmsb[i] 215 216 Aalc = Sd.A * Sd.alic 217 Ts = &rmsb.Ts 218 qloss = Aalc * (Room.Tr - Ts.trs) 219 q.trs -= qloss 220 221 if rmsb.Type == RMSBType_E { 222 if Sd.ble == BLE_ExternalWall { 223 qh.ew -= qloss 224 } else if Sd.ble == BLE_Window { 225 qh.wn -= qloss 226 } 227 } else if rmsb.Type == RMSBType_G { 228 qh.gd -= qloss 229 } else if rmsb.Type == RMSBType_i { 230 qh.nx -= qloss 231 } 232 233 if Sd.ble == BLE_Ceil || Sd.ble == BLE_Roof { 234 qh.c -= qloss 235 } else if Sd.ble == BLE_InnerFloor || Sd.ble == BLE_Floor { 236 qh.f -= qloss 237 } else if Sd.ble == BLE_InnerWall || Sd.ble == BLE_d { 238 qh.i -= qloss 239 } 240 241 q.so += Aalc * Ts.so 242 q.sg += Aalc * Ts.sg 243 q.rn += Aalc * Ts.rn 244 q.in += Aalc * Ts.in 245 q.pnl += Aalc * Ts.pnl 246 } 247 248 q.in += Room.Hc + Room.Lc + Room.Ac 249 250 qh.hinl = Room.AL + Room.HL 251 252 qh.sto = Room.MRM * (Room.Trold - Room.Tr) / DTM 253 qh.stol = Room.GRM * Ro * (Room.xrold - Room.xr) / DTM 254 qh.vo = Ca * Room.Gvent * (Ta - Room.Tr) 255 qh.vol = Ro * Room.Gvent * (xa - Room.xr) 256 257 qh.vr = 0.0 258 qh.vrl = 0.0 259 for j := 0; j < Room.Nachr; j++ { 260 achr = Room.achr[j] 261 qh.vr += Ca * achr.Gvr * (_Room[achr.rm].Tr - Room.Tr) 262 qh.vrl += Ro * achr.Gvr * (_Room[achr.rm].xr - Room.xr) 263 } 264 } 265 266 /* ---------------------------------------------- */ 267 268 // Reset q to zero 269 func qelmclear(q *QHELM) { 270 helmclear(&q.qe) 271 q.slo = 0.0 272 q.slw = 0.0 273 q.asl = 0.0 274 q.tsol = 0.0 275 q.hins = 0.0 276 q.nx = 0.0 277 q.gd = 0.0 278 q.ew = 0.0 279 q.wn = 0.0 280 q.i = 0.0 281 q.c = 0.0 282 q.f = 0.0 283 q.vo = 0.0 284 q.vr = 0.0 285 q.sto = 0.0 286 q.loadh = 0.0 287 q.loadc = 0.0 288 q.hinl = 0.0 289 q.vol = 0.0 290 q.vrl = 0.0 291 q.stol = 0.0 292 q.loadcl = 0.0 293 q.loadhl = 0.0 294 } 295 296 /* ---------------------------------------------- */ 297 298 // Add a to b 299 func qelmsum(a, b *QHELM) { 300 helmsum(&a.qe, &b.qe) 301 302 b.slo += a.slo 303 b.slw += a.slw 304 b.asl += a.asl 305 b.tsol += a.tsol 306 b.hins += a.hins 307 308 b.nx += a.nx 309 b.gd += a.gd 310 b.ew += a.ew 311 b.wn += a.wn 312 313 b.i += a.i 314 b.c += a.c 315 b.f += a.f 316 b.vo += a.vo 317 b.vr += a.vr 318 b.sto += a.sto 319 b.loadh += a.loadh 320 b.loadc += a.loadc 321 322 b.hinl += a.hinl 323 b.vol += a.vol 324 b.stol += a.stol 325 b.vrl += a.vrl 326 b.loadcl += a.loadcl 327 b.loadhl += a.loadhl 328 } 329 330 /* ---------------------------------------------- */ 331 332 // Reset b to zero 333 func helmclear(b *BHELM) { 334 b.trs = 0.0 335 b.so = 0.0 336 b.sg = 0.0 337 b.rn = 0.0 338 b.in = 0.0 339 b.pnl = 0.0 340 } 341 342 /* ---------------------------------------------- */ 343 344 // Mutiply a by u(vector) and add to b 345 func helmsumpd(N int, u []float64, a []*BHELM, b *BHELM) { 346 for i := 0; i < N; i++ { 347 b.trs += u[i] * a[i].trs 348 b.so += u[i] * a[i].so 349 b.sg += u[i] * a[i].sg 350 b.rn += u[i] * a[i].rn 351 b.in += u[i] * a[i].in 352 b.pnl += u[i] * a[i].pnl 353 } 354 } 355 356 /* ---------------------------------------------- */ 357 358 // Mutiply a by u(scalar) and add to b 359 func helmsumpf(N int, u float64, a *BHELM, b *BHELM) { 360 if N != 1 { 361 panic("N != 1") 362 } 363 364 b.trs += u * a.trs 365 b.so += u * a.so 366 b.sg += u * a.sg 367 b.rn += u * a.rn 368 b.in += u * a.in 369 b.pnl += u * a.pnl 370 } 371 372 /* ---------------------------------------------- */ 373 374 // Divide a by c 375 func helmdiv(a *BHELM, c float64) { 376 a.trs /= c 377 a.so /= c 378 a.sg /= c 379 a.rn /= c 380 a.in /= c 381 a.pnl /= c 382 } 383 384 /* ---------------------------------------------- */ 385 386 // Add a to b 387 func helmsum(a, b *BHELM) { 388 b.trs += a.trs 389 b.so += a.so 390 b.sg += a.sg 391 b.rn += a.rn 392 b.in += a.in 393 b.pnl += a.pnl 394 } 395 396 /* ---------------------------------------------- */ 397 398 // Copy a to b 399 func helmcpy(a, b *BHELM) { 400 b.trs = a.trs 401 b.so = a.so 402 b.sg = a.sg 403 b.rn = a.rn 404 b.in = a.in 405 b.pnl = a.pnl 406 } 407 408 /* ========================================== */ 409 410 func helmxxprint(s string, a *BHELM) { 411 fmt.Printf("xxx helmprint xxx %s trs so sg rn in pnl\n", s) 412 fmt.Printf("%6.2f %6.2f %6.2f %6.2f %6.2f %6.2f\n", a.trs, a.so, a.sg, a.rn, a.in, a.pnl) 413 }