github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/mcvalv.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  /*  mcvav.c  */
    17  
    18  /*  VALV */
    19  
    20  package eeslism
    21  
    22  import (
    23  	"errors"
    24  	"fmt"
    25  	"math"
    26  	"strings"
    27  )
    28  
    29  /* ------------------------------------------ */
    30  
    31  func (eqsys *EQSYS) Valvcountreset() {
    32  	for _, v := range eqsys.Valv {
    33  		v.Count = 0
    34  	}
    35  }
    36  
    37  /***********************************************/
    38  
    39  func (eqsys *EQSYS) Valvcountinc() {
    40  	for _, v := range eqsys.Valv {
    41  		v.Count++
    42  	}
    43  }
    44  
    45  // 通常はバルブの上流の流量に比率を乗じるが、基準となるOMvavが指定されている場合には、この流量に対する比率とする
    46  // OMvavが指定されているときだけの対応
    47  func Valvinit(Valv []*VALV, Mpath []*MPATH) {
    48  	for _, v := range Valv {
    49  		if v.Cmp.MonPlistName != "" {
    50  			for _, mpath := range Mpath {
    51  				for _, Plist := range mpath.Plist {
    52  					if v.Cmp.MonPlistName == Plist.Plistname {
    53  						v.MonPlist = Plist
    54  						v.MGo = &Plist.G
    55  
    56  						if v.Cmb != nil {
    57  							CValv := v.Cmb.Eqp.(*VALV)
    58  							CValv.MonPlist = Plist
    59  							CValv.MGo = &Plist.G
    60  						}
    61  						break
    62  					}
    63  				}
    64  			}
    65  		} else {
    66  			Pelm := v.Plist.Pelm[len(v.Plist.Pelm)-1]
    67  			v.MGo = Pelm.Cmp.Elouts[0].Lpath.Go
    68  			v.MonPlist = Pelm.Cmp.Elouts[0].Lpath
    69  
    70  			if v.Cmb != nil {
    71  				CValv := v.Cmb.Eqp.(*VALV)
    72  				CValv.MonPlist = v.MonPlist
    73  				CValv.MGo = &v.MonPlist.G
    74  			}
    75  		}
    76  	}
    77  }
    78  
    79  func Valvene(Valv []*VALV, Valvreset *int) {
    80  	var etype EqpType
    81  	var T1, T2 float64
    82  	var Vcb *VALV
    83  	var r float64
    84  
    85  	for _, v := range Valv {
    86  		etype = v.Cmp.Eqptype
    87  		if etype == TVALV_TYPE && v.Org == 'y' {
    88  			if v.Mon.Elouts[0].Control != OFF_SW {
    89  				T1 = *v.Tin
    90  				Vcb = v.Cmb.Eqp.(*VALV)
    91  				T2 = *Vcb.Tin
    92  
    93  				if math.Abs(*v.Tout-*v.Tset) >= 1.0e-3 && math.Abs(T1-T2) >= 1.0e-3 {
    94  					r = (*v.Tset - T2) / (T1 - T2)
    95  					r = math.Min(1.0, math.Max(r, 0.0))
    96  					v.X = r
    97  					Vcb.X = 1.0 - r
    98  
    99  					v.Plist.Gcalc = r * *v.MGo
   100  					Vcb.Plist.Gcalc = (1.0 - r) * *v.MGo
   101  					(*Valvreset)++
   102  
   103  					if DEBUG {
   104  						fmt.Printf("<Valvene> Valvname=%s G=%f\n", v.Name, v.Plist.G)
   105  						fmt.Printf("    T1=%.1f T2=%.1f Tset=%.1f\n", T1, T2, *v.Tset)
   106  					}
   107  				} else {
   108  					v.Plist.Gcalc = v.X * *v.MGo
   109  					Vcb.Plist.Gcalc = (1.0 - v.X) * *v.MGo
   110  					(*Valvreset)++
   111  				}
   112  			}
   113  		}
   114  	}
   115  }
   116  
   117  /************************************************************************/
   118  
   119  func ValvControl(fi *EeTokens, Compnt []*COMPNT, Schdl *SCHDL, Simc *SIMCONTL, Wd *WDAT, vptr *VPTR) {
   120  	var s string
   121  	var Valv, Vb *VALV
   122  	var Vc *COMPNT
   123  	var k, i int
   124  	var elins *ELIN
   125  	var Pelm *PELM
   126  	var err error
   127  
   128  	Vb = nil
   129  	s = fi.GetToken()
   130  
   131  	ad := fi.GetPos()
   132  
   133  	Vc = Compntptr(s, Compnt)
   134  	if Vc == nil {
   135  		Eprint("<CONTRL>", s)
   136  	}
   137  
   138  	vptr.Ptr = &Vc.Control
   139  	vptr.Type = SW_CTYPE
   140  
   141  	Valv = Vc.Eqp.(*VALV)
   142  	Valv.Org = 'y'
   143  	for fi.IsEnd() == false {
   144  		s = fi.GetToken()
   145  
   146  		if strings.HasPrefix(s, ";") {
   147  			fi.RestorePos(ad)
   148  			break
   149  		}
   150  
   151  		if s == "-init" {
   152  			s = fi.GetToken()
   153  			ad = fi.GetPos()
   154  
   155  			if k, err = idsch(s, Schdl.Sch, ""); err == nil {
   156  				Valv.Xinit = &Schdl.Val[k]
   157  			} else {
   158  				Valv.Xinit = envptr(s, Simc, Compnt, Wd, nil)
   159  			}
   160  		} else if s == "-Tout" {
   161  			s = fi.GetToken()
   162  			ad = fi.GetPos()
   163  			if k, err = idsch(s, Schdl.Sch, ""); err == nil {
   164  				Valv.Tset = &Schdl.Val[k]
   165  			} else {
   166  				Valv.Tset = envptr(s, Simc, Compnt, Wd, nil)
   167  			}
   168  
   169  			Pelm = Valv.Plist.Pelm[len(Valv.Plist.Pelm)-1]
   170  			Valv.Mon = Pelm.Cmp
   171  			Valv.Tout = &Valv.Mon.Elouts[0].Sysv
   172  			Valv.MGo = &Pelm.Cmp.Elouts[0].Lpath.G
   173  			Vb = Valv.Cmb.Eqp.(*VALV)
   174  			Vb.MGo = &Pelm.Cmp.Elouts[0].Lpath.G
   175  
   176  			if Valv.Plist.Go == nil {
   177  				Vb = Valv.Cmb.Eqp.(*VALV)
   178  				Valv.Plist.Go = Valv.Mon.Elouts[0].Lpath.Go
   179  				Vb.Plist.Go = Valv.Mon.Elouts[0].Lpath.Go
   180  			}
   181  		}
   182  	}
   183  
   184  	Pelm = Valv.Plist.Pelm[len(Valv.Plist.Pelm)-1]
   185  	elins = Pelm.Cmp.Elins[0]
   186  
   187  	for i = 0; i < Pelm.Cmp.Nin; i++ {
   188  		if elins.Lpath.Valv.Name == Valv.Name {
   189  			Valv.Tin = &elins.Sysvin
   190  		} else {
   191  			Vb.Tin = &elins.Sysvin
   192  		}
   193  	}
   194  }
   195  
   196  // バルブの内部変数へのポインタ
   197  func valv_vptr(key []string, Valv *VALV) (VPTR, error) {
   198  	var err error
   199  	var vptr VPTR
   200  
   201  	if strings.Compare(key[1], "value") == 0 {
   202  		vptr.Ptr = &Valv.X
   203  		vptr.Type = VAL_CTYPE
   204  	} else {
   205  		err = errors.New("'value' is expected")
   206  	}
   207  
   208  	return vptr, err
   209  }