github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/mchccoil.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 /* hccoil.c */ 17 18 /* 冷温水コイル */ 19 20 package eeslism 21 22 import ( 23 "fmt" 24 "io" 25 "math" 26 "strings" 27 ) 28 29 // 冷温水コイルの機器仕様入力 30 // See: ../format/EQPCAT.md#HCC 31 func Hccdata(s string, Hccca *HCCCA) int { 32 var st string 33 var dt float64 34 id := 0 35 36 if stIdx := strings.IndexRune(s, '='); stIdx == -1 { 37 Hccca.name = s 38 Hccca.eh = 0.0 39 Hccca.et = -999.0 40 Hccca.KA = -999.0 41 } else { 42 st = s[stIdx+1:] 43 dt, _ = readFloat(st) 44 45 if s == "et" { 46 // コイル温度効率 47 Hccca.et = dt 48 } else if s == "eh" { 49 // コイルエンタルピー効率 50 Hccca.eh = dt 51 } else if s == "KA" { 52 // コイルの熱通過率と伝熱面積の積 [W/K] 53 Hccca.KA = dt 54 } else { 55 id = 1 56 } 57 } 58 59 return id 60 } 61 62 /* ------------------------------------------ */ 63 func Hccdwint(_hcc []*HCC) { 64 for _, hcc := range _hcc { 65 66 // 乾きコイルと湿りコイルの判定 67 if hcc.Cat.eh > 1.0e-10 { 68 hcc.Wet = 'w' // 湿りコイル 69 } else { 70 hcc.Wet = 'd' // 乾きコイル 71 } 72 73 // 温度効率固定タイプと変動タイプの判定 74 if hcc.Cat.et > 0.0 { 75 hcc.Etype = 'e' // 定格(温度効率固定タイプ) 76 } else if hcc.Cat.KA > 0.0 { 77 hcc.Etype = 'k' // 変動タイプ 78 } else { 79 fmt.Printf("Hcc %s Undefined Character et or KA\n", hcc.Name) 80 hcc.Etype = '-' 81 } 82 83 // 入口水温、入口空気絶対湿度を初期化 84 //Hcc.Twin = 5.0 85 //Hcc.xain = FNXtr(25.0, 50.0) 86 } 87 } 88 89 /* ------------------------------------------ */ 90 /* 特性式の係数 */ 91 92 // 93 // [IN 1] ----> +-----+ ----> [OUT 1] 空気の温度 94 // [IN 2] ----> | HCC | ----> [OUT 2] 空気の絶対湿度 95 // [IN 3] ----> +-----+ ----> [OUT 3] 水の温度 96 // 97 func Hcccfv(_hcc []*HCC) { 98 for _, hcc := range _hcc { 99 hcc.Ga = 0.0 100 hcc.Gw = 0.0 101 hcc.et = 0.0 102 hcc.eh = 0.0 103 104 // 経路が停止していなければ 105 if hcc.Cmp.Control == OFF_SW { 106 continue 107 } 108 109 // 機器出力は3つ 110 if len(hcc.Cmp.Elouts) != 3 || len(hcc.Cmp.Elins) != 0 { 111 panic("HCCの機器出力数は3、機器入力は0です。") 112 } 113 114 eo_ta := hcc.Cmp.Elouts[0] // 排気温度 115 eo_xa := hcc.Cmp.Elouts[1] // 排気湿度 116 eo_tw := hcc.Cmp.Elouts[2] // 排水温度 117 118 var AirSW, WaterSW ControlSWType 119 120 // 排気量・排気熱量 121 hcc.Ga = eo_ta.G // 排気量 122 hcc.cGa = Spcheat(eo_ta.Fluid) * hcc.Ga // 排気熱量 123 if hcc.Ga > 0.0 { 124 AirSW = ON_SW 125 } else { 126 AirSW = OFF_SW 127 } 128 129 // 排水量・排水熱量 130 hcc.Gw = eo_tw.G // 排水量 131 hcc.cGw = Spcheat(eo_tw.Fluid) * hcc.Gw // 排水熱量 132 if hcc.Gw > 0.0 { 133 WaterSW = ON_SW 134 } else { 135 WaterSW = OFF_SW 136 } 137 138 // 温度効率 139 if hcc.Etype == 'e' { 140 // 定格温度効率 141 hcc.et = hcc.Cat.et 142 } else if hcc.Etype == 'k' { 143 // 温度効率を計算 144 hcc.et = FNhccet(hcc.cGa, hcc.cGw, hcc.Cat.KA) 145 } else { 146 panic(hcc.Etype) 147 } 148 149 // エンタルピ効率 [-] 150 hcc.eh = hcc.Cat.eh 151 152 // 冷温水コイルの処理熱量 153 hcc.Et, hcc.Ex, hcc.Ew = wcoil(AirSW, WaterSW, hcc.Wet, hcc.Ga*hcc.et, hcc.Ga*hcc.eh, hcc.Xain, hcc.Twin) 154 155 // 排気温度に関する係数の設定 156 eo_ta.Coeffo = hcc.cGa 157 eo_ta.Co = -(hcc.Et.C) 158 eo_ta.Coeffin[0] = hcc.Et.T - hcc.cGa 159 eo_ta.Coeffin[1] = hcc.Et.X 160 eo_ta.Coeffin[2] = -(hcc.Et.W) 161 162 // 排気湿度に関する係数の設定 163 eo_xa.Coeffo = hcc.Ga 164 eo_xa.Co = -(hcc.Ex.C) 165 eo_xa.Coeffin[0] = hcc.Ex.T 166 eo_xa.Coeffin[1] = hcc.Ex.X - hcc.Ga 167 eo_xa.Coeffin[2] = -(hcc.Ex.W) 168 169 // 排水温度に関する係数の設定 170 eo_tw.Coeffo = hcc.cGw 171 eo_tw.Co = hcc.Ew.C 172 eo_tw.Coeffin[0] = -(hcc.Ew.T) 173 eo_tw.Coeffin[1] = -(hcc.Ew.X) 174 eo_tw.Coeffin[2] = hcc.Ew.W - hcc.cGw 175 } 176 } 177 178 /* ------------------------------------------ */ 179 180 // 供給熱量の計算 181 func Hccdwreset(Hcc []*HCC, DWreset *int) { 182 for i, hcc := range Hcc { 183 xain := hcc.Cmp.Elins[1].Sysvin // <給気>絶対湿度 [kg/kg] 184 Twin := hcc.Cmp.Elins[2].Sysvin // <給水>温水の温度 [C] 185 186 reset := false 187 if hcc.Cat.eh > 1.0e-10 { 188 Tdp := FNDp(FNPwx(xain)) // 露点温度 189 if hcc.Wet == 'w' && Twin > Tdp { 190 // 露点温度を上回った => 結露なし (乾きコイル) 191 hcc.Wet = 'd' 192 reset = true 193 } else if hcc.Wet == 'd' && Twin < Tdp { 194 // 露点温度を上回った => 結露あり (湿りコイル) 195 hcc.Wet = 'w' 196 reset = true 197 } 198 199 if reset { 200 (*DWreset)++ 201 Hcccfv(Hcc[i : i+1]) 202 } 203 } 204 } 205 } 206 207 /* ------------------------------------------ */ 208 209 // 冷温水コイルHccの供給熱量 Qs, Ql, Qt の計算を行う。 210 func Hccene(Hcc []*HCC) { 211 for _, hcc := range Hcc { 212 hcc.Tain = hcc.Cmp.Elins[0].Sysvin // <給気>空気温度 [C] 213 hcc.Xain = hcc.Cmp.Elins[1].Sysvin // <給気>絶対湿度 [kg/kg] 214 hcc.Twin = hcc.Cmp.Elins[2].Sysvin // <給水>温水の温度 [C] 215 216 if hcc.Cmp.Control != OFF_SW { 217 // <排気>空気温度 [C] 218 hcc.Taout = hcc.Cmp.Elouts[0].Sysv 219 hcc.Qs = hcc.cGa * (hcc.Taout - hcc.Tain) 220 221 // <排気>空気絶対湿度 [kg/kg] 222 Xaout := hcc.Cmp.Elouts[1].Sysv 223 hcc.Ql = Ro * hcc.Ga * (Xaout - hcc.Xain) 224 225 // <排水>温水の温度 [C] 226 hcc.Twout = hcc.Cmp.Elouts[2].Sysv 227 hcc.Qt = hcc.cGw * (hcc.Twout - hcc.Twin) 228 } else { 229 // 経路が停止している場合は熱供給しない 230 hcc.Qs = 0.0 231 hcc.Ql = 0.0 232 hcc.Qt = 0.0 233 } 234 } 235 } 236 237 /* ------------------------------------------ */ 238 239 // 冷温水コイルHccの状態をfoに出力する。 240 func hccprint(fo io.Writer, id int, Hcc []*HCC) { 241 switch id { 242 case 0: 243 if len(Hcc) > 0 { 244 fmt.Fprintf(fo, "%s %d\n", HCCOIL_TYPE, len(Hcc)) 245 } 246 for _, hcc := range Hcc { 247 fmt.Fprintf(fo, " %s 1 16\n", hcc.Name) 248 } 249 case 1: 250 for _, hcc := range Hcc { 251 fmt.Fprintf(fo, "%s_ca c c %s_Ga m f %s_Ti t f %s_To t f %s_Qs q f\n", hcc.Name, hcc.Name, hcc.Name, hcc.Name, hcc.Name) 252 fmt.Fprintf(fo, "%s_cx c c %s_xi x f %s_xo x f %s_Ql q f\n", hcc.Name, hcc.Name, hcc.Name, hcc.Name) 253 fmt.Fprintf(fo, "%s_cw c c %s_Gw m f %s_Twi t f %s_Two t f %s_Qt q f\n", hcc.Name, hcc.Name, hcc.Name, hcc.Name, hcc.Name) 254 fmt.Fprintf(fo, "%s_et m f %s_eh m f\n\n", hcc.Name, hcc.Name) 255 } 256 default: 257 for _, hcc := range Hcc { 258 // 給排気温度に関する事項 259 eo_ta := hcc.Cmp.Elouts[0] 260 fmt.Fprintf(fo, "%c %6.4g %4.1f %4.1f %2.0f ", eo_ta.Control, hcc.Ga, hcc.Tain, eo_ta.Sysv, hcc.Qs) 261 262 // 給排気湿度に関する事項 263 eo_xa := hcc.Cmp.Elouts[1] 264 fmt.Fprintf(fo, "%c %5.3f %5.3f %2.0f ", eo_xa.Control, hcc.Xain, eo_xa.Sysv, hcc.Ql) 265 266 // 給排水温度に関する事項 267 eo_tw := hcc.Cmp.Elouts[2] 268 fmt.Fprintf(fo, "%c %6.4g %4.1f %4.1f %2.0f ", eo_tw.Control, hcc.Gw, hcc.Twin, eo_tw.Sysv, hcc.Qt) 269 270 // 温度効率、エンタルピー 271 fmt.Fprintf(fo, "%6.4g %6.4g\n", hcc.et, hcc.eh) 272 } 273 } 274 } 275 276 /* ------------------------------ */ 277 278 /* 日積算値に関する処理 */ 279 280 func hccdyint(Hcc []*HCC) { 281 for _, hcc := range Hcc { 282 svdyint(&hcc.Taidy) 283 svdyint(&hcc.xaidy) 284 svdyint(&hcc.Twidy) 285 qdyint(&hcc.Qdys) 286 qdyint(&hcc.Qdyl) 287 qdyint(&hcc.Qdyt) 288 } 289 } 290 291 func hccmonint(Hcc []*HCC) { 292 for _, hcc := range Hcc { 293 svdyint(&hcc.mTaidy) 294 svdyint(&hcc.mxaidy) 295 svdyint(&hcc.mTwidy) 296 qdyint(&hcc.mQdys) 297 qdyint(&hcc.mQdyl) 298 qdyint(&hcc.mQdyt) 299 } 300 } 301 302 func hccday(Mon, Day, ttmm int, Hcc []*HCC, Nday, SimDayend int) { 303 for _, hcc := range Hcc { 304 // 日集計 305 svdaysum(int64(ttmm), hcc.Cmp.Control, hcc.Tain, &hcc.Taidy) 306 svdaysum(int64(ttmm), hcc.Cmp.Control, hcc.Xain, &hcc.xaidy) 307 svdaysum(int64(ttmm), hcc.Cmp.Control, hcc.Twin, &hcc.Twidy) 308 qdaysum(int64(ttmm), hcc.Cmp.Control, hcc.Qs, &hcc.Qdys) 309 qdaysum(int64(ttmm), hcc.Cmp.Control, hcc.Ql, &hcc.Qdyl) 310 qdaysum(int64(ttmm), hcc.Cmp.Control, hcc.Qt, &hcc.Qdyt) 311 312 // 月集計 313 svmonsum(Mon, Day, ttmm, hcc.Cmp.Control, hcc.Tain, &hcc.mTaidy, Nday, SimDayend) 314 svmonsum(Mon, Day, ttmm, hcc.Cmp.Control, hcc.Xain, &hcc.mxaidy, Nday, SimDayend) 315 svmonsum(Mon, Day, ttmm, hcc.Cmp.Control, hcc.Twin, &hcc.mTwidy, Nday, SimDayend) 316 qmonsum(Mon, Day, ttmm, hcc.Cmp.Control, hcc.Qs, &hcc.mQdys, Nday, SimDayend) 317 qmonsum(Mon, Day, ttmm, hcc.Cmp.Control, hcc.Ql, &hcc.mQdyl, Nday, SimDayend) 318 qmonsum(Mon, Day, ttmm, hcc.Cmp.Control, hcc.Qt, &hcc.mQdyt, Nday, SimDayend) 319 } 320 } 321 322 func hccdyprt(fo io.Writer, id int, Hcc []*HCC) { 323 switch id { 324 case 0: 325 if len(Hcc) > 0 { 326 fmt.Fprintf(fo, "%s %d\n", HCCOIL_TYPE, len(Hcc)) 327 } 328 for _, hcc := range Hcc { 329 fmt.Fprintf(fo, "%s 4 42 14 14 14\n", hcc.Name) 330 } 331 case 1: 332 for _, hcc := range Hcc { 333 fmt.Fprintf(fo, "%s_Ht H d %s_T T f ", hcc.Name, hcc.Name) 334 fmt.Fprintf(fo, "%s_ttn h d %s_Tn t f %s_ttm h d %s_Tm t f\n", 335 hcc.Name, hcc.Name, hcc.Name, hcc.Name) 336 fmt.Fprintf(fo, "%s_Hsh H d %s_Qsh Q f %s_Hsc H d %s_Qsc Q f\n", 337 hcc.Name, hcc.Name, hcc.Name, hcc.Name) 338 fmt.Fprintf(fo, "%s_tsh h d %s_qsh q f %s_tsc h d %s_qsc q f\n", 339 hcc.Name, hcc.Name, hcc.Name, hcc.Name) 340 341 fmt.Fprintf(fo, "%s_Hx H d %s_x X f ", hcc.Name, hcc.Name) 342 fmt.Fprintf(fo, "%s_txn h d %s_xn x f %s_txm h d %s_xm c f\n", 343 hcc.Name, hcc.Name, hcc.Name, hcc.Name) 344 fmt.Fprintf(fo, "%s_Hlh H d %s_Qlh Q f %s_Hlc H d %s_Qlc Q f\n", 345 hcc.Name, hcc.Name, hcc.Name, hcc.Name) 346 fmt.Fprintf(fo, "%s_tlh h d %s_qlh q f %s_tlc h d %s_qlc q f\n", 347 hcc.Name, hcc.Name, hcc.Name, hcc.Name) 348 349 fmt.Fprintf(fo, "%s_Htw H d %s_Tw T f ", hcc.Name, hcc.Name) 350 fmt.Fprintf(fo, "%s_ttwn h d %s_Twn t f %s_ttwm h d %s_Twm t f\n", 351 hcc.Name, hcc.Name, hcc.Name, hcc.Name) 352 fmt.Fprintf(fo, "%s_Hth H d %s_Qth Q f %s_Htc H d %s_Qtc Q f\n", 353 hcc.Name, hcc.Name, hcc.Name, hcc.Name) 354 fmt.Fprintf(fo, "%s_tth h d %s_qth q f %s_ttc h d %s_qtc q f\n\n", 355 hcc.Name, hcc.Name, hcc.Name, hcc.Name) 356 } 357 default: 358 for _, hcc := range Hcc { 359 fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ", 360 hcc.Taidy.Hrs, hcc.Taidy.M, 361 hcc.Taidy.Mntime, hcc.Taidy.Mn, 362 hcc.Taidy.Mxtime, hcc.Taidy.Mx) 363 fmt.Fprintf(fo, "%1d %3.1f ", hcc.Qdys.Hhr, hcc.Qdys.H) 364 fmt.Fprintf(fo, "%1d %3.1f ", hcc.Qdys.Chr, hcc.Qdys.C) 365 fmt.Fprintf(fo, "%1d %2.0f ", hcc.Qdys.Hmxtime, hcc.Qdys.Hmx) 366 fmt.Fprintf(fo, "%1d %2.0f ", hcc.Qdys.Cmxtime, hcc.Qdys.Cmx) 367 368 fmt.Fprintf(fo, "%1d %5.4f %1d %5.4f %1d %5.4f ", 369 hcc.xaidy.Hrs, hcc.xaidy.M, 370 hcc.xaidy.Mntime, hcc.xaidy.Mn, 371 hcc.xaidy.Mxtime, hcc.xaidy.Mx) 372 fmt.Fprintf(fo, "%1d %3.1f ", hcc.Qdyl.Hhr, hcc.Qdyl.H) 373 fmt.Fprintf(fo, "%1d %3.1f ", hcc.Qdyl.Chr, hcc.Qdyl.C) 374 fmt.Fprintf(fo, "%1d %2.0f ", hcc.Qdyl.Hmxtime, hcc.Qdyl.Hmx) 375 fmt.Fprintf(fo, "%1d %2.0f ", hcc.Qdyl.Cmxtime, hcc.Qdyl.Cmx) 376 377 fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ", 378 hcc.Twidy.Hrs, hcc.Twidy.M, 379 hcc.Twidy.Mntime, hcc.Twidy.Mn, 380 hcc.Twidy.Mxtime, hcc.Twidy.Mx) 381 fmt.Fprintf(fo, "%1d %3.1f ", hcc.Qdyt.Hhr, hcc.Qdyt.H) 382 fmt.Fprintf(fo, "%1d %3.1f ", hcc.Qdyt.Chr, hcc.Qdyt.C) 383 fmt.Fprintf(fo, "%1d %2.0f ", hcc.Qdyt.Hmxtime, hcc.Qdyt.Hmx) 384 fmt.Fprintf(fo, "%1d %2.0f\n", hcc.Qdyt.Cmxtime, hcc.Qdyt.Cmx) 385 } 386 } 387 } 388 389 func hccmonprt(fo io.Writer, id int, Hcc []*HCC) { 390 switch id { 391 case 0: 392 if len(Hcc) > 0 { 393 fmt.Fprintf(fo, "%s %d\n", HCCOIL_TYPE, len(Hcc)) 394 } 395 for _, hcc := range Hcc { 396 fmt.Fprintf(fo, "%s 4 42 14 14 14\n", hcc.Name) 397 } 398 case 1: 399 for _, hcc := range Hcc { 400 fmt.Fprintf(fo, "%s_Ht H d %s_T T f ", hcc.Name, hcc.Name) 401 fmt.Fprintf(fo, "%s_ttn h d %s_Tn t f %s_ttm h d %s_Tm t f\n", 402 hcc.Name, hcc.Name, hcc.Name, hcc.Name) 403 fmt.Fprintf(fo, "%s_Hsh H d %s_Qsh Q f %s_Hsc H d %s_Qsc Q f\n", 404 hcc.Name, hcc.Name, hcc.Name, hcc.Name) 405 fmt.Fprintf(fo, "%s_tsh h d %s_qsh q f %s_tsc h d %s_qsc q f\n", 406 hcc.Name, hcc.Name, hcc.Name, hcc.Name) 407 408 fmt.Fprintf(fo, "%s_Hx H d %s_x X f ", hcc.Name, hcc.Name) 409 fmt.Fprintf(fo, "%s_txn h d %s_xn x f %s_txm h d %s_xm c f\n", 410 hcc.Name, hcc.Name, hcc.Name, hcc.Name) 411 fmt.Fprintf(fo, "%s_Hlh H d %s_Qlh Q f %s_Hlc H d %s_Qlc Q f\n", 412 hcc.Name, hcc.Name, hcc.Name, hcc.Name) 413 fmt.Fprintf(fo, "%s_tlh h d %s_qlh q f %s_tlc h d %s_qlc q f\n", 414 hcc.Name, hcc.Name, hcc.Name, hcc.Name) 415 416 fmt.Fprintf(fo, "%s_Htw H d %s_Tw T f ", hcc.Name, hcc.Name) 417 fmt.Fprintf(fo, "%s_ttwn h d %s_Twn t f %s_ttwm h d %s_Twm t f\n", 418 hcc.Name, hcc.Name, hcc.Name, hcc.Name) 419 fmt.Fprintf(fo, "%s_Hth H d %s_Qth Q f %s_Htc H d %s_Qtc Q f\n", 420 hcc.Name, hcc.Name, hcc.Name, hcc.Name) 421 fmt.Fprintf(fo, "%s_tth h d %s_qth q f %s_ttc h d %s_qtc q f\n\n", 422 hcc.Name, hcc.Name, hcc.Name, hcc.Name) 423 } 424 default: 425 for _, hcc := range Hcc { 426 fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ", 427 hcc.mTaidy.Hrs, hcc.mTaidy.M, 428 hcc.mTaidy.Mntime, hcc.mTaidy.Mn, 429 hcc.mTaidy.Mxtime, hcc.mTaidy.Mx) 430 fmt.Fprintf(fo, "%1d %3.1f ", hcc.mQdys.Hhr, hcc.mQdys.H) 431 fmt.Fprintf(fo, "%1d %3.1f ", hcc.mQdys.Chr, hcc.mQdys.C) 432 fmt.Fprintf(fo, "%1d %2.0f ", hcc.mQdys.Hmxtime, hcc.mQdys.Hmx) 433 fmt.Fprintf(fo, "%1d %2.0f ", hcc.mQdys.Cmxtime, hcc.mQdys.Cmx) 434 435 fmt.Fprintf(fo, "%1d %5.4f %1d %5.4f %1d %5.4f ", 436 hcc.mxaidy.Hrs, hcc.mxaidy.M, 437 hcc.mxaidy.Mntime, hcc.mxaidy.Mn, 438 hcc.mxaidy.Mxtime, hcc.mxaidy.Mx) 439 fmt.Fprintf(fo, "%1d %3.1f ", hcc.mQdyl.Hhr, hcc.mQdyl.H) 440 fmt.Fprintf(fo, "%1d %3.1f ", hcc.mQdyl.Chr, hcc.mQdyl.C) 441 fmt.Fprintf(fo, "%1d %2.0f ", hcc.mQdyl.Hmxtime, hcc.mQdyl.Hmx) 442 fmt.Fprintf(fo, "%1d %2.0f ", hcc.mQdyl.Cmxtime, hcc.mQdyl.Cmx) 443 444 fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ", 445 hcc.mTwidy.Hrs, hcc.mTwidy.M, 446 hcc.mTwidy.Mntime, hcc.mTwidy.Mn, 447 hcc.mTwidy.Mxtime, hcc.mTwidy.Mx) 448 fmt.Fprintf(fo, "%1d %3.1f ", hcc.mQdyt.Hhr, hcc.mQdyt.H) 449 fmt.Fprintf(fo, "%1d %3.1f ", hcc.mQdyt.Chr, hcc.mQdyt.C) 450 fmt.Fprintf(fo, "%1d %2.0f ", hcc.mQdyt.Hmxtime, hcc.mQdyt.Hmx) 451 fmt.Fprintf(fo, "%1d %2.0f\n", hcc.mQdyt.Cmxtime, hcc.mQdyt.Cmx) 452 } 453 } 454 } 455 456 // 温水コイルの温度効率計算関数 457 // 計算モデルは向流コイル 458 func FNhccet(Wa, Ww, KA float64) float64 { 459 Ws := Wa 460 Wl := Ww 461 462 NTU := KA / Ws 463 C := Ws / Wl 464 B := (1.0 - C) * NTU 465 466 if math.Abs(Ws-Wl) < 1.0e-5 { 467 return NTU / (1.0 + NTU) 468 } else { 469 if exB := math.Exp(-B); math.IsInf(exB, 0) { 470 return 1.0 / C 471 } else { 472 return (1.0 - exB) / (1.0 - C*exB) 473 } 474 } 475 }