github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/escntllb_s.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  /* escntllb_s.c */
    17  
    18  package eeslism
    19  
    20  import (
    21  	"errors"
    22  	"strings"
    23  )
    24  
    25  /*  システム変数名、内部変数名、スケジュール名のポインター  */
    26  
    27  func ctlvptr(s string, Simc *SIMCONTL, Compnt []*COMPNT, Mpath []*MPATH, Wd *WDAT, Exsf *EXSFS, Schdl *SCHDL) (VPTR, VPTR, error) {
    28  	var err error
    29  	var vptr, vpath VPTR
    30  
    31  	if i, err2 := idsch(s, Schdl.Sch, ""); err2 == nil {
    32  		// 年間の設定値スケジュールへのポインターを作成する
    33  		vptr = VPTR{
    34  			Ptr:  &Schdl.Val[i],
    35  			Type: VAL_CTYPE,
    36  		}
    37  	} else if i, iderr := idscw(s, Schdl.Scw, ""); iderr == nil {
    38  		// 年間の切替スケジュールへのポインターを作成する
    39  		vptr = VPTR{
    40  			Ptr:  &Schdl.Isw[i],
    41  			Type: SW_CTYPE,
    42  		}
    43  	} else {
    44  		// 経路名、システム変数名、内部変数名のポインターを作成する
    45  		vptr, vpath, err = kynameptr(s, Simc, Compnt, Mpath, Wd, Exsf)
    46  	}
    47  
    48  	//Errprint(1, "<ctlvptr>", s)
    49  	return vptr, vpath, err
    50  }
    51  
    52  /* ----------------------------------------------------------------- */
    53  
    54  // システム経路名、要素名、システム変数名、内部変数名の分離
    55  func strkey(s string) ([]string, int) {
    56  	if len(s) == 0 {
    57  		return nil, 0
    58  	}
    59  
    60  	key := strings.Split(s, "_")
    61  	return key, len(key)
    62  }
    63  
    64  /* ----------------------------------------------------------------- */
    65  
    66  // 経路名、システム変数名、内部変数名のポインターを作成する
    67  func kynameptr(s string, Simc *SIMCONTL, _Compnt []*COMPNT,
    68  	Mpath []*MPATH, Wd *WDAT, Exsf *EXSFS) (VPTR, VPTR, error) {
    69  	var err error
    70  	var vptr, vpath VPTR
    71  
    72  	key := strings.Split(s, "_")
    73  	nk := len(key)
    74  
    75  	if nk > 0 {
    76  		switch key[0] {
    77  		case "Ta":
    78  			vptr = VPTR{
    79  				Type: VAL_CTYPE,
    80  				Ptr:  &Wd.T,
    81  			}
    82  		case "xa":
    83  			vptr = VPTR{
    84  				Type: VAL_CTYPE,
    85  				Ptr:  &Wd.X,
    86  			}
    87  		case "RHa":
    88  			vptr = VPTR{
    89  				Type: VAL_CTYPE,
    90  				Ptr:  &Wd.RH,
    91  			}
    92  		case "ha":
    93  			vptr = VPTR{
    94  				Type: VAL_CTYPE,
    95  				Ptr:  &Wd.H,
    96  			}
    97  		case "Twsup":
    98  			vptr = VPTR{
    99  				Type: VAL_CTYPE,
   100  				Ptr:  &Wd.Twsup,
   101  			}
   102  		case "Ihol":
   103  			vptr = VPTR{
   104  				Type: VAL_CTYPE,
   105  				Ptr:  &Wd.Ihor,
   106  			}
   107  		default:
   108  			// // 傾斜面名称の検索
   109  			if Exsf != nil {
   110  				for _, Exs := range Exsf.Exs {
   111  					if key[0] == Exs.Name {
   112  						switch key[1] {
   113  						case "Idre":
   114  							// 傾斜面への入射直達日射量
   115  							vptr = VPTR{
   116  								Type: VAL_CTYPE,
   117  								Ptr:  &Exs.Idre,
   118  							}
   119  							return vptr, vpath, nil
   120  						case "Idf":
   121  							// 傾斜面への入射拡散日射量
   122  							vptr = VPTR{
   123  								Type: VAL_CTYPE,
   124  								Ptr:  &Exs.Idf,
   125  							}
   126  							return vptr, vpath, nil
   127  						case "Iw":
   128  							// 傾斜面への入射全日射量
   129  							vptr = VPTR{
   130  								Type: VAL_CTYPE,
   131  								Ptr:  &Exs.Iw,
   132  							}
   133  							return vptr, vpath, nil
   134  						}
   135  					}
   136  				}
   137  			}
   138  
   139  			if len(Mpath) > 0 {
   140  				vptr, vpath, err = pathvptr(nk, key, Mpath)
   141  			} else {
   142  				err = errors.New("Nmpath == 0")
   143  			}
   144  
   145  			if err != nil {
   146  				if Simc.Nvcfile > 0 {
   147  					vptr, err = vcfptr(key, Simc)
   148  				} else {
   149  					err = errors.New("Simc.Nvcfile == 0")
   150  				}
   151  			}
   152  
   153  			if err != nil {
   154  				for i := range _Compnt {
   155  					Compnt := _Compnt[i]
   156  					if key[0] == Compnt.Name {
   157  						vptr, err = compntvptr(nk, key, Compnt)
   158  						if err != nil {
   159  							e := Compnt.Eqptype
   160  							switch e {
   161  							case ROOM_TYPE:
   162  								if SIMUL_BUILDG {
   163  									vptr, err = roomvptr(nk, key, Compnt.Eqp.(*ROOM))
   164  								}
   165  							case REFACOMP_TYPE:
   166  								vptr, err = refaswptr(key, Compnt.Eqp.(*REFA))
   167  							case HCLOAD_TYPE, HCLOADW_TYPE, RMAC_TYPE, RMACD_TYPE:
   168  								vptr, err = hcldswptr(key, Compnt.Eqp.(*HCLOAD))
   169  							case VAV_TYPE, VWV_TYPE:
   170  								/* VAV Satoh Debug 2001/1/19 */
   171  								vptr, err = vavswptr(key, Compnt.Eqp.(*VAV))
   172  							case COLLECTOR_TYPE:
   173  								vptr, err = collvptr(key, Compnt.Eqp.(*COLL))
   174  							case STANK_TYPE:
   175  								vptr, err = stankvptr(key, Compnt.Eqp.(*STANK))
   176  							case STHEAT_TYPE:
   177  								vptr, vpath, err = stheatvptr(key, Compnt.Eqp.(*STHEAT))
   178  							case DESI_TYPE:
   179  								// Satoh追加 デシカント槽 2013/10/23
   180  								vptr, err = Desivptr(key, Compnt.Eqp.(*DESI))
   181  							case PIPEDUCT_TYPE:
   182  								vptr, err = pipevptr(key, Compnt.Eqp.(*PIPE))
   183  							case RDPANEL_TYPE:
   184  								vptr, err = rdpnlvptr(key, Compnt.Eqp.(*RDPNL))
   185  							case VALV_TYPE, TVALV_TYPE:
   186  								vptr, err = valv_vptr(key, Compnt.Eqp.(*VALV))
   187  							default:
   188  								Eprint("CONTL", Compnt.Name)
   189  							}
   190  						}
   191  						break
   192  					}
   193  				}
   194  			}
   195  		}
   196  	} else {
   197  		err = errors.New("Some error")
   198  	}
   199  
   200  	if err != nil {
   201  		Eprint("<kynameptr>", s)
   202  	}
   203  
   204  	return vptr, vpath, err
   205  }
   206  
   207  /* ----------------------------------------------------------------- */
   208  
   209  // 経路名のポインター
   210  func pathvptr(nk int, key []string, Mpath []*MPATH) (VPTR, VPTR, error) {
   211  	var err error
   212  	var Plist, Plie *PLIST
   213  	var vptr, vpath VPTR
   214  
   215  	found := false
   216  	for _, Mp := range Mpath {
   217  		if string(key[0]) == Mp.Name {
   218  			vpath = VPTR{
   219  				Type: MAIN_CPTYPE,
   220  				Ptr:  Mp,
   221  			}
   222  
   223  			if nk == 1 || string(key[1]) == "control" {
   224  				vptr = VPTR{
   225  					Type: SW_CTYPE,
   226  					Ptr:  &Mp.Control,
   227  				}
   228  			}
   229  			found = true
   230  			break
   231  		}
   232  	}
   233  
   234  	if found == false {
   235  		err = errors.New("i == Nmpath")
   236  		Mpe := Mpath[len(Mpath)-1]
   237  
   238  		for _, Plist := range Mpe.Plist {
   239  			if Plist.Name != "" {
   240  				if key[0] == Plist.Name {
   241  					vpath = VPTR{
   242  						Type: LOCAL_CPTYPE,
   243  						Ptr:  Plist,
   244  					}
   245  
   246  					if nk == 1 || key[1] == "control" {
   247  						vptr = VPTR{
   248  							Type: SW_CTYPE,
   249  							Ptr:  &Plist.Control,
   250  						}
   251  					} else if key[1] == "G" {
   252  						vptr = VPTR{
   253  							Type: VAL_CTYPE,
   254  							Ptr:  &Plist.G,
   255  						}
   256  					}
   257  					break
   258  				}
   259  			}
   260  		}
   261  		if Plist == Plie {
   262  			err = errors.New("Plist == Plie")
   263  		}
   264  	}
   265  	return vptr, vpath, err
   266  }
   267  
   268  func Compntptr(name string, Compnt []*COMPNT) *COMPNT {
   269  	for i := range Compnt {
   270  		if name == Compnt[i].Name {
   271  			return Compnt[i]
   272  		}
   273  	}
   274  
   275  	return nil
   276  }
   277  
   278  /* ----------------------------------------------------------------- */
   279  
   280  // システム要素出口温度、湿度のポインター
   281  func compntvptr(nk int, key []string, Compnt *COMPNT) (VPTR, error) {
   282  	var i int
   283  	var err error
   284  	var vptr VPTR
   285  
   286  	if nk == 1 || key[1] == "control" {
   287  		etype := Compnt.Eqptype
   288  		if etype != VALV_TYPE && etype != TVALV_TYPE {
   289  			// ボイラなど機器自体の停止ではなく、燃焼の停止とする
   290  			Eo := Compnt.Elouts[0]
   291  			if etype == STHEAT_TYPE {
   292  				vptr.Ptr = &Compnt.Control
   293  			} else {
   294  				vptr.Ptr = &Eo.Control
   295  			}
   296  			vptr.Type = SW_CTYPE
   297  		} else {
   298  			v := Compnt.Eqp.(*VALV)
   299  			vptr = VPTR{
   300  				Ptr:  &v.X,
   301  				Type: VAL_CTYPE,
   302  			}
   303  			v.Org = 'y'
   304  		}
   305  	} else {
   306  		for i = 0; i < Compnt.Nout; i++ {
   307  			Eo := Compnt.Elouts[i]
   308  			if (Eo.Fluid == AIRa_FLD && string(key[1]) == "Taout") ||
   309  				(Eo.Fluid == AIRx_FLD && string(key[1]) == "xout") ||
   310  				(Eo.Fluid == WATER_FLD && string(key[1]) == "Twout") {
   311  				vptr = VPTR{
   312  					Ptr:  &Eo.Sysv,
   313  					Type: VAL_CTYPE,
   314  				}
   315  				break
   316  			}
   317  		}
   318  		if i == Compnt.Nout {
   319  			err = errors.New("i == Compnt.Nout")
   320  		}
   321  	}
   322  	return vptr, err
   323  }
   324  
   325  /* ----------------------------------------------------------------- */
   326  
   327  // 負荷計算を行うシステム要素の設定システム変数のポインターを作成します。
   328  // 負荷計算を行うシステム要素の設定システム変数のポインターを作成し、 vtr に保存します。
   329  // 内部では、 boildptr, refaldptr, hcldptr, pipeldsptr, rdpnlldsptr,roomldptr に処理を委譲します。
   330  func loadptr(loadcmp *COMPNT, load *ControlSWType, s string, _Compnt []*COMPNT) (VPTR, error) {
   331  	var Room *ROOM
   332  	var key []string
   333  	var idmrk byte = ' '
   334  	var err error
   335  	var vptr VPTR
   336  
   337  	key = strings.Split(s, "_")
   338  	nk := len(key)
   339  
   340  	if nk != 0 {
   341  		for i := range _Compnt {
   342  			Compnt := _Compnt[i]
   343  			if key[0] == Compnt.Name {
   344  				switch Compnt.Eqptype {
   345  				case BOILER_TYPE:
   346  					vptr, err = boildptr(load, key, Compnt.Eqp.(*BOI))
   347  					idmrk = 't'
   348  				case REFACOMP_TYPE:
   349  					vptr, err = refaldptr(load, key, Compnt.Eqp.(*REFA))
   350  					idmrk = 't'
   351  				case HCLOAD_TYPE, RMAC_TYPE, RMACD_TYPE:
   352  					if SIMUL_BUILDG {
   353  						vptr, err = hcldptr(load, key, Compnt.Eqp.(*HCLOAD), &idmrk)
   354  					}
   355  				case PIPEDUCT_TYPE:
   356  					if SIMUL_BUILDG {
   357  						vptr, err = pipeldsptr(load, key, Compnt.Eqp.(*PIPE), &idmrk)
   358  					}
   359  				case RDPANEL_TYPE:
   360  					if SIMUL_BUILDG {
   361  						Rdpnl := Compnt.Eqp.(*RDPNL)
   362  						vptr, err = rdpnlldsptr(load, key, Rdpnl, &idmrk)
   363  						if loadcmp != nil && loadcmp.Eqptype == OMVAV_TYPE {
   364  							Rdpnl.OMvav = loadcmp.Eqp.(*OMVAV)
   365  							Rdpnl.OMvav.Omwall = Rdpnl.sd[0]
   366  						}
   367  					}
   368  				case ROOM_TYPE:
   369  					if SIMUL_BUILDG {
   370  						Room = Compnt.Eqp.(*ROOM)
   371  						if Room.rmld == nil {
   372  							Room.rmld = new(RMLOAD)
   373  							if Room.rmld == nil {
   374  								Ercalloc(1, "roomldptr")
   375  							}
   376  
   377  							key = strings.Split(s, "_")
   378  
   379  							R := Room.rmld
   380  							R.loadt = nil
   381  							R.loadx = nil
   382  							R.FOTN = nil
   383  							R.FOPL = nil
   384  
   385  							if loadcmp != nil && loadcmp.Eqptype == VAV_TYPE {
   386  								Room.VAVcontrl = loadcmp.Eqp.(*VAV)
   387  							}
   388  						}
   389  						vptr, err = roomldptr(load, key, Room, &idmrk)
   390  					}
   391  				}
   392  
   393  				if err == nil {
   394  					if loadcmp == nil {
   395  						loadcmp = Compnt
   396  					}
   397  
   398  					Eo := Compnt.Elouts[0]
   399  					eold := loadcmp.Elouts[0]
   400  
   401  					if idmrk == 'x' {
   402  						Eo = Compnt.Elouts[1]
   403  						eold = loadcmp.Elouts[1]
   404  					}
   405  
   406  					Eo.Eldobj = eold
   407  					eold.Emonitr = Eo
   408  
   409  					break
   410  				}
   411  			} else {
   412  				err = errors.New("")
   413  			}
   414  		}
   415  		return vptr, err
   416  	} else {
   417  		return vptr, errors.New("s is empty")
   418  	}
   419  }