github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/blroomvptr.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  package eeslism
    17  
    18  import "errors"
    19  
    20  /* 室及び関連システム変数、内部変数のポインター  */
    21  
    22  func roomvptr(Nk int, key []string, Room *ROOM) (VPTR, error) {
    23  	var vptr VPTR
    24  	vptr.Ptr = nil
    25  
    26  	if Nk == 2 {
    27  		switch string(key[1]) {
    28  		case "Tr":
    29  			vptr.Ptr = &Room.Tr
    30  			vptr.Type = VAL_CTYPE
    31  		case "xr":
    32  			vptr.Ptr = &Room.xr
    33  			vptr.Type = VAL_CTYPE
    34  		case "RH":
    35  			vptr.Ptr = &Room.RH
    36  			vptr.Type = VAL_CTYPE
    37  		case "PMV":
    38  			vptr.Ptr = &Room.PMV
    39  			vptr.Type = VAL_CTYPE
    40  		case "Tsav":
    41  			vptr.Ptr = &Room.Tsav
    42  			vptr.Type = VAL_CTYPE
    43  		case "Tot":
    44  			vptr.Ptr = &Room.Tot
    45  			vptr.Type = VAL_CTYPE
    46  		case "hr":
    47  			vptr.Ptr = &Room.hr
    48  			vptr.Type = VAL_CTYPE
    49  		}
    50  	} else if Nk == 3 {
    51  		for i := 0; i < Room.N; i++ {
    52  			Sd := Room.rsrf[i]
    53  			if string(key[1]) == Sd.Name {
    54  				switch string(key[2]) {
    55  				case "Ts":
    56  					vptr.Ptr = &Sd.Ts
    57  					vptr.Type = VAL_CTYPE
    58  				case "Tmrt":
    59  					vptr.Ptr = &Sd.Tmrt
    60  					vptr.Type = VAL_CTYPE
    61  				case "Te":
    62  					vptr.Ptr = &Sd.Tcole
    63  					vptr.Type = VAL_CTYPE
    64  				}
    65  			}
    66  		}
    67  	}
    68  
    69  	if vptr.Ptr == nil {
    70  		return vptr, errors.New("roomvptr error")
    71  	}
    72  
    73  	return vptr, nil
    74  }
    75  
    76  /* ------------------------------------------- */
    77  
    78  /* 室負荷計算時の設定値ポインター */
    79  
    80  func roomldptr(load *ControlSWType, key []string, Room *ROOM, idmrk *byte) (VPTR, error) {
    81  	var err error
    82  	var i int
    83  	var Sd *RMSRF
    84  	var vptr VPTR
    85  
    86  	if key[1] == "Tr" {
    87  		vptr.Ptr = &Room.rmld.Tset
    88  		vptr.Type = VAL_CTYPE
    89  		Room.rmld.loadt = load
    90  		Room.rmld.tropt = 'a'
    91  		*idmrk = 't'
    92  	} else if key[1] == "Tot" {
    93  		vptr.Ptr = &Room.rmld.Tset
    94  		vptr.Type = VAL_CTYPE
    95  		Room.rmld.loadt = load
    96  		Room.rmld.tropt = 'o'
    97  		*idmrk = 't'
    98  	} else if key[1] == "RH" {
    99  		vptr.Ptr = &Room.rmld.Xset
   100  		vptr.Type = VAL_CTYPE
   101  		Room.rmld.loadx = load
   102  		Room.rmld.hmopt = 'r'
   103  		*idmrk = 'x'
   104  	} else if key[1] == "Tdp" {
   105  		vptr.Ptr = &Room.rmld.Xset
   106  		vptr.Type = VAL_CTYPE
   107  		Room.rmld.loadx = load
   108  		Room.rmld.hmopt = 'd'
   109  		*idmrk = 'x'
   110  	} else if key[1] == "xr" {
   111  		vptr.Ptr = &Room.rmld.Xset
   112  		vptr.Type = VAL_CTYPE
   113  		Room.rmld.loadx = load
   114  		Room.rmld.hmopt = 'x'
   115  		*idmrk = 'x'
   116  	} else if len(key) > 2 && key[2] == "Ts" {
   117  
   118  		for i = 0; i < Room.N; i++ {
   119  			Sd = Room.rsrf[i]
   120  
   121  			if Sd.Name == key[1] {
   122  				vptr.Ptr = &Sd.Ts
   123  				vptr.Type = VAL_CTYPE
   124  				Room.rmld.loadt = load
   125  				*idmrk = 't'
   126  				err = nil
   127  				break
   128  			}
   129  			err = errors.New("Surface not found: " + Sd.Name)
   130  		}
   131  	} else {
   132  		err = errors.New("'Tr', 'Tot', 'RH', 'Tdp', 'xr' or '<roomname> Ts' are expected")
   133  	}
   134  
   135  	return vptr, err
   136  }
   137  
   138  /* ------------------------------------------- */
   139  
   140  /* 室負荷計算時のスケジュール設定 */
   141  
   142  func roomldschd(Room *ROOM) {
   143  	var Eo *ELOUT
   144  	var rmld *RMLOAD
   145  
   146  	if rmld = Room.rmld; rmld != nil {
   147  		Eo = Room.cmp.Elouts[0]
   148  		if rmld.loadt != nil {
   149  			if Eo == Eo.Eldobj || Eo.Eldobj.Control != OFF_SW {
   150  				if rmld.Tset > TEMPLIMIT {
   151  					Eo.Sysv = rmld.Tset
   152  					Room.Tr = rmld.Tset
   153  					Eo.Control = LOAD_SW
   154  				} else {
   155  					if Room.VAVcontrl != nil {
   156  						Room.VAVcontrl.Cmp.Control = OFF_SW
   157  						Room.VAVcontrl.Cmp.Elouts[0].Control = OFF_SW
   158  					}
   159  				}
   160  			}
   161  		}
   162  
   163  		Eo = Room.cmp.Elouts[1]
   164  		if rmld.loadx != nil {
   165  			if Eo == Eo.Eldobj || Eo.Eldobj.Control != OFF_SW {
   166  				switch rmld.hmopt {
   167  				case 'r':
   168  					// 相対湿度
   169  					if rmld.Xset > 0.0 {
   170  						Eo.Sysv = FNXtr(Room.Tr, rmld.Xset)
   171  						Eo.Control = LOAD_SW
   172  					}
   173  				case 'd':
   174  					// 露点温度
   175  					if rmld.Xset > TEMPLIMIT {
   176  						Eo.Sysv = FNXp(FNPws(rmld.Xset))
   177  						Eo.Control = LOAD_SW
   178  					}
   179  				case 'x':
   180  					// 絶対湿度
   181  					if rmld.Xset > 0.0 {
   182  						Eo.Sysv = rmld.Xset
   183  						Eo.Control = LOAD_SW
   184  					}
   185  				}
   186  			}
   187  		}
   188  	}
   189  }