github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/mcpipe.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 /* pipe.c */ 17 18 package eeslism 19 20 import ( 21 "errors" 22 "fmt" 23 "io" 24 "math" 25 "strconv" 26 "strings" 27 ) 28 29 /* 配管・ダクト 仕様入力 */ 30 31 func Pipedata(cattype EqpType, s string, Pipeca *PIPECA) int { 32 var st string 33 var dt float64 34 var id int 35 36 if cattype == DUCT_TYPE { 37 Pipeca.Type = DUCT_PDT 38 } else if cattype == PIPEDUCT_TYPE { 39 Pipeca.Type = PIPE_PDT 40 } else { 41 panic(cattype) 42 } 43 44 st = strings.Split(s, "=")[1] 45 46 var err error 47 dt, err = strconv.ParseFloat(st, 64) 48 if err != nil { 49 panic("Failed to parse float: " + err.Error()) 50 } 51 52 if strings.HasPrefix(s, "Ko") { 53 Pipeca.Ko = dt 54 } else { 55 id = 1 56 } 57 58 return id 59 } 60 61 /* --------------------------- */ 62 63 /* 管長・ダクト長、周囲温度設定 */ 64 65 func Pipeint(Pipe []*PIPE, Simc *SIMCONTL, Compnt []*COMPNT, Wd *WDAT) { 66 for _, pipe := range Pipe { 67 if pipe.Cmp.Ivparm != nil { 68 pipe.L = *pipe.Cmp.Ivparm 69 } else { 70 pipe.L = -999.0 71 } 72 73 if pipe.Cmp.Envname != "" { 74 pipe.Tenv = envptr(pipe.Cmp.Envname, Simc, Compnt, Wd, nil) 75 } else { 76 pipe.Room = roomptr(pipe.Cmp.Roomname, Compnt) 77 } 78 79 if pipe.Cat.Ko < 0.0 { 80 Err := fmt.Sprintf("Name=%s Ko=%.4g", pipe.Cmp.Name, pipe.Cat.Ko) 81 Eprint("Pipeint", Err) 82 } 83 84 if pipe.L < 0.0 { 85 Err := fmt.Sprintf("Name=%s L=%.4g", pipe.Cmp.Name, pipe.L) 86 Eprint("Pipeint", Err) 87 } 88 } 89 } 90 91 /* --------------------------- */ 92 93 /* 特性式の係数 */ 94 95 // 96 // [IN 1] ---> +------+ ---> [OUT 1] 空気 or 温水温度 97 // | PIPE | 98 // [IN 2] ---> +------+ ---> [OUT 2] 湿度 (DUCT_PDTのみ) 99 // 100 func Pipecfv(Pipe []*PIPE) { 101 for _, pipe := range Pipe { 102 Te := 0.0 103 if pipe.Cmp.Control != OFF_SW { 104 if pipe.Cmp.Envname != "" { 105 Te = *pipe.Tenv 106 } else if pipe.Room != nil { 107 Te = pipe.Room.Tot 108 } else { 109 Err := fmt.Sprintf("Undefined Pipe Environment name=%s", pipe.Name) 110 Eprint("<Pipecfv>", Err) 111 } 112 pipe.Ko = pipe.Cat.Ko 113 114 Eo1 := pipe.Cmp.Elouts[0] 115 cG := Spcheat(Eo1.Fluid) * Eo1.G 116 pipe.Ep = 1.0 - math.Exp(-(pipe.Ko*pipe.L)/cG) 117 pipe.D1 = cG * pipe.Ep 118 pipe.Do = pipe.D1 * Te 119 Eo1.Coeffo = cG 120 Eo1.Co = pipe.Do 121 Eo1.Coeffin[0] = pipe.D1 - cG 122 123 if pipe.Cat.Type == DUCT_PDT { 124 Eo2 := pipe.Cmp.Elouts[1] 125 Eo2.Coeffo = 1.0 126 Eo2.Co = 0.0 127 Eo2.Coeffin[0] = -1.0 128 } 129 } 130 } 131 } 132 133 /* --------------------------- */ 134 135 /* 取得熱量の計算 */ 136 137 func Pipeene(Pipe []*PIPE) { 138 for _, pipe := range Pipe { 139 pipe.Tin = pipe.Cmp.Elins[0].Sysvin 140 141 if pipe.Cmp.Control != OFF_SW { 142 Eo := pipe.Cmp.Elouts[0] 143 pipe.Tout = pipe.Do 144 pipe.Q = pipe.Do - pipe.D1*pipe.Tin 145 146 if pipe.Room != nil { 147 pipe.Room.Qeqp += (-pipe.Q) 148 } 149 150 if pipe.Cat.Type == DUCT_PDT { 151 Eo = pipe.Cmp.Elouts[1] 152 pipe.Xout = Eo.Sysv 153 pipe.RHout = FNRhtx(pipe.Tout, pipe.Xout) 154 pipe.Hout = FNH(pipe.Tout, Eo.Sysv) 155 } else { 156 pipe.Hout = -999.0 157 } 158 } else { 159 pipe.Q = 0.0 160 } 161 } 162 } 163 164 /* --------------------------- */ 165 166 /* 負荷計算用設定値のポインター */ 167 168 func pipeldsptr(load *ControlSWType, key []string, Pipe *PIPE, idmrk *byte) (VPTR, error) { 169 var err error 170 var vptr VPTR 171 172 if key[1] == "Tout" { 173 vptr.Ptr = &Pipe.Toset 174 vptr.Type = VAL_CTYPE 175 Pipe.Loadt = load 176 *idmrk = 't' 177 } else if Pipe.Cat.Type == DUCT_PDT && key[1] == "xout" { 178 vptr.Ptr = &Pipe.Xoset 179 vptr.Type = VAL_CTYPE 180 Pipe.Loadx = load 181 *idmrk = 'x' 182 } else { 183 err = errors.New("Tout or xout expected") 184 } 185 186 return vptr, err 187 } 188 189 /* ------------------------------------------ */ 190 191 /* 負荷計算用設定値のスケジュール設定 */ 192 193 func pipeldsschd(Pipe *PIPE) { 194 Eo := Pipe.Cmp.Elouts[0] 195 196 if Pipe.Loadt != nil { 197 if Eo.Control != OFF_SW { 198 if Pipe.Toset > TEMPLIMIT { 199 Eo.Control = LOAD_SW 200 Eo.Sysv = Pipe.Toset 201 } else { 202 Eo.Control = OFF_SW 203 } 204 } 205 } 206 207 if Pipe.Cat.Type == DUCT_PDT && Pipe.Loadx != nil { 208 if len(Pipe.Cmp.Elouts) > 1 { 209 Eo = Pipe.Cmp.Elouts[1] 210 if Eo.Control != OFF_SW { 211 if Pipe.Xoset > 0.0 { 212 Eo.Control = LOAD_SW 213 Eo.Sysv = Pipe.Xoset 214 } else { 215 Eo.Control = OFF_SW 216 } 217 } 218 } 219 } 220 } 221 222 /* --------------------------- */ 223 224 func pipeprint(fo io.Writer, id int, Pipe []*PIPE) { 225 switch id { 226 case 0: 227 if len(Pipe) > 0 { 228 fmt.Fprintf(fo, "%s %d\n", PIPEDUCT_TYPE, len(Pipe)) 229 } 230 for _, pipe := range Pipe { 231 fmt.Fprintf(fo, " %s 1 5\n", pipe.Name) 232 } 233 case 1: 234 for _, pipe := range Pipe { 235 fmt.Fprintf(fo, "%s_c c c %s_G m f %s_Ti t f %s_To t f %s_Q q f\n", 236 pipe.Name, pipe.Name, pipe.Name, pipe.Name, pipe.Name) 237 } 238 default: 239 for _, pipe := range Pipe { 240 fmt.Fprintf(fo, "%c %6.4g %4.1f %4.1f %.2f\n", 241 pipe.Cmp.Elouts[0].Control, pipe.Cmp.Elouts[0].G, 242 pipe.Tin, pipe.Cmp.Elouts[0].Sysv, pipe.Q) 243 } 244 } 245 } 246 247 /* --------------------------- */ 248 249 /* 日積算値に関する処理 */ 250 251 func pipedyint(Pipe []*PIPE) { 252 for _, pipe := range Pipe { 253 svdyint(&pipe.Tidy) 254 qdyint(&pipe.Qdy) 255 } 256 } 257 258 func pipemonint(Pipe []*PIPE) { 259 for _, pipe := range Pipe { 260 svdyint(&pipe.MTidy) 261 qdyint(&pipe.MQdy) 262 } 263 } 264 265 func pipeday(Mon int, Day int, ttmm int, Pipe []*PIPE, Nday int, SimDayend int) { 266 for _, pipe := range Pipe { 267 // 日集計 268 svdaysum(int64(ttmm), pipe.Cmp.Elouts[0].Control, pipe.Tin, &pipe.Tidy) 269 qdaysum(int64(ttmm), pipe.Cmp.Elouts[0].Control, pipe.Q, &pipe.Qdy) 270 271 // 月集計 272 svmonsum(Mon, Day, ttmm, pipe.Cmp.Elouts[0].Control, pipe.Tin, &pipe.MTidy, Nday, SimDayend) 273 qmonsum(Mon, Day, ttmm, pipe.Cmp.Elouts[0].Control, pipe.Q, &pipe.MQdy, Nday, SimDayend) 274 } 275 } 276 277 func pipedyprt(fo io.Writer, id int, Pipe []*PIPE) { 278 switch id { 279 case 0: 280 if len(Pipe) > 0 { 281 fmt.Fprintf(fo, "%s %d\n", PIPEDUCT_TYPE, len(Pipe)) 282 } 283 for _, pipe := range Pipe { 284 fmt.Fprintf(fo, " %s 1 14\n", pipe.Name) 285 } 286 287 case 1: 288 for _, pipe := range Pipe { 289 fmt.Fprintf(fo, "%s_Ht H d %s_T T f ", pipe.Name, pipe.Name) 290 fmt.Fprintf(fo, "%s_ttn h d %s_Tn t f %s_ttm h d %s_Tm t f\n", pipe.Name, pipe.Name, pipe.Name, pipe.Name) 291 fmt.Fprintf(fo, "%s_Hh H d %s_Qh Q f %s_Hc H d %s_Qc Q f\n", pipe.Name, pipe.Name, pipe.Name, pipe.Name) 292 fmt.Fprintf(fo, "%s_th h d %s_qh q f %s_tc h d %s_qc q f\n\n", pipe.Name, pipe.Name, pipe.Name, pipe.Name) 293 } 294 295 default: 296 for _, pipe := range Pipe { 297 fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ", 298 pipe.Tidy.Hrs, pipe.Tidy.M, pipe.Tidy.Mntime, 299 pipe.Tidy.Mn, pipe.Tidy.Mxtime, pipe.Tidy.Mx) 300 fmt.Fprintf(fo, "%1d %3.1f ", pipe.Qdy.Hhr, pipe.Qdy.H) 301 fmt.Fprintf(fo, "%1d %3.1f ", pipe.Qdy.Chr, pipe.Qdy.C) 302 fmt.Fprintf(fo, "%1d %2.0f ", pipe.Qdy.Hmxtime, pipe.Qdy.Hmx) 303 fmt.Fprintf(fo, "%1d %2.0f\n", pipe.Qdy.Cmxtime, pipe.Qdy.Cmx) 304 } 305 } 306 } 307 308 func pipemonprt(fo io.Writer, id int, Pipe []*PIPE) { 309 switch id { 310 case 0: 311 if len(Pipe) > 0 { 312 fmt.Fprintf(fo, "%s %d\n", PIPEDUCT_TYPE, len(Pipe)) 313 } 314 for _, pipe := range Pipe { 315 fmt.Fprintf(fo, " %s 1 14\n", pipe.Name) 316 } 317 318 case 1: 319 for _, pipe := range Pipe { 320 fmt.Fprintf(fo, "%s_Ht H d %s_T T f ", pipe.Name, pipe.Name) 321 fmt.Fprintf(fo, "%s_ttn h d %s_Tn t f %s_ttm h d %s_Tm t f\n", pipe.Name, pipe.Name, pipe.Name, pipe.Name) 322 fmt.Fprintf(fo, "%s_Hh H d %s_Qh Q f %s_Hc H d %s_Qc Q f\n", pipe.Name, pipe.Name, pipe.Name, pipe.Name) 323 fmt.Fprintf(fo, "%s_th h d %s_qh q f %s_tc h d %s_qc q f\n\n", pipe.Name, pipe.Name, pipe.Name, pipe.Name) 324 } 325 326 default: 327 for _, pipe := range Pipe { 328 fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ", 329 pipe.MTidy.Hrs, pipe.MTidy.M, pipe.MTidy.Mntime, 330 pipe.MTidy.Mn, pipe.MTidy.Mxtime, pipe.MTidy.Mx) 331 fmt.Fprintf(fo, "%1d %3.1f ", pipe.MQdy.Hhr, pipe.MQdy.H) 332 fmt.Fprintf(fo, "%1d %3.1f ", pipe.MQdy.Chr, pipe.MQdy.C) 333 fmt.Fprintf(fo, "%1d %2.0f ", pipe.MQdy.Hmxtime, pipe.MQdy.Hmx) 334 fmt.Fprintf(fo, "%1d %2.0f\n", pipe.MQdy.Cmxtime, pipe.MQdy.Cmx) 335 } 336 } 337 } 338 339 // 配管、ダクト内部変数のポインターを作成します 340 func pipevptr(key []string, Pipe *PIPE) (VPTR, error) { 341 var err error 342 var vptr VPTR 343 switch key[1] { 344 case "Tout": 345 vptr.Ptr = &Pipe.Tout 346 vptr.Type = VAL_CTYPE 347 case "hout": 348 vptr.Ptr = &Pipe.Hout 349 vptr.Type = VAL_CTYPE 350 case "xout": 351 vptr.Ptr = &Pipe.Xout 352 vptr.Type = VAL_CTYPE 353 case "RHout": 354 vptr.Ptr = &Pipe.RHout 355 vptr.Type = VAL_CTYPE 356 default: 357 err = errors.New("Tout, hout, xout or RHout is expected") 358 } 359 360 return vptr, err 361 }