github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/mcpump.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  /*  pump.c  */
    17  
    18  /*  ポンプ   */
    19  
    20  package eeslism
    21  
    22  import (
    23  	"fmt"
    24  	"io"
    25  	"math"
    26  	"os"
    27  	"strconv"
    28  	"strings"
    29  )
    30  
    31  /* 機器仕様入力      */
    32  
    33  func Pumpdata(cattype EqpType, s string, Pumpca *PUMPCA, pfcmp []*PFCMP) int {
    34  	st := strings.IndexByte(s, '=')
    35  	var dt float64
    36  	var id int
    37  
    38  	if st == -1 {
    39  		Pumpca.name = s
    40  		Pumpca.Type = ""
    41  		Pumpca.Wo = -999.0
    42  		Pumpca.Go = -999.0
    43  		Pumpca.qef = -999.0
    44  		Pumpca.val = nil
    45  
    46  		if cattype == PUMP_TYPE {
    47  			Pumpca.pftype = PUMP_PF
    48  		} else if cattype == FAN_TYPE {
    49  			Pumpca.pftype = FAN_PF
    50  		} else {
    51  			Pumpca.pftype = rune(OFF_SW)
    52  		}
    53  	} else {
    54  		s1, s2 := s[:st], s[st+1:]
    55  
    56  		if s1 == "type" {
    57  			Pumpca.Type = s2
    58  			if Pumpca.Type == "P" {
    59  				Pumpca.val = make([]float64, 4)
    60  			}
    61  
    62  			for _, pfc := range pfcmp {
    63  				if Pumpca.pftype == pfc.pftype && Pumpca.Type == pfc.Type {
    64  					Pumpca.pfcmp = pfc
    65  					break
    66  				}
    67  			}
    68  		} else {
    69  			dt, _ = strconv.ParseFloat(s[st+1:], 64)
    70  			if s == "qef" {
    71  				Pumpca.qef = dt
    72  			} else {
    73  				if Pumpca.Type != "P" {
    74  					switch s {
    75  					case "Go":
    76  						Pumpca.Go = dt
    77  					case "Wo":
    78  						Pumpca.Wo = dt
    79  					default:
    80  						id = 1
    81  					}
    82  				} else {
    83  					switch s {
    84  					case "a0":
    85  						Pumpca.val[0] = dt
    86  					case "a1":
    87  						Pumpca.val[1] = dt
    88  					case "a2":
    89  						Pumpca.val[2] = dt
    90  					case "Ic":
    91  						Pumpca.val[3] = dt
    92  					default:
    93  						id = 1
    94  					}
    95  				}
    96  			}
    97  		}
    98  	}
    99  	return id
   100  }
   101  
   102  /* --------------------------- */
   103  
   104  /* 太陽電池ポンプの太陽電池パネルの方位設定 */
   105  
   106  func Pumpint(Pump []*PUMP, Exs []*EXSF) {
   107  	for _, p := range Pump {
   108  		if p.Cat.Type == "P" {
   109  			p.Sol = nil
   110  			for j := 0; j < len(Exs); j++ {
   111  				if p.Cmp.Exsname == Exs[j].Name {
   112  					p.Sol = Exs[j]
   113  					break
   114  				}
   115  			}
   116  			if p.Sol == nil {
   117  				Eprint("Pumpint", p.Cmp.Exsname)
   118  			}
   119  		}
   120  	}
   121  }
   122  
   123  /* --------------------------- */
   124  
   125  // ポンプ流量設定(太陽電池ポンプのみ
   126  func (eqsys *EQSYS) Pumpflow() {
   127  	for i, p := range eqsys.Pump {
   128  		if p.Cat.Type == "P" {
   129  			S := p.Sol.Iw
   130  
   131  			if DEBUG {
   132  				fmt.Printf("<Pumpflow> i=%d S=%f Ic=%f a0=%f a1=%e a2=%e\n",
   133  					i, S, p.Cat.val[3], p.Cat.val[0],
   134  					p.Cat.val[1], p.Cat.val[2])
   135  			}
   136  
   137  			if S > p.Cat.val[3] {
   138  				p.G = p.Cat.val[0] + (p.Cat.val[1]+p.Cat.val[2]*S)*S
   139  			} else {
   140  				p.G = -999.0
   141  			}
   142  
   143  			p.E = 0
   144  		} else {
   145  			if p.Cmp.Control != OFF_SW {
   146  				p.G = p.Cat.Go
   147  				p.E = p.Cat.Wo
   148  			} else {
   149  				p.G = -999.0
   150  				p.E = 0.0
   151  			}
   152  
   153  			if DEBUG {
   154  				fmt.Printf("<Pumpflow>  control=%c G=%f E=%f\n",
   155  					p.Cmp.Control, p.G, p.E)
   156  			}
   157  		}
   158  	}
   159  }
   160  
   161  /* --------------------------- */
   162  
   163  /*  特性式の係数  */
   164  
   165  //
   166  //  +------+ ---> [OUT 1] 空気 or 温水温度 ?
   167  //  | PUMP |
   168  //  +------+ ---> [OUT 2] 湿度? (FAN_PFのみ)
   169  //
   170  func Pumpcfv(Pump []*PUMP) {
   171  	for _, p := range Pump {
   172  		if p.Cmp.Control != OFF_SW {
   173  			Eo1 := p.Cmp.Elouts[0]
   174  			cG := Spcheat(Eo1.Fluid) * Eo1.G
   175  			p.CG = cG
   176  			Eo1.Coeffo = cG
   177  			p.PLC = PumpFanPLC(Eo1.G/p.G, p)
   178  			Eo1.Co = p.Cat.qef * p.E * p.PLC
   179  			Eo1.Coeffin[0] = -cG
   180  
   181  			if p.Cat.pftype == FAN_PF {
   182  				Eo2 := p.Cmp.Elouts[1]
   183  				Eo2.Coeffo = Eo2.G
   184  				Eo2.Co = 0.0
   185  				Eo2.Coeffin[0] = -Eo2.G
   186  			}
   187  		} else {
   188  			p.G = 0.0
   189  			p.E = 0.0
   190  		}
   191  	}
   192  }
   193  
   194  // -----------------------------------------
   195  //
   196  //  ポンプ、ファンの部分負荷特性曲線
   197  //
   198  
   199  func PumpFanPLC(XQ float64, Pump *PUMP) float64 {
   200  	var Buff, dQ float64
   201  	var i int
   202  	cat := Pump.Cat
   203  
   204  	dQ = math.Min(1.0, math.Max(XQ, 0.25))
   205  
   206  	if cat.pfcmp == nil {
   207  		Err := fmt.Sprintf("<PumpFanPLC>  PFtype=%c  type=%s", cat.pftype, cat.Type)
   208  		Eprint("PUMP oir FAN", string(Err[:]))
   209  		Buff = 0.0
   210  	} else {
   211  		Buff = 0.0
   212  
   213  		for i = 0; i < 5; i++ {
   214  			Buff += cat.pfcmp.dblcoeff[i] * math.Pow(dQ, float64(i))
   215  		}
   216  	}
   217  	return Buff
   218  }
   219  
   220  /* --------------------------- */
   221  
   222  /*  供給熱量、エネルギーの計算 */
   223  
   224  func Pumpene(Pump []*PUMP) {
   225  	for _, p := range Pump {
   226  		p.Tin = p.Cmp.Elins[0].Sysvin
   227  		Eo := p.Cmp.Elouts[0]
   228  
   229  		if Eo.Control != OFF_SW {
   230  			p.Q = p.CG * (Eo.Sysv - p.Tin)
   231  		} else {
   232  			p.Q = 0.0
   233  		}
   234  	}
   235  }
   236  
   237  /* --------------------------- */
   238  
   239  func pumpprint(fo io.Writer, id int, Pump []*PUMP) {
   240  	var G float64
   241  
   242  	switch id {
   243  	case 0:
   244  		if len(Pump) > 0 {
   245  			fmt.Fprintf(fo, "%s  %d\n", PUMP_TYPE, len(Pump))
   246  		}
   247  		for _, p := range Pump {
   248  			fmt.Fprintf(fo, " %s 1 6\n", p.Name)
   249  		}
   250  	case 1:
   251  		for _, p := range Pump {
   252  			fmt.Fprintf(fo, "%s_c c c %s_Ti t f %s_To t f ", p.Name, p.Name, p.Name)
   253  			fmt.Fprintf(fo, "%s_Q q f  %s_E e f %s_G m f\n", p.Name, p.Name, p.Name)
   254  		}
   255  	default:
   256  		for _, p := range Pump {
   257  			if p.Cmp.Elouts[0].G > 0.0 && p.Cmp.Elouts[0].Control != OFF_SW {
   258  				G = p.Cmp.Elouts[0].G
   259  			} else {
   260  				G = 0.0
   261  			}
   262  			fmt.Fprintf(fo, "%c %4.1f %4.1f %4.0f %4.0f %.5g\n", p.Cmp.Elouts[0].Control,
   263  				p.Tin, p.Cmp.Elouts[0].Sysv, p.Q, p.E*p.PLC, G)
   264  		}
   265  	}
   266  }
   267  
   268  /* --------------------------- */
   269  
   270  /* 日積算値に関する処理 */
   271  
   272  func pumpdyint(Pump []*PUMP) {
   273  	for _, p := range Pump {
   274  		edyint(&p.Qdy)
   275  		edyint(&p.Edy)
   276  		edyint(&p.Gdy)
   277  	}
   278  }
   279  
   280  func pumpmonint(Pump []*PUMP) {
   281  	for _, p := range Pump {
   282  		edyint(&p.MQdy)
   283  		edyint(&p.MEdy)
   284  		edyint(&p.MGdy)
   285  	}
   286  }
   287  
   288  func pumpday(Mon, Day, ttmm int, Pump []*PUMP, Nday, SimDayend int) {
   289  	Mo := Mon - 1
   290  	tt := ConvertHour(ttmm)
   291  
   292  	for _, p := range Pump {
   293  		// 日集計
   294  		edaysum(ttmm, p.Cmp.Elouts[0].Control, p.Q, &p.Qdy)
   295  		edaysum(ttmm, p.Cmp.Elouts[0].Control, p.E, &p.Edy)
   296  		edaysum(ttmm, p.Cmp.Elouts[0].Control, p.G, &p.Gdy)
   297  
   298  		// 月集計
   299  		emonsum(Mon, Day, ttmm, p.Cmp.Elouts[0].Control, p.Q, &p.MQdy, Nday, SimDayend)
   300  		emonsum(Mon, Day, ttmm, p.Cmp.Elouts[0].Control, p.E, &p.MEdy, Nday, SimDayend)
   301  		emonsum(Mon, Day, ttmm, p.Cmp.Elouts[0].Control, p.G, &p.MGdy, Nday, SimDayend)
   302  
   303  		// 月・時刻のクロス集計
   304  		emtsum(Mon, Day, ttmm, p.Cmp.Elouts[0].Control, p.E, &p.MtEdy[Mo][tt])
   305  	}
   306  }
   307  
   308  func pumpdyprt(fo io.Writer, id int, Pump []*PUMP) {
   309  	switch id {
   310  	case 0:
   311  		if len(Pump) > 0 {
   312  			fmt.Fprintf(fo, "%s  %d\n", PUMP_TYPE, len(Pump))
   313  		}
   314  		for _, p := range Pump {
   315  			fmt.Fprintf(fo, " %s 1 12\n", p.Name)
   316  		}
   317  	case 1:
   318  		for _, p := range Pump {
   319  			fmt.Fprintf(fo, "%s_Hq H d %s_Q Q f %s_tq h d %s_Qm q f\n",
   320  				p.Name, p.Name, p.Name, p.Name)
   321  			fmt.Fprintf(fo, "%s_He H d %s_E E f %s_te h d %s_Em e f\n",
   322  				p.Name, p.Name, p.Name, p.Name)
   323  			fmt.Fprintf(fo, "%s_Hg H d %s_G M f %s_tg h d %s_Gm m f\n\n",
   324  				p.Name, p.Name, p.Name, p.Name)
   325  		}
   326  	default:
   327  		for _, p := range Pump {
   328  			fmt.Fprintf(fo, "%1d %3.1f ", p.Qdy.Hrs, p.Qdy.D)
   329  			fmt.Fprintf(fo, "%1d %2.0f ", p.Qdy.Mxtime, p.Qdy.Mx)
   330  			fmt.Fprintf(fo, "%1d %3.1f ", p.Edy.Hrs, p.Edy.D)
   331  			fmt.Fprintf(fo, "%1d %2.0f ", p.Edy.Mxtime, p.Edy.Mx)
   332  			fmt.Fprintf(fo, "%1d %3.1f ", p.Gdy.Hrs, p.Gdy.D)
   333  			fmt.Fprintf(fo, "%1d %2.0f\n", p.Gdy.Mxtime, p.Gdy.Mx)
   334  		}
   335  	}
   336  }
   337  
   338  func pumpmonprt(fo io.Writer, id int, Pump []*PUMP) {
   339  	switch id {
   340  	case 0:
   341  		if len(Pump) > 0 {
   342  			fmt.Fprintf(fo, "%s  %d\n", PUMP_TYPE, len(Pump))
   343  		}
   344  		for _, p := range Pump {
   345  			fmt.Fprintf(fo, " %s 1 12\n", p.Name)
   346  		}
   347  	case 1:
   348  		for _, p := range Pump {
   349  			fmt.Fprintf(fo, "%s_Hq H d %s_Q Q f %s_tq h d %s_Qm q f\n",
   350  				p.Name, p.Name, p.Name, p.Name)
   351  			fmt.Fprintf(fo, "%s_He H d %s_E E f %s_te h d %s_Em e f\n",
   352  				p.Name, p.Name, p.Name, p.Name)
   353  			fmt.Fprintf(fo, "%s_Hg H d %s_G M f %s_tg h d %s_Gm m f\n\n",
   354  				p.Name, p.Name, p.Name, p.Name)
   355  		}
   356  	default:
   357  		for _, p := range Pump {
   358  			fmt.Fprintf(fo, "%1d %3.1f ", p.MQdy.Hrs, p.MQdy.D)
   359  			fmt.Fprintf(fo, "%1d %2.0f ", p.MQdy.Mxtime, p.MQdy.Mx)
   360  			fmt.Fprintf(fo, "%1d %3.1f ", p.MEdy.Hrs, p.MEdy.D)
   361  			fmt.Fprintf(fo, "%1d %2.0f ", p.MEdy.Mxtime, p.MEdy.Mx)
   362  			fmt.Fprintf(fo, "%1d %3.1f ", p.MGdy.Hrs, p.MGdy.D)
   363  			fmt.Fprintf(fo, "%1d %2.0f\n", p.MGdy.Mxtime, p.MGdy.Mx)
   364  		}
   365  	}
   366  }
   367  func pumpmtprt(fo io.Writer, id int, Pump []*PUMP, Mo, tt int) {
   368  	switch id {
   369  	case 0:
   370  		if len(Pump) > 0 {
   371  			fmt.Fprintf(fo, "%s %d\n", PUMP_TYPE, len(Pump))
   372  		}
   373  		for _, p := range Pump {
   374  			fmt.Fprintf(fo, " %s 1 1\n", p.Name)
   375  		}
   376  	case 1:
   377  		for _, p := range Pump {
   378  			fmt.Fprintf(fo, "%s_E E f \n", p.Name)
   379  		}
   380  	default:
   381  		for _, p := range Pump {
   382  			fmt.Fprintf(fo, " %.2f \n", p.MtEdy[Mo-1][tt-1].D*Cff_kWh)
   383  		}
   384  	}
   385  }
   386  
   387  func NewPFCMP() *PFCMP {
   388  	Pfcmp := new(PFCMP)
   389  	Pfcmp.pftype = ' '
   390  	Pfcmp.Type = ""
   391  	matinit(Pfcmp.dblcoeff[:], 5)
   392  	return Pfcmp
   393  }
   394  
   395  func PFcmpdata() []*PFCMP {
   396  	var s string
   397  	var c byte
   398  	var i int
   399  
   400  	fl, err := os.Open("pumpfanlst.efl")
   401  	if err != nil {
   402  		Eprint(" file ", "pumpfanlst.efl")
   403  	}
   404  	Pfcmp := make([]*PFCMP, 0)
   405  
   406  	for {
   407  		_, err := fmt.Fscanf(fl, "%s", &s)
   408  		if err != nil || s[0] == '*' {
   409  			break
   410  		}
   411  
   412  		if s == "!" {
   413  			for {
   414  				_, err = fmt.Fscanf(fl, "%c", &c)
   415  				if err != nil || c == '\n' {
   416  					break
   417  				}
   418  			}
   419  		} else {
   420  			pfcmp := NewPFCMP()
   421  
   422  			if s == string(PUMP_TYPE) {
   423  				pfcmp.pftype = PUMP_PF
   424  			} else if s == string(FAN_TYPE) {
   425  				pfcmp.pftype = FAN_PF
   426  			} else {
   427  				Eprint("<pumpfanlst.efl>", s)
   428  			}
   429  
   430  			_, err = fmt.Fscanf(fl, "%s", &s)
   431  			if err != nil {
   432  				break
   433  			}
   434  
   435  			pfcmp.Type = s
   436  
   437  			i = 0
   438  			for {
   439  				_, err = fmt.Fscanf(fl, "%s", &s)
   440  				if err != nil || s[0] == ';' {
   441  					break
   442  				}
   443  
   444  				var err error
   445  				pfcmp.dblcoeff[i], err = strconv.ParseFloat(s, 64)
   446  				if err != nil {
   447  					panic(err)
   448  				}
   449  				i++
   450  			}
   451  
   452  			Pfcmp = append(Pfcmp, pfcmp)
   453  		}
   454  	}
   455  
   456  	fl.Close()
   457  
   458  	return Pfcmp
   459  }