github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/mcdesiccant.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 /* mcdessicant.C */ 17 /* バッチ式デシカント空調機 */ 18 19 package eeslism 20 21 import ( 22 "errors" 23 "fmt" 24 "io" 25 "strconv" 26 "strings" 27 ) 28 29 /* ------------------------------------------ */ 30 31 // 要素方程式の変数のためのメモリの割り当て 32 func Desielm(Desi []*DESI) { 33 for _, desi := range Desi { 34 Eot := desi.Cmp.Elouts[0] // 空気温度出口 35 Eox := desi.Cmp.Elouts[1] // 空気湿度出口 36 37 elin := Eot.Elins[1] 38 elin.Upo = Eox.Elins[0].Upo // 出口空気温度の要素方程式の2つめの変数は絶対湿度 39 elin.Upv = Eox.Elins[0].Upo 40 41 elin = Eox.Elins[1] 42 elin.Upo = Eot.Elins[0].Upo // 出口絶対湿度の要素方程式の2つめの変数は空気温度 43 elin.Upv = Eot.Elins[0].Upo // 空気温度の要素方程式の2つ目の変数(空気入口温度)のupo、upvに空気湿度をつなげる 44 } 45 } 46 47 /* 機器仕様入力 */ 48 49 /*---- Satoh追加 2013/10/20 ----*/ 50 func Desiccantdata(s string, desica *DESICA) int { 51 st := strings.Index(s, "=") 52 var dt float64 53 var id int 54 55 if st == -1 { 56 desica.name = s 57 desica.r = -999.0 58 desica.rows = -999.0 59 desica.Uad = -999.0 60 desica.A = -999.0 61 desica.Vm = 18.0 62 desica.eps = 0.4764 63 desica.P0 = 0.4 64 desica.kp = 0.0012 65 desica.cps = 710.0 66 desica.ms = -999.0 67 } else { 68 st++ 69 dt, _ = strconv.ParseFloat(s[st:], 64) 70 71 switch { 72 case s == "Uad": // シリカゲル槽壁面の熱貫流率[W/m2K] 73 desica.Uad = dt 74 case s == "A": // シリカゲル槽表面積[m2] 75 desica.A = dt 76 case s == "ms": // シリカゲル質量[g] 77 desica.ms = dt 78 case s == "r": // シリカゲル平均直径[cm] 79 desica.r = dt 80 case s == "rows": // シリカゲル充填密度[g/cm3] 81 desica.rows = dt 82 default: 83 id = 1 84 } 85 } 86 return id 87 } 88 89 /* --------------------------- */ 90 91 /* 管長・ダクト長、周囲温度設定 */ 92 93 func Desiint(Desi []*DESI, Simc *SIMCONTL, Compnt []*COMPNT, Wd *WDAT) { 94 var Err string 95 var Desica *DESICA 96 97 for _, desi := range Desi { 98 99 if desi.Cmp.Envname != "" { 100 desi.Tenv = envptr(desi.Cmp.Envname, Simc, Compnt, Wd, nil) 101 } else { 102 desi.Room = roomptr(desi.Cmp.Roomname, Compnt) 103 } 104 105 Desica = desi.Cat 106 107 if Desica.Uad < 0.0 { 108 Err = fmt.Sprintf("Name=%s Uad=%.4g", Desica.name, Desica.Uad) 109 Eprint("Desiint", Err) 110 } 111 if Desica.A < 0.0 { 112 Err = fmt.Sprintf("Name=%s A=%.4g", Desica.name, Desica.A) 113 Eprint("Desiint", Err) 114 } 115 if Desica.r < 0.0 { 116 Err = fmt.Sprintf("Name=%s r=%.4g", Desica.name, Desica.r) 117 Eprint("Desiint", Err) 118 } 119 if Desica.rows < 0.0 { 120 Err = fmt.Sprintf("Name=%s rows=%.4g", Desica.name, Desica.rows) 121 Eprint("Desiint", Err) 122 } 123 if Desica.ms < 0.0 { 124 Err = fmt.Sprintf("Name=%s ms=%.4g", Desica.name, Desica.ms) 125 Eprint("Desiint", Err) 126 } 127 128 // 初期温度、出入口温度の初期化 129 desi.Tsold = 20.0 130 desi.Xsold = FNXtr(desi.Tsold, 50.0) 131 desi.Tain = desi.Tsold 132 desi.Taout = desi.Tsold 133 desi.Xain = desi.Xsold 134 desi.Xaout = desi.Xsold 135 136 // デシカント槽熱損失係数の計算 137 desi.UA = Desica.Uad * Desica.A 138 139 // 吸湿量の初期化 140 desi.Pold = Desica.P0 141 142 // シリカゲルと槽内空気の熱伝達面積[m2] 143 desi.Asa = 3.0 * Desica.ms * 1000.0 * (1.0 - Desica.eps) / (1.0e4 * (Desica.r / 10.0) * Desica.rows) 144 145 // 逆行列 146 desi.UX = make([]float64, 5*5) 147 desi.UXC = make([]float64, 5) 148 } 149 } 150 151 /* --------------------------- */ 152 153 /* 特性式の係数 */ 154 155 // 156 // 温度 [IN 1] --> +------+ --> [OUT 1] 出口温度 157 // | DESI | 158 // 湿度 [IN 2] --> +------+ --> [OUT 2] 出口湿度 159 // 160 func Desicfv(Desi []*DESI) { 161 var Eo1 *ELOUT 162 var h, i, j float64 163 var Te, hsa, hsad, hAsa, hdAsa float64 164 var Desica *DESICA 165 var U, C, Cmat []float64 166 167 N := 5 168 N2 := N * N 169 for _, desi := range Desi { 170 Desica = desi.Cat 171 172 // 係数行列のメモリ確保 173 U = make([]float64, N2) 174 // 定数行列のメモリ確保 175 C = make([]float64, N) 176 177 if desi.Cmp.Envname != "" { 178 Te = *desi.Tenv 179 } else { 180 Te = desi.Room.Tot 181 } 182 183 Eo1 = desi.Cmp.Elouts[0] 184 // 熱容量流量の計算 185 desi.CG = Spcheat(Eo1.Fluid) * Eo1.G 186 187 // シリカゲルと槽内空気の対流熱伝達率の計算 188 if Eo1.Cmp.Control == OFF_SW { 189 hsa = 4.614 190 } else { 191 hsa = 40.0 192 } 193 194 // シリカゲルと槽内空気の湿気伝達率の計算 195 hsad = hsa / Ca 196 197 hAsa = hsa * desi.Asa 198 hdAsa = hsad * desi.Asa 199 200 if desi.Pold >= 0.25 { 201 h = 0.001319 202 i = 0.103335 203 j = -0.05416 204 } else { 205 h = 0.001158 206 i = 0.149479 207 j = -0.05835 208 } 209 210 // 定数行列Cの作成 211 Cmat = C 212 Cmat[0] = Desica.ms * Desica.cps / DTM * desi.Tsold 213 Cmat[1] = desi.UA * Te 214 Cmat[3] = Desica.ms / DTM * desi.Pold 215 Cmat[4] = -j 216 217 // 係数行列の作成 218 U[0*N+0] = Desica.ms*Desica.cps/DTM + hAsa 219 U[0*N+1] = -hAsa 220 U[0*N+2] = -hdAsa * Ro 221 U[0*N+3] = hdAsa * Ro 222 U[1*N+0] = -hAsa 223 U[1*N+1] = Ca*Eo1.G + hAsa + desi.UA 224 U[2*N+2] = Eo1.G + hdAsa 225 U[2*N+3] = -hdAsa 226 U[3*N+2] = -hdAsa 227 U[3*N+3] = hdAsa 228 U[3*N+4] = Desica.ms / DTM 229 U[4*N+0] = h 230 U[4*N+3] = -1.0 231 U[4*N+4] = i 232 233 // 逆行列の計算 234 Matinv(U, N, N, "<Desicfv U>") 235 236 // 行列のコピー 237 matinit(desi.UX, N2) 238 matcpy(U, desi.UX, N2) 239 240 // {UXC}=[UX]*{C}の作成 241 matinit(desi.UXC, N) 242 for ii := 0; ii < N; ii++ { 243 for jj := 0; jj < N; jj++ { 244 desi.UXC[ii] += desi.UX[ii*N+jj] * C[jj] 245 } 246 } 247 248 // 出口温度の要素方程式 249 Eo1.Coeffo = -1.0 250 Eo1.Co = -desi.UXC[1] 251 Eo1.Coeffin[0] = desi.UX[1*N+1] * Eo1.G * Ca 252 Eo1.Coeffin[1] = desi.UX[1*N+2] * Eo1.G 253 254 // 出口湿度の要素方程式 255 Eo2 := desi.Cmp.Elouts[1] 256 Eo2.Coeffo = -1.0 257 Eo2.Co = -desi.UXC[2] 258 Eo2.Coeffin[0] = desi.UX[2*N+2] * Eo2.G 259 Eo2.Coeffin[1] = desi.UX[2*N+1] * Eo2.G * Ca 260 } 261 } 262 263 ///* --------------------------- */ 264 // 265 ///* 取得熱量の計算 */ 266 // 267 func Desiene(Desi []*DESI) { 268 Sin := make([]float64, 5) 269 S := make([]float64, 5) 270 271 N := 5 272 //N2 := N * N 273 for _, desi := range Desi { 274 matinit(Sin, N) 275 matinit(S, N) 276 elo := desi.Cmp.Elouts[0] 277 elox := desi.Cmp.Elouts[1] 278 elix := elo.Elins[1] 279 desi.Tain = elo.Elins[0].Sysvin 280 desi.Xain = elix.Sysvin 281 282 var Te float64 283 if desi.Cmp.Envname != "" { 284 Te = *desi.Tenv 285 } else { 286 Te = desi.Room.Tot 287 } 288 289 desi.Taout = elo.Sysv 290 desi.Xaout = elox.Sysv 291 292 // 入口状態行列Sinの作成 293 Sin[1] = Ca * elo.G * desi.Tain 294 Sin[2] = elo.G * desi.Xain 295 // 内部状態値の計算 296 for ii := 0; ii < N; ii++ { 297 for jj := 0; jj < N; jj++ { 298 S[ii] += desi.UX[ii*N+jj] * Sin[jj] 299 } 300 S[ii] += desi.UXC[ii] 301 } 302 // 変数への格納 303 desi.Tsold = S[0] 304 desi.Ta = S[1] 305 desi.Xa = S[2] 306 desi.Xsold = S[3] 307 desi.Pold = S[4] 308 desi.RHold = FNRhtx(desi.Tsold, desi.Xsold) 309 310 // 顕熱の計算 311 desi.Qs = desi.CG * (desi.Taout - desi.Tain) 312 desi.Ql = elo.G * Ro * (desi.Xaout - desi.Xain) 313 desi.Qt = desi.Qs + desi.Ql 314 315 // デシカント槽からの熱損失の計算 316 desi.Qloss = desi.UA * (Te - desi.Ta) 317 318 // 設置室内部発熱の計算 319 if desi.Room != nil { 320 desi.Room.Qeqp += (-desi.Qloss) 321 } 322 } 323 } 324 325 // 制御で使用する内部変数 326 func Desivptr(key []string, Desi *DESI) (VPTR, error) { 327 var err error 328 var vptr VPTR 329 330 switch key[1] { 331 case "Ts": 332 vptr.Ptr = &Desi.Tsold 333 vptr.Type = VAL_CTYPE 334 case "xs": 335 vptr.Ptr = &Desi.Xsold 336 vptr.Type = VAL_CTYPE 337 case "RH": 338 vptr.Ptr = &Desi.RHold 339 vptr.Type = VAL_CTYPE 340 default: 341 err = errors.New("'Ts', 'xs' or 'RH' is expected") 342 } 343 344 return vptr, err 345 } 346 347 ///* ---------------------------*/ 348 // 349 func Desiprint(fo io.Writer, id int, Desi []*DESI) { 350 switch id { 351 case 0: 352 if len(Desi) > 0 { 353 fmt.Fprintf(fo, "%s %d\n", DESI_TYPE, len(Desi)) 354 } 355 for _, desi := range Desi { 356 fmt.Fprintf(fo, " %s 1 14\n", desi.Name) 357 } 358 case 1: 359 for _, desi := range Desi { 360 fmt.Fprintf(fo, "%s_c c c %s_G m f %s_Ts t f %s_Ti t f %s_To t f %s_Qs q f ", desi.Name, desi.Name, desi.Name, desi.Name, desi.Name, desi.Name) 361 fmt.Fprintf(fo, "%s_xs x f %s_RHs r f %s_xi x f %s_xo x f %s_Ql q f %s_Qt q f ", desi.Name, desi.Name, desi.Name, desi.Name, desi.Name, desi.Name) 362 fmt.Fprintf(fo, "%s_Qls q f %s_P m f\n", desi.Name, desi.Name) 363 } 364 default: 365 for _, desi := range Desi { 366 fmt.Fprintf(fo, "%c %6.4g %4.1f %4.1f %4.1f %2.0f ", desi.Cmp.Elouts[0].Control, desi.Cmp.Elouts[0].G, desi.Tsold, desi.Tain, desi.Taout, desi.Qs) 367 fmt.Fprintf(fo, "%.3f %.0f %.3f %.3f %2.0f %2.0f ", desi.Xsold, desi.RHold, desi.Xain, desi.Xaout, desi.Ql, desi.Qt) 368 fmt.Fprintf(fo, "%.0f %.3f\n", desi.Qloss, desi.Pold) 369 } 370 } 371 } 372 373 ///* --------------------------- */ 374 // 375 ///* 日積算値に関する処理 */ 376 // 377 ///*******************/ 378 func Desidyint(Desi []*DESI) { 379 for _, desi := range Desi { 380 svdyint(&desi.Tidy) 381 svdyint(&desi.Tsdy) 382 svdyint(&desi.Tody) 383 svdyint(&desi.xidy) 384 svdyint(&desi.xsdy) 385 svdyint(&desi.xody) 386 qdyint(&desi.Qsdy) 387 qdyint(&desi.Qldy) 388 qdyint(&desi.Qtdy) 389 qdyint(&desi.Qlsdy) 390 } 391 } 392 393 func Desiday(Mon, Day, ttmm int, Desi []*DESI, Nday, SimDayend int) { 394 // Mo := Mon - 1 395 // tt := ConvertHour(ttmm) 396 397 for _, desi := range Desi { 398 // 日集計 399 svdaysum(int64(ttmm), desi.Cmp.Control, desi.Tain, &desi.Tidy) 400 svdaysum(int64(ttmm), desi.Cmp.Control, desi.Taout, &desi.Tody) 401 svdaysum(int64(ttmm), desi.Cmp.Control, desi.Tsold, &desi.Tsdy) 402 svdaysum(int64(ttmm), desi.Cmp.Control, desi.Xain, &desi.xidy) 403 svdaysum(int64(ttmm), desi.Cmp.Control, desi.Xaout, &desi.xody) 404 svdaysum(int64(ttmm), desi.Cmp.Control, desi.Xsold, &desi.xsdy) 405 qdaysum(int64(ttmm), desi.Cmp.Control, desi.Qs, &desi.Qsdy) 406 qdaysum(int64(ttmm), desi.Cmp.Control, desi.Ql, &desi.Qldy) 407 qdaysum(int64(ttmm), desi.Cmp.Control, desi.Qt, &desi.Qtdy) 408 qdaysum(int64(ttmm), desi.Cmp.Control, desi.Qloss, &desi.Qlsdy) 409 } 410 } 411 412 func Desidyprt(fo io.Writer, id int, Desi []*DESI) { 413 switch id { 414 case 0: 415 if len(Desi) > 0 { 416 fmt.Fprintf(fo, "%s %d\n", DESI_TYPE, len(Desi)) 417 } 418 for _, desi := range Desi { 419 fmt.Fprintf(fo, " %s 1 68\n", desi.Name) 420 } 421 case 1: 422 for _, desi := range Desi { 423 424 fmt.Fprintf(fo, "%s_Ht H d %s_Ti T f ", desi.Name, desi.Name) 425 fmt.Fprintf(fo, "%s_ttn h d %s_Tin t f %s_ttm h d %s_Tim t f\n", desi.Name, desi.Name, desi.Name, desi.Name) 426 427 fmt.Fprintf(fo, "%s_Ht H d %s_To T f ", desi.Name, desi.Name) 428 fmt.Fprintf(fo, "%s_ttn h d %s_Ton t f %s_ttm h d %s_Tom t f\n", desi.Name, desi.Name, desi.Name, desi.Name) 429 430 fmt.Fprintf(fo, "%s_Ht H d %s_Ts T f ", desi.Name, desi.Name) 431 fmt.Fprintf(fo, "%s_ttn h d %s_Tsn t f %s_ttm h d %s_Tsm t f\n", desi.Name, desi.Name, desi.Name, desi.Name) 432 433 fmt.Fprintf(fo, "%s_Ht H d %s_xi T f ", desi.Name, desi.Name) 434 fmt.Fprintf(fo, "%s_ttn h d %s_xin t f %s_ttm h d %s_xim t f\n", desi.Name, desi.Name, desi.Name, desi.Name) 435 436 fmt.Fprintf(fo, "%s_Ht H d %s_xo T f ", desi.Name, desi.Name) 437 fmt.Fprintf(fo, "%s_ttn h d %s_xon t f %s_ttm h d %s_xom t f\n", desi.Name, desi.Name, desi.Name, desi.Name) 438 439 fmt.Fprintf(fo, "%s_Ht H d %s_xs T f ", desi.Name, desi.Name) 440 fmt.Fprintf(fo, "%s_ttn h d %s_xsn t f %s_ttm h d %s_xsm t f\n", desi.Name, desi.Name, desi.Name, desi.Name) 441 442 fmt.Fprintf(fo, "%s_Hsh H d %s_Qsh Q f %s_Hsc H d %s_Qsc Q f\n", desi.Name, desi.Name, desi.Name, desi.Name) 443 fmt.Fprintf(fo, "%s_tsh h d %s_qsh q f %s_tsc h d %s_qsc q f\n", desi.Name, desi.Name, desi.Name, desi.Name) 444 445 fmt.Fprintf(fo, "%s_Hlh H d %s_Qlh Q f %s_Hlc H d %s_Qlc Q f\n", desi.Name, desi.Name, desi.Name, desi.Name) 446 fmt.Fprintf(fo, "%s_tlh h d %s_qlh q f %s_tlc h d %s_qlc q f\n", desi.Name, desi.Name, desi.Name, desi.Name) 447 448 fmt.Fprintf(fo, "%s_Hth H d %s_Qth Q f %s_Htc H d %s_Qtc Q f\n", desi.Name, desi.Name, desi.Name, desi.Name) 449 fmt.Fprintf(fo, "%s_tth h d %s_qth q f %s_ttc h d %s_qtc q f\n", desi.Name, desi.Name, desi.Name, desi.Name) 450 451 fmt.Fprintf(fo, "%s_Hlsh H d %s_Qlsh Q f %s_Hlsc H d %s_Qlsc Q f\n", desi.Name, desi.Name, desi.Name, desi.Name) 452 fmt.Fprintf(fo, "%s_tlsh h d %s_qlsh q f %s_tlsc h d %s_qlsc q f\n", desi.Name, desi.Name, desi.Name, desi.Name) 453 } 454 default: 455 for _, desi := range Desi { 456 fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ", desi.Tidy.Hrs, desi.Tidy.M, desi.Tidy.Mntime, desi.Tidy.Mn, desi.Tidy.Mxtime, desi.Tidy.Mx) 457 fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ", desi.Tody.Hrs, desi.Tody.M, desi.Tody.Mntime, desi.Tody.Mn, desi.Tody.Mxtime, desi.Tody.Mx) 458 fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ", desi.Tsdy.Hrs, desi.Tsdy.M, desi.Tsdy.Mntime, desi.Tsdy.Mn, desi.Tsdy.Mxtime, desi.Tsdy.Mx) 459 460 fmt.Fprintf(fo, "%1d %.4f %1d %.4f %1d %.4f ", desi.xidy.Hrs, desi.xidy.M, desi.xidy.Mntime, desi.xidy.Mn, desi.xidy.Mxtime, desi.xidy.Mx) 461 fmt.Fprintf(fo, "%1d %.4f %1d %.4f %1d %.4f ", desi.xody.Hrs, desi.xody.M, desi.xody.Mntime, desi.xody.Mn, desi.xody.Mxtime, desi.xody.Mx) 462 fmt.Fprintf(fo, "%1d %.4f %1d %.4f %1d %.4f ", desi.xsdy.Hrs, desi.xsdy.M, desi.xsdy.Mntime, desi.xsdy.Mn, desi.xsdy.Mxtime, desi.xsdy.Mx) 463 464 fmt.Fprintf(fo, "%1d %3.1f ", desi.Qsdy.Hhr, desi.Qsdy.H) 465 fmt.Fprintf(fo, "%1d %3.1f ", desi.Qsdy.Chr, desi.Qsdy.C) 466 fmt.Fprintf(fo, "%1d %2.0f ", desi.Qsdy.Hmxtime, desi.Qsdy.Hmx) 467 fmt.Fprintf(fo, "%1d %2.0f ", desi.Qsdy.Cmxtime, desi.Qsdy.Cmx) 468 469 fmt.Fprintf(fo, "%1d %3.1f ", desi.Qldy.Hhr, desi.Qldy.H) 470 fmt.Fprintf(fo, "%1d %3.1f ", desi.Qldy.Chr, desi.Qldy.C) 471 fmt.Fprintf(fo, "%1d %2.0f ", desi.Qldy.Hmxtime, desi.Qldy.Hmx) 472 fmt.Fprintf(fo, "%1d %2.0f ", desi.Qldy.Cmxtime, desi.Qldy.Cmx) 473 474 fmt.Fprintf(fo, "%1d %3.1f ", desi.Qtdy.Hhr, desi.Qtdy.H) 475 fmt.Fprintf(fo, "%1d %3.1f ", desi.Qtdy.Chr, desi.Qtdy.C) 476 fmt.Fprintf(fo, "%1d %2.0f ", desi.Qtdy.Hmxtime, desi.Qtdy.Hmx) 477 fmt.Fprintf(fo, "%1d %2.0f ", desi.Qtdy.Cmxtime, desi.Qtdy.Cmx) 478 479 fmt.Fprintf(fo, "%1d %3.1f ", desi.Qlsdy.Hhr, desi.Qlsdy.H) 480 fmt.Fprintf(fo, "%1d %3.1f ", desi.Qlsdy.Chr, desi.Qlsdy.C) 481 fmt.Fprintf(fo, "%1d %2.0f ", desi.Qlsdy.Hmxtime, desi.Qlsdy.Hmx) 482 fmt.Fprintf(fo, "%1d %2.0f\n", desi.Qlsdy.Cmxtime, desi.Qlsdy.Cmx) 483 } 484 } 485 }