github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/mchcload.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  /*  hcload.c  */
    17  
    18  /*  空調負荷仮想機器  */
    19  
    20  package eeslism
    21  
    22  import (
    23  	"errors"
    24  	"fmt"
    25  	"io"
    26  	"math"
    27  	"strconv"
    28  	"strings"
    29  	"unicode"
    30  )
    31  
    32  /* ------------------------------------------ */
    33  
    34  /*  コイル出口空気温湿度に関する変数割当  */
    35  
    36  func Hclelm(Hcload []*HCLOAD) {
    37  	for _, hc := range Hcload {
    38  		// 湿りコイルの場合
    39  		if hc.Wet {
    40  			// 空気温度出口の計算式
    41  			eo := hc.Cmp.Elouts[0]
    42  			// elo:空気湿度出口の計算式
    43  			elo := hc.Cmp.Elouts[1]
    44  			// elini:空気湿度出口の要素方程式の2つ目の変数
    45  			elini := elo.Elins[1]
    46  			// 空気絶対湿度の要素方程式の2つ目の変数にupo、upvに空気出口をつなげる
    47  			elini.Upo = eo
    48  			elini.Upv = eo
    49  		}
    50  
    51  		if hc.Type == 'W' {
    52  			eo := hc.Cmp.Elouts[0]
    53  			elo := hc.Cmp.Elouts[2]
    54  			elini := elo.Elins[1]
    55  			elin := elo.Elins[3]
    56  
    57  			elini.Upo = eo.Elins[0].Upo
    58  			elini.Upv = eo.Elins[0].Upo
    59  			elin.Upo = eo
    60  			elin.Upv = eo
    61  
    62  			eo = hc.Cmp.Elouts[1]
    63  			elini = elo.Elins[2]
    64  			elin = elo.Elins[4]
    65  
    66  			elini.Upo = eo.Elins[0].Upo
    67  			elini.Upv = eo.Elins[0].Upo
    68  			elin.Upo = eo
    69  			elin.Upv = eo
    70  		}
    71  	}
    72  }
    73  
    74  /* -------------------------------------------------- */
    75  
    76  /* ルームエアコン(事業主基準モデル)機器仕様の入力処理 */
    77  
    78  func rmacdat(Hcld *HCLOAD) {
    79  	const (
    80  		ERRFMT = "%s (rmacdat)"
    81  		SCHAR  = 256
    82  	)
    83  	ss := Hcld.Cmp.Tparm
    84  
    85  	Hcld.Qhmax = -999.0
    86  	Hcld.Qh = -999.0
    87  	Hcld.COPc = -999.0
    88  	Hcld.COPh = -999.0
    89  	Hcld.Qcmax = 999.0
    90  	Hcld.Qc = 999.0
    91  
    92  	parseFloat := func(value string) (float64, error) {
    93  		return strconv.ParseFloat(value, 64)
    94  	}
    95  
    96  	for {
    97  		var s string
    98  		_, err := fmt.Sscanf(ss, "%s", &s)
    99  		if err != nil || strings.Contains(string(s), "*") {
   100  			break
   101  		}
   102  
   103  		ss = ss[len(s):]
   104  		ss = strings.TrimLeftFunc(ss, unicode.IsSpace)
   105  
   106  		keyValue := strings.SplitN(string(s), "=", 2)
   107  		if len(keyValue) != 2 {
   108  			Eprint("<rmacdat>", string(s))
   109  			continue
   110  		}
   111  
   112  		key, value := keyValue[0], keyValue[1]
   113  		switch key {
   114  		case "Qc":
   115  			if Hcld.Qc, err = parseFloat(value); err != nil {
   116  				panic(err)
   117  			}
   118  		case "Qcmax":
   119  			if Hcld.Qcmax, err = parseFloat(value); err != nil {
   120  				panic(err)
   121  			}
   122  		case "Qh":
   123  			if Hcld.Qh, err = parseFloat(value); err != nil {
   124  				panic(err)
   125  			}
   126  		case "Qhmax":
   127  			if Hcld.Qhmax, err = parseFloat(value); err != nil {
   128  				panic(err)
   129  			}
   130  		case "COPc":
   131  			if Hcld.COPc, err = parseFloat(value); err != nil {
   132  				panic(err)
   133  			}
   134  		case "COPh":
   135  			if Hcld.COPh, err = parseFloat(value); err != nil {
   136  				panic(err)
   137  			}
   138  		default:
   139  			Eprint("<rmacdat>", key)
   140  		}
   141  	}
   142  
   143  	if Hcld.Qc < 0.0 {
   144  		Hcld.rc = Hcld.Qcmax / Hcld.Qc
   145  		Hcld.Ec = -Hcld.Qc / Hcld.COPc
   146  	}
   147  	if Hcld.Qh > 0.0 {
   148  		Hcld.rh = Hcld.Qhmax / Hcld.Qh
   149  		Hcld.Eh = Hcld.Qh / Hcld.COPh
   150  	}
   151  }
   152  
   153  /* ルームエアコン(電中研モデル)機器仕様の入力処理 */
   154  
   155  func rmacddat(Hcld *HCLOAD) {
   156  	//Err := fmt.Sprintf(ERRFMT, "(rmacddat)")
   157  
   158  	ss := Hcld.Cmp.Tparm
   159  	Hcld.Qcmax, Hcld.Qc, Hcld.Qcmin = 999.0, 999.0, 999.0
   160  	Hcld.Ecmax, Hcld.Ec, Hcld.Ecmin, Hcld.Qh, Hcld.Qhmax, Hcld.Qhmin, Hcld.Ehmax, Hcld.Eh, Hcld.Ehmin = -999.0, -999.0, -999.0, -999.0, -999.0, -999.0, -999.0, -999.0, -999.0
   161  	Hcld.Gi, Hcld.Go = -999.0, -999.0
   162  
   163  	for {
   164  		var s string
   165  		_, err := fmt.Sscanf(ss, "%s", &s)
   166  		if err != nil {
   167  			break
   168  		}
   169  		ss = ss[len(s):]
   170  		for len(ss) > 0 && unicode.IsSpace(rune(ss[0])) {
   171  			ss = ss[1:]
   172  		}
   173  
   174  		if st := strings.IndexByte(s, '='); st != -1 {
   175  			key := s[:st]
   176  			value := s[st+1:]
   177  
   178  			switch key {
   179  			case "Qc":
   180  				Hcld.Qc, _ = strconv.ParseFloat(value, 64)
   181  			case "Qcmax":
   182  				Hcld.Qcmax, _ = strconv.ParseFloat(value, 64)
   183  			case "Qcmin":
   184  				Hcld.Qcmin, _ = strconv.ParseFloat(value, 64)
   185  			case "Ec":
   186  				Hcld.Ec, _ = strconv.ParseFloat(value, 64)
   187  			case "Ecmax":
   188  				Hcld.Ecmax, _ = strconv.ParseFloat(value, 64)
   189  			case "Ecmin":
   190  				Hcld.Ecmin, _ = strconv.ParseFloat(value, 64)
   191  			case "Qh":
   192  				Hcld.Qh, _ = strconv.ParseFloat(value, 64)
   193  			case "Qhmax":
   194  				Hcld.Qhmax, _ = strconv.ParseFloat(value, 64)
   195  			case "Qhmin":
   196  				Hcld.Qhmin, _ = strconv.ParseFloat(value, 64)
   197  			case "Eh":
   198  				Hcld.Eh, _ = strconv.ParseFloat(value, 64)
   199  			case "Ehmax":
   200  				Hcld.Ehmax, _ = strconv.ParseFloat(value, 64)
   201  			case "Ehmin":
   202  				Hcld.Ehmin, _ = strconv.ParseFloat(value, 64)
   203  			case "Gi":
   204  				Hcld.Gi, _ = strconv.ParseFloat(value, 64)
   205  			case "Go":
   206  				Hcld.Go, _ = strconv.ParseFloat(value, 64)
   207  			default:
   208  				Eprint("<rmacddat>", key)
   209  			}
   210  		} else {
   211  			Eprint("<rmacddat>", s)
   212  		}
   213  	}
   214  
   215  	// 機器固有値の計算
   216  	if Hcld.Qc < 0.0 {
   217  		Hcld.COPc = -Hcld.Qc / Hcld.Ec
   218  		Hcld.COPcmax = -Hcld.Qcmax / Hcld.Ecmax
   219  		Hcld.COPcmin = -Hcld.Qcmin / Hcld.Ecmin
   220  
   221  		// JISにおける温湿度条件
   222  		DBco := 35.0
   223  		DBci := 27.0
   224  		WBco := 24.0
   225  		WBci := 19.0
   226  		// 絶対湿度
   227  		xco := FNXtw(DBco, WBco)
   228  		xci := FNXtw(DBci, WBci)
   229  		// 湿り比熱
   230  		cao := Ca + Cv*xco
   231  		cai := Ca + Cv*xci
   232  
   233  		// 室内機、室外機熱交換器のバイパスファクタ
   234  		Hcld.BFi = 0.2
   235  		Hcld.BFo = 0.2
   236  
   237  		// 理論効率の計算
   238  		// 定格条件
   239  		effthr := FNeffthc(DBco, DBci, xci, Hcld.Qc, Hcld.Ec, (1.0-Hcld.BFo)*Hcld.Go, (1.0-Hcld.BFi)*Hcld.Gi, cai, cao)
   240  		// 最小能力
   241  		effthmin := FNeffthc(DBco, DBci, xci, Hcld.Qcmin, Hcld.Ecmin, (1.0-Hcld.BFo)*Hcld.Go, (1.0-Hcld.BFi)*Hcld.Gi, cai, cao)
   242  		// 最大能力
   243  		effthmax := FNeffthc(DBco, DBci, xci, Hcld.Qcmax, Hcld.Ecmax, (1.0-Hcld.BFo)*Hcld.Go, (1.0-Hcld.BFi)*Hcld.Gi, cai, cao)
   244  
   245  		// ファン等動力の計算
   246  		X := Hcld.COPcmin * Hcld.Qcmin / effthmin * effthr / (Hcld.Qc * Hcld.COPc)
   247  		Hcld.Pcc = (-Hcld.Qcmin - X*(-Hcld.Qc)) / (Hcld.COPcmin - X*Hcld.COPc)
   248  
   249  		// 定格条件、最小能力時の理論COPと実働COPの比R(両条件のRは等しいと仮定)
   250  		Rr := (-Hcld.Qc * Hcld.COPc) / (effthr * (-Hcld.Qc - Hcld.Pcc*Hcld.COPc))
   251  		// 最大能力時のRを計算
   252  		Rmax := (-Hcld.Qcmax * Hcld.COPcmax) / (effthmax * (-Hcld.Qcmax - Hcld.Pcc*Hcld.COPcmax))
   253  
   254  		// Rの回帰式係数の計算
   255  		U := make([]float64, 9)
   256  		Qc := make([]float64, 3)
   257  		R := make([]float64, 3)
   258  		Qc[0] = -Hcld.Qcmin
   259  		Qc[1] = -Hcld.Qc
   260  		Qc[2] = -Hcld.Qcmax
   261  		R[0] = Rr
   262  		R[1] = Rr
   263  		R[2] = Rmax
   264  		// 行列Uの作成
   265  		for i := 0; i < 3; i++ {
   266  			for j := 0; j < 3; j++ {
   267  				U[i*3+j] = math.Pow(Qc[i], 2.0-float64(j))
   268  			}
   269  		}
   270  
   271  		// Uの逆行列の計算
   272  		Matinv(U, 3, 3, "<rmacddat> UX")
   273  
   274  		// 回帰係数の計算
   275  		//Hcld.Rc = make([]float64, 3)
   276  		for i := 0; i < 3; i++ {
   277  			for j := 0; j < 3; j++ {
   278  				Hcld.Rc[i] += U[i*3+j] * R[j]
   279  			}
   280  		}
   281  	}
   282  
   283  	if Hcld.Qh > 0.0 {
   284  		Hcld.COPh = Hcld.Qh / Hcld.Eh
   285  		Hcld.COPhmax = Hcld.Qhmax / Hcld.Ehmax
   286  		Hcld.COPhmin = Hcld.Qhmin / Hcld.Ehmin
   287  
   288  		// JISにおける温湿度条件
   289  		DBco := 7.0
   290  		DBci := 20.0
   291  		WBco := 6.0
   292  		WBci := 15.0
   293  		// 絶対湿度
   294  		xco := FNXtw(DBco, WBco)
   295  		xci := FNXtw(DBci, WBci)
   296  		// 湿り比熱
   297  		cao := Ca + Cv*xco
   298  		cai := Ca + Cv*xci
   299  
   300  		// 室内機、室外機熱交換器のバイパスファクタ
   301  		Hcld.BFi = 0.2
   302  		Hcld.BFo = 0.2
   303  
   304  		// 理論効率の計算
   305  		// 定格条件
   306  		effthr := FNeffthh(DBco, DBci, xco, Hcld.Qh, Hcld.Eh, (1.0-Hcld.BFo)*Hcld.Go, (1.0-Hcld.BFi)*Hcld.Gi, cai, cao)
   307  		// 最小能力
   308  		effthmin := FNeffthh(DBco, DBci, xco, Hcld.Qhmin, Hcld.Ehmin, (1.0-Hcld.BFo)*Hcld.Go, (1.0-Hcld.BFi)*Hcld.Gi, cai, cao)
   309  		// 最大能力
   310  		effthmax := FNeffthh(DBco, DBci, xco, Hcld.Qhmax, Hcld.Ehmax, (1.0-Hcld.BFo)*Hcld.Go, (1.0-Hcld.BFi)*Hcld.Gi, cai, cao)
   311  
   312  		// ファン等動力の計算
   313  		X := Hcld.COPhmin * Hcld.Qhmin / effthmin * effthr / (Hcld.Qh * Hcld.COPh)
   314  		Hcld.Pch = (Hcld.Qhmin - X*Hcld.Qh) / (Hcld.COPhmin - X*Hcld.COPh)
   315  
   316  		// 定格条件、最小能力時の理論COPと実働COPの比R(両条件のRは等しいと仮定)
   317  		Rr := (Hcld.Qh * Hcld.COPh) / (effthr * (Hcld.Qh - Hcld.Pch*Hcld.COPh))
   318  		// 最大能力時のRを計算
   319  		Rmax := (Hcld.Qhmax * Hcld.COPhmax) / (effthmax * (Hcld.Qhmax - Hcld.Pch*Hcld.COPhmax))
   320  
   321  		// Rの回帰式係数の計算
   322  		U := make([]float64, 9)
   323  		Qc := make([]float64, 3)
   324  		R := make([]float64, 3)
   325  		Qc[0] = Hcld.Qhmin
   326  		Qc[1] = Hcld.Qh
   327  		Qc[2] = Hcld.Qhmax
   328  		R[0] = Rr
   329  		R[1] = Rr
   330  		R[2] = Rmax
   331  		// 行列Uの作成
   332  		for i := 0; i < 3; i++ {
   333  			for j := 0; j < 3; j++ {
   334  				U[i*3+j] = math.Pow(Qc[i], 2.0-float64(j))
   335  			}
   336  		}
   337  
   338  		// Uの逆行列の計算
   339  		Matinv(U, 3, 3, "<rmacddat> UX")
   340  
   341  		// 回帰係数の計算
   342  		//Hcld.Rh = make([]float64, 3)
   343  		for i := 0; i < 3; i++ {
   344  			for j := 0; j < 3; j++ {
   345  				Hcld.Rh[i] += U[i*3+j] * R[j]
   346  			}
   347  		}
   348  	}
   349  }
   350  
   351  // 冷房時の理論COPを計算する
   352  func FNeffthc(Tco, Tci, xci, Qc, Ec, Go, Gi, cai, cao float64) float64 {
   353  	// 凝縮温度の計算
   354  	Tcnd := FNTcndc(Tco, Qc, Ec, cao, Go)
   355  	// 蒸発温度の計算
   356  	Tevp := FNTevpc(Tci, Qc, cai, Gi, xci)
   357  
   358  	// 理論効率の計算
   359  	return (Tevp + 273.15) / (Tcnd - Tevp)
   360  }
   361  
   362  // 暖房時の理論COPを計算する
   363  func FNeffthh(Tco, Tci, xco, Qc, Eh, Go, Gi, cai, cao float64) float64 {
   364  	// 凝縮温度の計算
   365  	Tcnd := FNTcndh(Tci, Qc, cai, Gi)
   366  	// 蒸発温度の計算
   367  	Tevp := FNTevph(Tco, Qc, Eh, cao, Go, xco)
   368  
   369  	// 理論効率の計算
   370  	return (Tcnd + 273.15) / (Tcnd - Tevp)
   371  }
   372  
   373  // 冷房時凝縮温度の計算
   374  func FNTcndc(Tco, Qc, Ec, cao, Go float64) float64 {
   375  	return (Tco + (-Qc+Ec)/(cao*Go))
   376  }
   377  
   378  // 暖房時凝縮温度の計算
   379  func FNTcndh(Tci, Qc, cai, Gi float64) float64 {
   380  	return (Tci + Qc/(cai*Gi))
   381  }
   382  
   383  // 冷房時蒸発温度の計算
   384  func FNTevpc(Tci, Qc, cai, Gi, xci float64) float64 {
   385  
   386  	// 蒸発温度の計算
   387  	Tevp := Tci - (-Qc)/(cai*Gi)
   388  	// 室内が結露するかどうかの判定(結露時は等エンタルピー変化による飽和状態とする)
   389  	RHi := FNRhtx(Tevp, xci)
   390  	if RHi > 100.0 {
   391  		Tevp = FNDbrh(100.0, FNH(Tevp, xci))
   392  	}
   393  
   394  	return (Tevp)
   395  }
   396  
   397  // 暖房時蒸発温度の計算
   398  func FNTevph(Tco, Qc, Eh, cao, Go, xco float64) float64 {
   399  	// 蒸発温度の計算
   400  	Tevp := Tco - (Qc-Eh)/(cao*Go)
   401  	// 室外が結露するかどうかの判定(結露時は等エンタルピー変化による飽和状態とする)
   402  	RHo := FNRhtx(Tevp, xco)
   403  	if RHo > 100.0 {
   404  		Tevp = FNDbrh(100.0, FNH(Tevp, xco))
   405  	}
   406  	return Tevp
   407  }
   408  
   409  /*  特性式の係数  */
   410  
   411  //
   412  // +--------+ ---> [OUT 1]
   413  // | HCLOAD | ---> [OUT 2]
   414  // +--------+ ---> [OUT 3] 冷温水コイル想定時のみ
   415  //
   416  func Hcldcfv(_Hcload []*HCLOAD) {
   417  	var f0, f1 float64
   418  
   419  	Tout15 := 15.0
   420  	Tout20 := 20.0
   421  
   422  	for _, Hcload := range _Hcload {
   423  		Xout15 := FNXtr(Tout15, Hcload.RHout)
   424  		Xout20 := FNXtr(Tout20, Hcload.RHout)
   425  		f1 = (Xout20 - Xout15) / (Tout20 - Tout15)
   426  		f0 = Xout15 - f1*Tout15
   427  
   428  		Eo1 := Hcload.Cmp.Elouts[0]
   429  		Hcload.Ga = Eo1.G
   430  
   431  		if Eo1.Control != OFF_SW {
   432  			Hcload.Ga = Eo1.G
   433  			Hcload.CGa = Spcheat(Eo1.Fluid) * Hcload.Ga
   434  
   435  			Eo1.Coeffo = Hcload.CGa
   436  			Eo1.Co = 0.0
   437  			Eo1.Coeffin[0] = -Hcload.CGa
   438  		}
   439  
   440  		Eo2 := Hcload.Cmp.Elouts[1]
   441  		if Eo2.Control != OFF_SW {
   442  			if Hcload.Wetmode {
   443  				Eo2.Coeffo = 1.0
   444  				Eo2.Co = f0
   445  				Eo2.Coeffin[0] = 0.0
   446  				Eo2.Coeffin[1] = -f1
   447  			} else {
   448  				Eo2.Coeffo = Hcload.Ga
   449  				Eo2.Co = 0.0
   450  				Eo2.Coeffin[0] = -Hcload.Ga
   451  				Eo2.Coeffin[1] = 0.0
   452  			}
   453  		}
   454  
   455  		// 冷温水コイル想定時
   456  		if Hcload.Type == HCLoadType_W {
   457  			Eo3 := Hcload.Cmp.Elouts[2]
   458  			if Eo3.Control != OFF_SW {
   459  				Hcload.Gw = Eo3.G
   460  				Hcload.CGw = Spcheat(Eo3.Fluid) * Hcload.Gw
   461  				rGa := Ro * Hcload.Ga
   462  
   463  				Eo3.Coeffo = Hcload.CGw
   464  
   465  				Eo3.Coeffin[0] = -Hcload.CGw
   466  				Eo3.Coeffin[1] = -Hcload.CGa
   467  				Eo3.Coeffin[2] = -rGa
   468  
   469  				if Hcload.Wetmode && Hcload.Chmode == COOLING_SW {
   470  					Eo3.Coeffin[3] = Hcload.CGa + rGa*f1
   471  					Eo3.Coeffin[4] = 0.0
   472  					Eo3.Co = -rGa * f0
   473  				} else {
   474  					Eo3.Coeffin[3] = Hcload.CGa
   475  					Eo3.Coeffin[4] = rGa
   476  					Eo3.Co = 0.0
   477  				}
   478  			}
   479  		}
   480  	}
   481  }
   482  
   483  /* ------------------------------------------ */
   484  
   485  // 空調負荷の計算
   486  func Hcldene(_Hcload []*HCLOAD, LDrest *int, Wd *WDAT) {
   487  	var rest int
   488  	var elo *ELOUT
   489  	ro := 0.0
   490  	ca := 0.0
   491  	cv := 0.0
   492  
   493  	rest = 0
   494  
   495  	for _, Hcload := range _Hcload {
   496  		elo = Hcload.Cmp.Elouts[0]
   497  		Hcload.Tain = elo.Elins[0].Sysvin
   498  		elo = Hcload.Cmp.Elouts[1]
   499  		Hcload.Xain = elo.Elins[0].Sysvin
   500  		Hcload.Qfusoku = 0.0
   501  
   502  		if Hcload.Type == 'W' {
   503  			elo = Hcload.Cmp.Elouts[2]
   504  			if elo.Elins[0].Upv != nil {
   505  				Hcload.Twin = elo.Elins[0].Upv.Sysv
   506  				Hcload.Twout = elo.Sysv
   507  			} else {
   508  				Hcload.Twin = -999.0
   509  				Hcload.Twout = -999.0
   510  			}
   511  		}
   512  
   513  		if Hcload.Cmp.Control != OFF_SW {
   514  			elo = Hcload.Cmp.Elouts[0]
   515  			if elo.Control == ON_SW && elo.Sysld == 'y' {
   516  				Hcload.Qs = elo.Load
   517  			} else {
   518  				Hcload.Qs = Hcload.CGa * (elo.Sysv - Hcload.Tain)
   519  			}
   520  
   521  			rest = chswreset(Hcload.Qs, Hcload.Chmode, elo)
   522  
   523  			if rest != 0 {
   524  				(*LDrest)++
   525  				Hcload.Cmp.Control = OFF_SW
   526  			}
   527  
   528  			elo = Hcload.Cmp.Elouts[1]
   529  			if elo.Control == ON_SW && elo.Sysld == 'y' {
   530  				Hcload.Ql = ro * elo.Load
   531  			} else {
   532  				Hcload.Ql = ro * Hcload.Ga * (elo.Sysv - Hcload.Xain)
   533  			}
   534  
   535  			if chqlreset(Hcload) != 0 {
   536  				(*LDrest)++
   537  			}
   538  
   539  			Hcload.Qt = Hcload.Qs + Hcload.Ql
   540  
   541  			if Hcload.RMACFlg == 'Y' {
   542  				if Hcload.Qt > 0.0 {
   543  					var qrhmax, qrhd, Temp float64
   544  					var To_7 float64
   545  					var Cafh, Cdf float64
   546  					var Qhmax, Qhd float64
   547  					var fht1, fht2, fht3 float64
   548  
   549  					To_7 = Wd.T - 7.0
   550  					Temp = (Hcload.rh - 1.0) / 1.8
   551  					Cafh = 0.8
   552  
   553  					qrhmax = -1.0e-6*(1.0+Temp)*math.Pow(To_7, 3.0) +
   554  						2.0e-4*(1.0+Temp)*math.Pow(To_7, 2.0) +
   555  						(0.0134+(0.0457-0.0134)*Temp)*To_7 + Hcload.rh
   556  
   557  					Cdf = 1.0
   558  					if Wd.T < 5.0 && Wd.RH >= 80.0 {
   559  						Cdf = 0.9
   560  					}
   561  
   562  					Qhmax = qrhmax * Hcload.Qh * Cafh * Cdf
   563  
   564  					if Qhmax > Hcload.Qt {
   565  						Qhd = Hcload.Qt
   566  					} else {
   567  						Qhd = Qhmax
   568  						Hcload.Qfusoku = Hcload.Qt - Qhmax
   569  					}
   570  					qrhd = Qhd / Hcload.Qh / Cafh / Cdf
   571  
   572  					fht1 = fhtlb(Wd.T, 1.0)
   573  					fht2 = fhtlb(Wd.T, qrhd*1.9/Hcload.rh)
   574  					fht3 = fhtlb(Wd.T, 1.9/Hcload.rh)
   575  
   576  					Eff := 1.0 / Cafh / Cdf * fht1 * fht2 / qrhd / fht3
   577  					Hcload.Ele = Eff / Hcload.COPh * Qhd
   578  					Hcload.COP = Qhd / Hcload.Ele
   579  
   580  					Hcload.Ele = Hcload.Qt / Hcload.COP
   581  				} else {
   582  					var qrcmax, qrcd float64
   583  					var To_35 float64
   584  					var Cafc, Chm float64
   585  					var Qcmax, Qcd float64
   586  					var fct1, fct2, fct3 float64
   587  
   588  					To_35 = Wd.T - 35.0
   589  					Cafc = 0.85
   590  					Chm = 1.0
   591  
   592  					qrcmax = -1.0e-5*Hcload.rc*math.Pow(To_35, 3.0) +
   593  						2.0e-4*0.5*(1.0+Hcload.rc)*math.Pow(To_35, 2.0) -
   594  						(0.0147+0.014*(Hcload.rc-1.0))*To_35 + Hcload.rc
   595  
   596  					Qcmax = qrcmax * Hcload.Qc * (Cafc + Chm) / 2.0
   597  
   598  					if Qcmax < Hcload.Qt {
   599  						Qcd = Hcload.Qt
   600  					} else {
   601  						Qcd = Qcmax
   602  						Hcload.Qfusoku = Hcload.Qt - Qcmax
   603  					}
   604  					qrcd = Qcd / Hcload.Qc / ((Cafc + Chm) / 2.0)
   605  
   606  					fct1 = fctlb(Wd.T, 1.0)
   607  					fct2 = fctlb(Wd.T, qrcd*1.5/Hcload.rc)
   608  					fct3 = fctlb(Wd.T, 1.5/Hcload.rc)
   609  
   610  					Hcload.Ele = 1.0 / ((Cafc + Chm) / 2.0) * fct1 * fct2 / qrcd / fct3 / Hcload.COPc * Qcd
   611  					Hcload.COP = Qcd / Hcload.Ele
   612  
   613  					Hcload.Ele = -Hcload.Qt / Hcload.COP
   614  				}
   615  			} else if Hcload.RMACFlg == 'y' {
   616  				if Hcload.Qt < 0.0 {
   617  					var effth, Tevp, Tcnd, cai, cao, COP, COPd, R float64
   618  					Qc := make([]float64, 3)
   619  
   620  					cao = ca + cv*Wd.X
   621  					cai = ca + cv*Hcload.Xain
   622  					Tevp = FNTevpc(Hcload.Tain, Hcload.Qt, cai, (1.0-Hcload.BFi)*Hcload.Ga, Hcload.Xain)
   623  
   624  					COPd = Hcload.COPc
   625  
   626  					Qc[0] = Hcload.Qt * Hcload.Qt
   627  					Qc[1] = -Hcload.Qt
   628  					Qc[2] = 1.0
   629  
   630  					R = 0.0
   631  					for j := 0; j < 3; j++ {
   632  						R += Hcload.Rc[j] * Qc[j]
   633  					}
   634  
   635  					for i := 0; i < 100; i++ {
   636  						var E float64
   637  
   638  						E = -Hcload.Qt / COPd
   639  
   640  						Tcnd = FNTcndc(Wd.T, Hcload.Qt, E, cao, (1.0-Hcload.BFo)*Hcload.Go)
   641  
   642  						effth = (Tevp + 273.15) / (Tcnd - Tevp)
   643  
   644  						COP = 1.0 / (1.0/(R*effth) + Hcload.Pcc/-Hcload.Qt)
   645  
   646  						if math.Abs(COP-COPd) < 1.0e-4 {
   647  							Hcload.Ele = E
   648  							Hcload.COP = COP
   649  							break
   650  						} else {
   651  							COPd = COP
   652  						}
   653  					}
   654  				} else {
   655  					var effth, Tevp, Tcnd, cai, cao, COP, COPd, R float64
   656  					Qc := make([]float64, 3)
   657  
   658  					cao = ca + cv*Wd.X
   659  					cai = ca + cv*Hcload.Xain
   660  					Tcnd = FNTcndh(Hcload.Tain, Hcload.Qt, cai, (1.0-Hcload.BFi)*Hcload.Ga)
   661  
   662  					COPd = Hcload.COPh
   663  
   664  					Qc[0] = Hcload.Qt * Hcload.Qt
   665  					Qc[1] = Hcload.Qt
   666  					Qc[2] = 1.0
   667  
   668  					R = 0.0
   669  					for j := 0; j < 3; j++ {
   670  						R += Hcload.Rh[j] * Qc[j]
   671  					}
   672  
   673  					for i := 0; i < 100; i++ {
   674  						var E float64
   675  
   676  						E = Hcload.Qt / COPd
   677  
   678  						Tevp = FNTevph(Wd.T, Hcload.Qt, E, cao, (1.0-Hcload.BFo)*Hcload.Go, Wd.X)
   679  
   680  						effth = (Tcnd + 273.15) / (Tcnd - Tevp)
   681  
   682  						COP = 1.0 / (1.0/(R*effth) + Hcload.Pch/Hcload.Qt)
   683  
   684  						if math.Abs(COP-COPd) < 1.0e-4 {
   685  							Hcload.Ele = E
   686  							Hcload.COP = COP
   687  							break
   688  						} else {
   689  							COPd = COP
   690  						}
   691  					}
   692  				}
   693  			} else {
   694  				Hcload.Qs = 0.0
   695  				Hcload.Ql = 0.0
   696  				Hcload.Qt = 0.0
   697  				Hcload.Ele = 0.0
   698  				Hcload.COP = 0.0
   699  				Hcload.Qfusoku = 0.0
   700  			}
   701  		} else {
   702  			Hcload.Qs = 0.0
   703  			Hcload.Ql = 0.0
   704  			Hcload.Qt = 0.0
   705  			Hcload.Ele = 0.0
   706  			Hcload.COP = 0.0
   707  			Hcload.Qfusoku = 0.0
   708  		}
   709  	}
   710  }
   711  
   712  func fctlb(T, x float64) float64 {
   713  	a := [...]float64{
   714  		0.0148*T + 0.0089,
   715  		-0.0153*T + 0.1429,
   716  		0.034*T - 0.4963,
   717  		-0.0012*T + 0.288 + 0.0322,
   718  	}
   719  
   720  	var Temp float64
   721  	for i := 0; i < 4; i++ {
   722  		Temp += a[i] * math.Pow(x, float64(i))
   723  	}
   724  
   725  	return Temp
   726  }
   727  
   728  func fhtlb(T, x float64) float64 {
   729  	a := [...]float64{
   730  		0.0018*T*T - 0.0424*T + 0.4554,
   731  		-0.006*T*T + 0.1347*T - 1.56,
   732  		0.0063*T*T - 0.1406*T + 2.2902,
   733  		-0.002*T*T + 0.0176*T - 0.3789,
   734  		0.0002*T*T - 0.0007*T + 0.4202,
   735  	}
   736  
   737  	var Temp float64
   738  	for i := 0; i < 5; i++ {
   739  		Temp += a[i] * math.Pow(x, float64(i))
   740  	}
   741  
   742  	return Temp
   743  }
   744  
   745  /* --------------------------- */
   746  
   747  /* 負荷計算指定時の設定値のポインター */
   748  
   749  func hcldptr(load *ControlSWType, key []string, Hcload *HCLOAD, idmrk *byte) (VPTR, error) {
   750  	var err error
   751  	var vptr VPTR
   752  	if key[1] == "Tout" || key[1] == "Tr" || key[1] == "Tot" {
   753  		vptr.Ptr = &Hcload.Toset
   754  		vptr.Type = VAL_CTYPE
   755  		Hcload.Loadt = load
   756  		*idmrk = 't'
   757  	} else if key[1] == "xout" {
   758  		vptr.Ptr = &Hcload.Xoset
   759  		vptr.Type = VAL_CTYPE
   760  		Hcload.Loadx = load
   761  		*idmrk = 'x'
   762  	} else {
   763  		err = errors.New("Tout, Tr, Tot or xout are expected")
   764  	}
   765  	return vptr, err
   766  }
   767  
   768  /* ------------------------------------------ */
   769  
   770  /* 負荷計算指定時のスケジュール設定 */
   771  
   772  func hcldschd(Hcload *HCLOAD) {
   773  	Eo := Hcload.Cmp.Elouts
   774  
   775  	if Hcload.Loadt != nil {
   776  		if Eo[0].Control != OFF_SW {
   777  			if Hcload.Toset > TEMPLIMIT {
   778  				Eo[0].Control = LOAD_SW
   779  				Eo[0].Sysv = Hcload.Toset
   780  			} else {
   781  				Eo[0].Control = OFF_SW
   782  
   783  				if Hcload.Wetmode {
   784  					Eo[1].Control = OFF_SW
   785  				}
   786  			}
   787  		}
   788  	} else if Hcload.Loadx != nil {
   789  		if len(Eo) > 1 && Eo[1].Control != OFF_SW {
   790  			if Hcload.Xoset > 0.0 {
   791  				Eo[1].Control = LOAD_SW
   792  				Eo[1].Sysv = Hcload.Xoset
   793  			} else {
   794  				Eo[1].Control = OFF_SW
   795  			}
   796  		}
   797  	}
   798  
   799  	if Hcload.Type == 'W' {
   800  		if len(Eo) > 2 && Eo[0].Control == OFF_SW && Eo[1].Control == OFF_SW {
   801  			Eo[2].Control = OFF_SW
   802  		}
   803  	}
   804  }
   805  
   806  /* ------------------------------------------ */
   807  
   808  func hcldprint(fo io.Writer, id int, _Hcload []*HCLOAD) {
   809  	switch id {
   810  	case 0:
   811  		if len(_Hcload) > 0 {
   812  			fmt.Fprintf(fo, "%s %d\n", HCLOAD_TYPE, len(_Hcload))
   813  		}
   814  		for _, Hcload := range _Hcload {
   815  			if Hcload.Type == HCLoadType_W {
   816  				fmt.Fprintf(fo, " %s 1 15\n", Hcload.Name)
   817  			} else {
   818  				if Hcload.RMACFlg == 'Y' || Hcload.RMACFlg == 'y' {
   819  					fmt.Fprintf(fo, " %s 1 14\n", Hcload.Name)
   820  				} else {
   821  					fmt.Fprintf(fo, " %s 1 11\n", Hcload.Name)
   822  				}
   823  			}
   824  		}
   825  	case 1:
   826  		for _, Hcload := range _Hcload {
   827  			fmt.Fprintf(fo, "%s_ca c c %s_Ga m f %s_Ti t f %s_To t f %s_Qs q f\n",
   828  				Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name)
   829  			fmt.Fprintf(fo, "%s_cx c c %s_xi x f %s_xo x f %s_RHo r f %s_Ql q f",
   830  				Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name)
   831  			if Hcload.Type == 'W' {
   832  				fmt.Fprintf(fo, "%s_cw c c %s_G m f %s_Twi t f %s_Two t f",
   833  					Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name)
   834  			}
   835  			fmt.Fprintf(fo, " %s_Qt q f\n", Hcload.Name)
   836  
   837  			if Hcload.RMACFlg == 'Y' || Hcload.RMACFlg == 'y' {
   838  				fmt.Fprintf(fo, " %s_Qfusoku q f %s_Ele E f %s_COP C f\n",
   839  					Hcload.Name, Hcload.Name, Hcload.Name)
   840  			}
   841  		}
   842  	default:
   843  		for _, Hcload := range _Hcload {
   844  			el := Hcload.Cmp.Elouts[0]
   845  			Taout := el.Sysv
   846  			fmt.Fprintf(fo, "%c %6.4g %4.2f %4.2f %.2f ",
   847  				el.Control, Hcload.Ga, Hcload.Tain, el.Sysv, Hcload.Qs)
   848  
   849  			el = Hcload.Cmp.Elouts[1]
   850  			RHout := FNRhtx(Taout, float64(el.Sysv))
   851  			if RHout > 100.0 {
   852  				RHout = 999
   853  			} else if RHout < 0.0 {
   854  				RHout = -99.0
   855  			}
   856  
   857  			fmt.Fprintf(fo, "%c %.4f %.4f %3.0f %.2f ",
   858  				el.Control, Hcload.Xain, el.Sysv, RHout, Hcload.Ql)
   859  
   860  			if Hcload.Type == 'W' {
   861  				el = Hcload.Cmp.Elouts[2]
   862  				fmt.Fprintf(fo, "%c %6.4g %4.1f %4.1f",
   863  					el.Control, Hcload.Gw, Hcload.Twin, el.Sysv)
   864  			}
   865  			fmt.Fprintf(fo, " %.2f\n", Hcload.Qt)
   866  
   867  			if Hcload.RMACFlg == 'Y' || Hcload.RMACFlg == 'y' {
   868  				fmt.Fprintf(fo, " %.0f %.0f %.2f\n", Hcload.Qfusoku, Hcload.Ele, Hcload.COP)
   869  			}
   870  		}
   871  	}
   872  }
   873  
   874  /* ------------------------------ */
   875  
   876  /* 日積算値に関する処理 */
   877  
   878  func hclddyint(_Hcload []*HCLOAD) {
   879  	for _, Hcload := range _Hcload {
   880  		svdyint(&Hcload.Taidy)
   881  		svdyint(&Hcload.xaidy)
   882  
   883  		qdyint(&Hcload.Qdys)
   884  		qdyint(&Hcload.Qdyl)
   885  		qdyint(&Hcload.Qdyt)
   886  		qdyint(&Hcload.Qdyfusoku)
   887  		qdyint(&Hcload.Edy)
   888  	}
   889  }
   890  
   891  func hcldmonint(_Hcload []*HCLOAD) {
   892  	for _, Hcload := range _Hcload {
   893  		svdyint(&Hcload.mTaidy)
   894  		svdyint(&Hcload.mxaidy)
   895  
   896  		qdyint(&Hcload.mQdys)
   897  		qdyint(&Hcload.mQdyl)
   898  		qdyint(&Hcload.mQdyt)
   899  		qdyint(&Hcload.mQdyfusoku)
   900  		qdyint(&Hcload.mEdy)
   901  	}
   902  }
   903  
   904  func hcldday(Mon, Day, ttmm, Nday, SimDayend int, _Hcload []*HCLOAD) {
   905  	Mo := Mon - 1
   906  	tt := ConvertHour(ttmm)
   907  
   908  	for _, Hcload := range _Hcload {
   909  
   910  		// 日集計
   911  		svdaysum(int64(ttmm), Hcload.Cmp.Control, Hcload.Tain, &Hcload.Taidy)
   912  		svdaysum(int64(ttmm), Hcload.Cmp.Control, Hcload.Xain, &Hcload.xaidy)
   913  
   914  		qdaysum(int64(ttmm), Hcload.Cmp.Control, Hcload.Qs, &Hcload.Qdys)
   915  		qdaysum(int64(ttmm), Hcload.Cmp.Control, Hcload.Ql, &Hcload.Qdyl)
   916  		qdaysum(int64(ttmm), Hcload.Cmp.Control, Hcload.Qt, &Hcload.Qdyt)
   917  
   918  		qdaysum(int64(ttmm), Hcload.Cmp.Control, Hcload.Qfusoku, &Hcload.Qdyfusoku)
   919  		qdaysum(int64(ttmm), Hcload.Cmp.Control, Hcload.Ele, &Hcload.Edy)
   920  
   921  		// 月集計
   922  		svmonsum(Mon, Day, ttmm, Hcload.Cmp.Control, Hcload.Tain, &Hcload.mTaidy, Nday, SimDayend)
   923  		svmonsum(Mon, Day, ttmm, Hcload.Cmp.Control, Hcload.Xain, &Hcload.mxaidy, Nday, SimDayend)
   924  
   925  		qmonsum(Mon, Day, ttmm, Hcload.Cmp.Control, Hcload.Qs, &Hcload.mQdys, Nday, SimDayend)
   926  		qmonsum(Mon, Day, ttmm, Hcload.Cmp.Control, Hcload.Ql, &Hcload.mQdyl, Nday, SimDayend)
   927  		qmonsum(Mon, Day, ttmm, Hcload.Cmp.Control, Hcload.Qt, &Hcload.mQdyt, Nday, SimDayend)
   928  
   929  		qmonsum(Mon, Day, ttmm, Hcload.Cmp.Control, Hcload.Qfusoku, &Hcload.mQdyfusoku, Nday, SimDayend)
   930  		qmonsum(Mon, Day, ttmm, Hcload.Cmp.Control, Hcload.Ele, &Hcload.mEdy, Nday, SimDayend)
   931  
   932  		// 月・時刻のクロス集計
   933  		emtsum(Mon, Day, ttmm, Hcload.Cmp.Control, Hcload.Ele, &Hcload.mtEdy[Mo][tt])
   934  	}
   935  }
   936  
   937  func hclddyprt(fo io.Writer, id int, _Hcload []*HCLOAD) {
   938  	switch id {
   939  	case 0:
   940  		if len(_Hcload) > 0 {
   941  			fmt.Fprintf(fo, "%s %d\n", HCLOAD_TYPE, len(_Hcload))
   942  		}
   943  		for _, Hcload := range _Hcload {
   944  			fmt.Fprintf(fo, "%s 4 36 14 14 8\n", Hcload.Name)
   945  		}
   946  
   947  	case 1:
   948  		for _, Hcload := range _Hcload {
   949  			fmt.Fprintf(fo, "%s_Ht H d %s_T T f ", Hcload.Name, Hcload.Name)
   950  			fmt.Fprintf(fo, "%s_ttn h d %s_Tn t f %s_ttm h d %s_Tm t f\n",
   951  				Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name)
   952  			fmt.Fprintf(fo, "%s_Hsh H d %s_Qsh Q f %s_Hsc H d %s_Qsc Q f\n",
   953  				Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name)
   954  			fmt.Fprintf(fo, "%s_tsh h d %s_qsh q f %s_tsc h d %s_qsc q f\n",
   955  				Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name)
   956  			fmt.Fprintf(fo, "%s_Hx H d %s_x X f ", Hcload.Name, Hcload.Name)
   957  			fmt.Fprintf(fo, "%s_txn h d %s_xn x f %s_txm h d %s_xm c f\n",
   958  				Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name)
   959  			fmt.Fprintf(fo, "%s_Hlh H d %s_Qlh Q f %s_Hlc H d %s_Qlc Q f\n",
   960  				Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name)
   961  			fmt.Fprintf(fo, "%s_tlh h d %s_qlh q f %s_tlc h d %s_qlc q f\n",
   962  				Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name)
   963  			fmt.Fprintf(fo, "%s_Hth H d %s_Qth Q f %s_Htc H d %s_Qtc Q f\n",
   964  				Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name)
   965  			fmt.Fprintf(fo, "%s_tth h d %s_qth q f %s_ttc h d %s_qtc q f\n\n",
   966  				Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name)
   967  		}
   968  
   969  	default:
   970  		for _, Hcload := range _Hcload {
   971  			fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ",
   972  				Hcload.Taidy.Hrs, Hcload.Taidy.M,
   973  				Hcload.Taidy.Mntime, Hcload.Taidy.Mn,
   974  				Hcload.Taidy.Mxtime, Hcload.Taidy.Mx)
   975  			fmt.Fprintf(fo, "%1d %3.1f ", Hcload.Qdys.Hhr, Hcload.Qdys.H)
   976  			fmt.Fprintf(fo, "%1d %3.1f ", Hcload.Qdys.Chr, Hcload.Qdys.C)
   977  			fmt.Fprintf(fo, "%1d %2.0f ", Hcload.Qdys.Hmxtime, Hcload.Qdys.Hmx)
   978  			fmt.Fprintf(fo, "%1d %2.0f ", Hcload.Qdys.Cmxtime, Hcload.Qdys.Cmx)
   979  
   980  			fmt.Fprintf(fo, "%1d %5.4f %1d %5.4f %1d %5.4f ",
   981  				Hcload.xaidy.Hrs, Hcload.xaidy.M,
   982  				Hcload.xaidy.Mntime, Hcload.xaidy.Mn,
   983  				Hcload.xaidy.Mxtime, Hcload.xaidy.Mx)
   984  			fmt.Fprintf(fo, "%1d %3.1f ", Hcload.Qdyl.Hhr, Hcload.Qdyl.H)
   985  			fmt.Fprintf(fo, "%1d %3.1f ", Hcload.Qdyl.Chr, Hcload.Qdyl.C)
   986  			fmt.Fprintf(fo, "%1d %2.0f ", Hcload.Qdyl.Hmxtime, Hcload.Qdyl.Hmx)
   987  			fmt.Fprintf(fo, "%1d %2.0f ", Hcload.Qdyl.Cmxtime, Hcload.Qdyl.Cmx)
   988  
   989  			fmt.Fprintf(fo, "%1d %3.1f ", Hcload.Qdyt.Hhr, Hcload.Qdyt.H)
   990  			fmt.Fprintf(fo, "%1d %3.1f ", Hcload.Qdyt.Chr, Hcload.Qdyt.C)
   991  			fmt.Fprintf(fo, "%1d %2.0f ", Hcload.Qdyt.Hmxtime, Hcload.Qdyt.Hmx)
   992  			fmt.Fprintf(fo, "%1d %2.0f\n", Hcload.Qdyt.Cmxtime, Hcload.Qdyt.Cmx)
   993  		}
   994  	}
   995  }
   996  
   997  func hcldmonprt(fo io.Writer, id int, _Hcload []*HCLOAD) {
   998  	switch id {
   999  	case 0:
  1000  		if len(_Hcload) > 0 {
  1001  			fmt.Fprintf(fo, "%s %d\n", HCLOAD_TYPE, len(_Hcload))
  1002  		}
  1003  		for _, Hcload := range _Hcload {
  1004  			fmt.Fprintf(fo, "%s 4 36 14 14 8\n", Hcload.Name)
  1005  		}
  1006  
  1007  	case 1:
  1008  		for _, Hcload := range _Hcload {
  1009  			fmt.Fprintf(fo, "%s_Ht H d %s_T T f ", Hcload.Name, Hcload.Name)
  1010  			fmt.Fprintf(fo, "%s_ttn h d %s_Tn t f %s_ttm h d %s_Tm t f\n",
  1011  				Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name)
  1012  			fmt.Fprintf(fo, "%s_Hsh H d %s_Qsh Q f %s_Hsc H d %s_Qsc Q f\n",
  1013  				Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name)
  1014  			fmt.Fprintf(fo, "%s_tsh h d %s_qsh q f %s_tsc h d %s_qsc q f\n",
  1015  				Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name)
  1016  			fmt.Fprintf(fo, "%s_Hx H d %s_x X f ", Hcload.Name, Hcload.Name)
  1017  			fmt.Fprintf(fo, "%s_txn h d %s_xn x f %s_txm h d %s_xm c f\n",
  1018  				Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name)
  1019  			fmt.Fprintf(fo, "%s_Hlh H d %s_Qlh Q f %s_Hlc H d %s_Qlc Q f\n",
  1020  				Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name)
  1021  			fmt.Fprintf(fo, "%s_tlh h d %s_qlh q f %s_tlc h d %s_qlc q f\n",
  1022  				Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name)
  1023  			fmt.Fprintf(fo, "%s_Hth H d %s_Qth Q f %s_Htc H d %s_Qtc Q f\n",
  1024  				Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name)
  1025  			fmt.Fprintf(fo, "%s_tth h d %s_qth q f %s_ttc h d %s_qtc q f\n\n",
  1026  				Hcload.Name, Hcload.Name, Hcload.Name, Hcload.Name)
  1027  		}
  1028  
  1029  	default:
  1030  		for _, Hcload := range _Hcload {
  1031  			fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ",
  1032  				Hcload.mTaidy.Hrs, Hcload.mTaidy.M,
  1033  				Hcload.mTaidy.Mntime, Hcload.mTaidy.Mn,
  1034  				Hcload.mTaidy.Mxtime, Hcload.mTaidy.Mx)
  1035  			fmt.Fprintf(fo, "%1d %3.1f ", Hcload.mQdys.Hhr, Hcload.mQdys.H)
  1036  			fmt.Fprintf(fo, "%1d %3.1f ", Hcload.mQdys.Chr, Hcload.mQdys.C)
  1037  			fmt.Fprintf(fo, "%1d %2.0f ", Hcload.mQdys.Hmxtime, Hcload.mQdys.Hmx)
  1038  			fmt.Fprintf(fo, "%1d %2.0f ", Hcload.mQdys.Cmxtime, Hcload.mQdys.Cmx)
  1039  
  1040  			fmt.Fprintf(fo, "%1d %5.4f %1d %5.4f %1d %5.4f ",
  1041  				Hcload.mxaidy.Hrs, Hcload.mxaidy.M,
  1042  				Hcload.mxaidy.Mntime, Hcload.mxaidy.Mn,
  1043  				Hcload.mxaidy.Mxtime, Hcload.mxaidy.Mx)
  1044  			fmt.Fprintf(fo, "%1d %3.1f ", Hcload.mQdyl.Hhr, Hcload.mQdyl.H)
  1045  			fmt.Fprintf(fo, "%1d %3.1f ", Hcload.mQdyl.Chr, Hcload.mQdyl.C)
  1046  			fmt.Fprintf(fo, "%1d %2.0f ", Hcload.mQdyl.Hmxtime, Hcload.mQdyl.Hmx)
  1047  			fmt.Fprintf(fo, "%1d %2.0f ", Hcload.mQdyl.Cmxtime, Hcload.mQdyl.Cmx)
  1048  
  1049  			fmt.Fprintf(fo, "%1d %3.1f ", Hcload.mQdyt.Hhr, Hcload.mQdyt.H)
  1050  			fmt.Fprintf(fo, "%1d %3.1f ", Hcload.mQdyt.Chr, Hcload.mQdyt.C)
  1051  			fmt.Fprintf(fo, "%1d %2.0f ", Hcload.mQdyt.Hmxtime, Hcload.mQdyt.Hmx)
  1052  			fmt.Fprintf(fo, "%1d %2.0f\n", Hcload.mQdyt.Cmxtime, Hcload.mQdyt.Cmx)
  1053  		}
  1054  	}
  1055  }
  1056  
  1057  func hcldmtprt(fo io.Writer, id, Mo, tt int, _Hcload []*HCLOAD) {
  1058  	switch id {
  1059  	case 0:
  1060  		if len(_Hcload) > 0 {
  1061  			fmt.Fprintf(fo, "%s %d\n", HCLOAD_TYPE, len(_Hcload))
  1062  		}
  1063  		for _, Hcload := range _Hcload {
  1064  			fmt.Fprintf(fo, " %s 1 1\n", Hcload.Name)
  1065  		}
  1066  
  1067  	case 1:
  1068  		for _, Hcload := range _Hcload {
  1069  			fmt.Fprintf(fo, "%s_E E f \n", Hcload.Name)
  1070  		}
  1071  
  1072  	default:
  1073  		for _, Hcload := range _Hcload {
  1074  			fmt.Fprintf(fo, " %.2f \n", Hcload.mtEdy[Mo-1][tt-1].D*Cff_kWh)
  1075  		}
  1076  	}
  1077  }
  1078  
  1079  func hcldswptr(key []string, Hcload *HCLOAD) (VPTR, error) {
  1080  	if key[1] == "chmode" {
  1081  		return VPTR{
  1082  			Ptr:  &Hcload.Chmode,
  1083  			Type: SW_CTYPE,
  1084  		}, nil
  1085  	}
  1086  
  1087  	return VPTR{}, errors.New("hcldswptr error")
  1088  }
  1089  
  1090  func chhcldswreset(Qload, Ql float64, chmode ControlSWType, Eo *ELOUT) int {
  1091  	if (chmode == HEATING_SW && Qload < 0.0) ||
  1092  		(chmode == COOLING_SW && Ql > 0.0) ||
  1093  		(chmode == COOLING_SW && Qload > 0.0) {
  1094  		Eo.Control = ON_SW
  1095  		Eo.Sysld = 'n'
  1096  		Eo.Emonitr.Control = ON_SW
  1097  
  1098  		return 1
  1099  	} else {
  1100  		return 0
  1101  	}
  1102  }
  1103  
  1104  func hcldwetmdreset(Eqsys *EQSYS) {
  1105  	Hcload := Eqsys.Hcload
  1106  
  1107  	for i := range Hcload {
  1108  		Hcload[i].Wetmode = Hcload[i].Wet
  1109  	}
  1110  }