github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/eepflow.go (about) 1 package eeslism 2 3 import ( 4 "fmt" 5 "math" 6 "os" 7 ) 8 9 /* --------------------------------------------------- */ 10 11 /* システム要素の流量設定 */ 12 13 func Pflow(_Mpath []*MPATH, Wd *WDAT) { 14 var i, j, n, NG int 15 //var mpi *MPATH 16 var pl *PLIST 17 var eli *ELIN 18 var elo *ELOUT 19 var cmp *COMPNT 20 var vc, vcmb *VALV 21 var Go float64 22 var G float64 23 var Err, s string 24 /*---- Satoh Debug VAV 2000/12/6 ----*/ 25 var vav *VAV 26 var G0 float64 27 28 if len(_Mpath) > 0 { 29 for m, Mpath := range _Mpath { 30 31 if DEBUG { 32 fmt.Printf("m=%d mMAX=%d name=%s\n", m, len(_Mpath), Mpath.Name) 33 } 34 35 // 流量が既知の末端流量の初期化 36 for _, Plist := range Mpath.Plist { 37 if Plist.Go != nil && Plist.Nvalv == 0 { 38 Plist.G = *Plist.Go 39 } 40 } 41 42 for i, Plist := range Mpath.Plist { 43 Plist.G = 0.0 44 45 if DEBUG { 46 fmt.Printf("i=%d iMAX=%d name=%s\n", i, len(Mpath.Plist), get_string_or_null(Plist.Name)) 47 } 48 49 // 流量が既知の末端経路 50 if Plist.Go != nil && Plist.Nvalv == 0 { 51 Plist.G = *Plist.Go 52 } else if Plist.Go != nil && Plist.Nvalv > 0 || 53 Plist.NOMVAV > 0 || 54 (Plist.Go == nil && Plist.Nvalv > 0 && Plist.UnknownFlow == 1) { 55 if Plist.Go != nil && Plist.Valv != nil && 56 Plist.Valv.Cmp.Eqptype == VALV_TYPE { 57 // 二方弁の計算 58 Plist.G = *Plist.Go 59 vc = Plist.Valv 60 if vc == nil || vc.Org == 'y' { 61 if vc.X < 0.0 { 62 s = fmt.Sprintf("%s のバルブ開度 %f が不正です。", vc.Name, vc.X) 63 Eprint("<Pflow>", s) 64 } 65 Plist.G = vc.X * *Plist.Go 66 } else { 67 vcmb = vc.Cmb.Eqp.(*VALV) 68 Plist.G = (1.0 - vcmb.X) * *Plist.Go 69 } 70 } else if Plist.Valv != nil && Plist.Valv.MGo != nil && 71 *Plist.Valv.MGo > 0.0 && Plist.Control != OFF_SW { 72 // 三方弁の計算 73 74 vc = Plist.Valv 75 vcmb = vc.Cmb.Eqp.(*VALV) 76 77 if vc.Org == 'y' { 78 Plist.G = vc.X * *vc.MGo 79 } else { 80 Plist.G = (1.0 - vcmb.X) * *vc.MGo 81 } 82 83 if Plist.G > 0. { 84 Plist.Control = ON_SW 85 } 86 } else if Plist.Valv != nil && Plist.Valv.MGo != nil && *Plist.Valv.MGo <= 0.0 { 87 Plist.G = 0.0 88 } else if Plist.Valv != nil && Plist.Valv.Count > 0 { 89 Plist.G = Plist.Gcalc 90 } else if Plist.NOMVAV > 0 { 91 Plist.G = OMflowcalc(Plist.OMvav, Wd) 92 } 93 94 if Plist.G <= 0.0 { 95 Plist.lpathscdd(OFF_SW) 96 } 97 98 if Plist.G > 0. { 99 Plist.Control = ON_SW 100 } 101 } else if Plist.Nvav > 0 { 102 /*---- Satoh Debug VAV 2000/12/6 ----*/ 103 104 /* VAVユニット時の流量 */ 105 106 G = -999.0 107 for _, Pelm := range Plist.Pelm { 108 if Pelm.Cmp.Eqptype == VAV_TYPE || 109 Pelm.Cmp.Eqptype == VWV_TYPE { 110 vav = Pelm.Cmp.Eqp.(*VAV) 111 112 if vav.Count == 0 { 113 G = math.Max(G, vav.Cat.Gmax) 114 } else { 115 G = math.Max(G, vav.G) 116 } 117 } 118 } 119 Plist.G = G 120 } else if Plist.Rate != nil { 121 Plist.G = *Mpath.G0 * *Plist.Rate 122 } else if !Plist.Batch { 123 if Plist.Go != nil { 124 Go = *Plist.Go 125 } else { 126 Go = 0.0 127 } 128 129 if Plist.Pelm != nil { 130 Err = fmt.Sprintf("Mpath=%s lpath=%d elm=%s Go=%f\n", Mpath.Name, 0, Plist.Pelm[0].Cmp.Name, Go) 131 } 132 } 133 } 134 135 NG = Mpath.NGv 136 137 X := make([]float64, NG) 138 Y := make([]float64, NG) 139 A := make([]float64, NG*NG) 140 141 for i = 0; i < NG; i++ { 142 if DEBUG { 143 fmt.Printf("i=%d iMAX=%d\n", i, NG) 144 } 145 146 cmp = Mpath.Cbcmp[i] 147 148 if DEBUG { 149 fmt.Printf("<Pflow> Name=%s\n", cmp.Name) 150 } 151 152 for j = 0; j < cmp.Nin; j++ { 153 eli = cmp.Elins[j] 154 155 if DEBUG { 156 fmt.Printf("j=%d jMAX=%d\n", j, cmp.Nin) 157 } 158 159 if eli.Lpath.Go != nil || 160 eli.Lpath.Nvav != 0 || 161 eli.Lpath.Nvalv != 0 || 162 eli.Lpath.Rate != nil || 163 eli.Lpath.NOMVAV != 0 { 164 Y[i] -= eli.Lpath.G 165 } else { 166 n = eli.Lpath.N 167 168 if n < 0 || n >= NG { 169 Err = fmt.Sprintf("n=%d", n) 170 Eprint("<Pflow>", Err) 171 os.Exit(EXIT_PFLOW) 172 } 173 174 A[i*NG+n] = 1.0 175 } 176 } 177 178 //////// 179 180 for j = 0; j < cmp.Nout; j++ { 181 elo = cmp.Elouts[j] 182 183 if elo.Lpath.Go != nil || 184 elo.Lpath.Nvav != 0 || 185 elo.Lpath.Nvalv != 0 || 186 elo.Lpath.Rate != nil { 187 Y[i] += elo.Lpath.G 188 } else { 189 n = elo.Lpath.N 190 191 if n < 0 || n >= NG { 192 Err = fmt.Sprintf(Err, "n=%d", n) 193 Eprint("<Pflow>", Err) 194 os.Exit(EXIT_PFLOW) 195 } 196 197 A[i*NG+n] = -1.0 198 } 199 } 200 } 201 202 if NG > 0 { 203 204 if DEBUG { 205 for i = 0; i < NG; i++ { 206 fmt.Printf("%s\t", Mpath.Cbcmp[i].Name) 207 208 for j = 0; j < NG; j++ { 209 fmt.Printf("%6.1f", A[i*NG+j]) 210 } 211 212 fmt.Printf("\t%.5f\n", Y[i]) 213 } 214 } 215 216 if dayprn && Ferr != nil { 217 for i = 0; i < NG; i++ { 218 fmt.Fprintf(Ferr, "%s\t", Mpath.Cbcmp[i].Name) 219 220 for j = 0; j < NG; j++ { 221 fmt.Fprintf(Ferr, "\t%.1g", A[i*NG+j]) 222 } 223 224 fmt.Fprintf(Ferr, "\t\t%.2g\n", Y[i]) 225 } 226 } 227 228 if NG > 1 { 229 Matinv(A, NG, NG, "<Pflow>") 230 Matmalv(A, Y, NG, NG, X) 231 } else { 232 X[0] = Y[0] / A[0] 233 } 234 235 if DEBUG { 236 fmt.Printf("<Pflow> Flow Rate\n") 237 for i = 0; i < NG; i++ { 238 fmt.Printf("\t%6.2f\n", X[i]) 239 } 240 } 241 242 if dayprn && Ferr != nil { 243 for i = 0; i < NG; i++ { 244 fmt.Fprintf(Ferr, "\t\t%.2g\n", X[i]) 245 } 246 } 247 } 248 249 for i := 0; i < NG; i++ { 250 pl = Mpath.Pl[i] 251 pl.G = X[i] 252 } 253 254 for i, Plist := range Mpath.Plist { 255 256 if DEBUG { 257 fmt.Printf("<< Pflow >> e i=%d iMAX=%d control=%c G=%.5f\n", 258 i, len(Mpath.Plist), Plist.Control, Plist.G) 259 } 260 261 if Plist.Control == OFF_SW { 262 Plist.G = 0.0 263 } else if Plist.G <= 0.0 { 264 // 負であればエラーを表示する 265 //if (Plist.G < 0. ) 266 // fmt.Printf("<%s> 流量が負になっています %g\n", Mpath.Name, Plist.G ) ; 267 268 Plist.G = 0.0 269 Plist.Control = OFF_SW 270 Plist.lpathscdd(Plist.Control) 271 } 272 273 for j, Pelm := range Plist.Pelm { 274 if Pelm.Out != nil { 275 Pelm.Out.G = Plist.G 276 } 277 278 if DEBUG { 279 if Pelm.Out != nil { 280 G0 = Pelm.Out.G 281 } else { 282 G0 = 0.0 283 } 284 285 fmt.Printf("< Pflow > j=%d\tjMAX=%d\tPelm-G=%.5f\tPlist->G=%.5f\n", 286 j, len(Plist.Pelm), G0, Plist.G) 287 } 288 } 289 } 290 } 291 } 292 } 293 294 func get_string_or_null(s string) string { 295 if s == "" { 296 return "(null)" 297 } 298 return s 299 }