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  }