github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/mcomvav.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  /*  mcomvav.c  */
    17  
    18  /*  OM用変風量コントローラ */
    19  
    20  package eeslism
    21  
    22  import (
    23  	"fmt"
    24  	"math"
    25  	"strconv"
    26  	"strings"
    27  )
    28  
    29  /* ------------------------------------------ */
    30  
    31  /* 機器仕様入力      */
    32  
    33  /*---- Satoh OMVAV  2010/12/16 ----*/
    34  func OMVAVdata(s string, OMvavca *OMVAVCA) int {
    35  	id := 0
    36  
    37  	st := strings.Split(s, "=")
    38  	if len(st) == 1 {
    39  		OMvavca.Name = s
    40  		OMvavca.Gmax = -999.0
    41  		OMvavca.Gmin = -999.0
    42  	} else {
    43  		switch st[0] {
    44  		case "Gmax":
    45  			dt, err := strconv.ParseFloat(st[1], 64)
    46  			if err != nil {
    47  				id = 1
    48  				break
    49  			}
    50  			OMvavca.Gmax = dt
    51  		case "Gmin":
    52  			dt, err := strconv.ParseFloat(st[1], 64)
    53  			if err != nil {
    54  				id = 1
    55  				break
    56  			}
    57  			OMvavca.Gmin = dt
    58  		default:
    59  			id = 1
    60  		}
    61  	}
    62  
    63  	return id
    64  }
    65  
    66  func CollTout(Tcin, G float64, Sd *RMSRF) float64 {
    67  	var Kc, ca float64
    68  
    69  	Wall := Sd.mw.wall
    70  	if Wall.chrRinput {
    71  		Kc = Sd.dblKc
    72  	} else {
    73  		Kc = Wall.Kc
    74  	}
    75  
    76  	return Sd.Tcole - (Sd.Tcole-Tcin)*math.Exp(-Kc*Sd.A/(ca*G))
    77  }
    78  
    79  func OMflowcalc(OMvav *OMVAV, Wd *WDAT) float64 {
    80  	var Tcout float64
    81  	var CollTout func(Tcin, G float64, Sd *RMSRF) float64
    82  	var loop int
    83  
    84  	G := 0.0
    85  	//EPS := 0.00001
    86  	dGp := 0.01
    87  	LoopMax := 100
    88  
    89  	if OMvav.Plist.Control != OFF_SW {
    90  		omwall := OMvav.Omwall
    91  		//Wall := omwall.mw.wall
    92  		Tcin := Wd.T
    93  		Tcoutset := omwall.rpnl.Toset
    94  		G0 := OMvav.Cat.Gmin
    95  		//dG := OMvav.Cat.Gmin * 0.001
    96  		G2 := OMvav.Cat.Gmax
    97  
    98  		/********************************************************/
    99  		// 棟温度の計算(最小風量の場合)
   100  		Tcin = Wd.T
   101  		for i := 0; i < OMvav.Nrdpnl; i++ {
   102  			Sd := OMvav.Rdpnl[i].sd[0]
   103  			Tcout := CollTout(Tcin, G0, Sd)
   104  
   105  			// 集熱器の入り口温度は上流集熱器の出口温度
   106  			Tcin = Tcout
   107  		}
   108  		Tcoutmin := Tcout
   109  
   110  		// 棟温度の計算(最大風量の場合)
   111  		Tcin = Wd.T
   112  		for i := 0; i < OMvav.Nrdpnl; i++ {
   113  			Sd := OMvav.Rdpnl[i].sd[0]
   114  			Tcout := CollTout(Tcin, G2, Sd)
   115  
   116  			// 集熱器の入り口温度は上流集熱器の出口温度
   117  			Tcin = Tcout
   118  		}
   119  		Tcoutmax := Tcout
   120  
   121  		//fmt.Printf("Tcoutmin=%.2f Tcoutmax=%.2f\n", Tcoutmin, Tcoutmax)
   122  		if Tcoutmin < Tcoutset {
   123  			G = G0
   124  		} else if Tcoutmax > Tcoutset {
   125  			G = G2
   126  		} else {
   127  			// ニュートンラプソン法のループ
   128  			for loop := 0; loop < LoopMax; loop++ {
   129  				Tcin := Wd.T
   130  				G := G0 + float64(loop)*dGp*(G2-G0)
   131  				for i := 0; i < OMvav.Nrdpnl; i++ {
   132  					Sd := OMvav.Rdpnl[i].sd[0]
   133  					Tcout := CollTout(Tcin, G, Sd)
   134  
   135  					// 集熱器の入り口温度は上流集熱器の出口温度
   136  					Tcin = Tcout
   137  				}
   138  
   139  				FG := Tcoutset - Tcout
   140  
   141  				if FG > 0.0 {
   142  					break
   143  				}
   144  			}
   145  
   146  			if loop == LoopMax {
   147  				fmt.Printf("%s  風量が収束しませんでした。 G=%f\n", OMvav.Name, G)
   148  			}
   149  		}
   150  		G = math.Min(math.Max(OMvav.Cat.Gmin, G), OMvav.Cat.Gmax)
   151  	}
   152  
   153  	OMvav.G = G
   154  
   155  	return G
   156  }
   157  
   158  func OMvavControl(OMvav *OMVAV, Compnt []*COMPNT) {
   159  	colname := strings.Split(OMvav.Cmp.Omparm, "-")
   160  	OMvav.Nrdpnl = len(colname)
   161  
   162  	for j, name := range colname {
   163  		for i := 0; i < len(Compnt); i++ {
   164  			if name == Compnt[i].Name {
   165  				OMvav.Rdpnl[j] = Compnt[i].Eqp.(*RDPNL)
   166  				break
   167  			}
   168  		}
   169  	}
   170  }
   171  
   172  func strCompcount(st string, key byte) int {
   173  	count := 0
   174  
   175  	for i := 0; i < len(st); i++ {
   176  		if st[i] == key {
   177  			count++
   178  		}
   179  	}
   180  
   181  	return count
   182  }