github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/mchccoil.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  /*  hccoil.c  */
    17  
    18  /*  冷温水コイル  */
    19  
    20  package eeslism
    21  
    22  import (
    23  	"fmt"
    24  	"io"
    25  	"math"
    26  	"strings"
    27  )
    28  
    29  // 冷温水コイルの機器仕様入力
    30  // See: ../format/EQPCAT.md#HCC
    31  func Hccdata(s string, Hccca *HCCCA) int {
    32  	var st string
    33  	var dt float64
    34  	id := 0
    35  
    36  	if stIdx := strings.IndexRune(s, '='); stIdx == -1 {
    37  		Hccca.name = s
    38  		Hccca.eh = 0.0
    39  		Hccca.et = -999.0
    40  		Hccca.KA = -999.0
    41  	} else {
    42  		st = s[stIdx+1:]
    43  		dt, _ = readFloat(st)
    44  
    45  		if s == "et" {
    46  			// コイル温度効率
    47  			Hccca.et = dt
    48  		} else if s == "eh" {
    49  			// コイルエンタルピー効率
    50  			Hccca.eh = dt
    51  		} else if s == "KA" {
    52  			// コイルの熱通過率と伝熱面積の積 [W/K]
    53  			Hccca.KA = dt
    54  		} else {
    55  			id = 1
    56  		}
    57  	}
    58  
    59  	return id
    60  }
    61  
    62  /* ------------------------------------------ */
    63  func Hccdwint(_hcc []*HCC) {
    64  	for _, hcc := range _hcc {
    65  
    66  		// 乾きコイルと湿りコイルの判定
    67  		if hcc.Cat.eh > 1.0e-10 {
    68  			hcc.Wet = 'w' // 湿りコイル
    69  		} else {
    70  			hcc.Wet = 'd' // 乾きコイル
    71  		}
    72  
    73  		// 温度効率固定タイプと変動タイプの判定
    74  		if hcc.Cat.et > 0.0 {
    75  			hcc.Etype = 'e' // 定格(温度効率固定タイプ)
    76  		} else if hcc.Cat.KA > 0.0 {
    77  			hcc.Etype = 'k' // 変動タイプ
    78  		} else {
    79  			fmt.Printf("Hcc %s  Undefined Character et or KA\n", hcc.Name)
    80  			hcc.Etype = '-'
    81  		}
    82  
    83  		// 入口水温、入口空気絶対湿度を初期化
    84  		//Hcc.Twin = 5.0
    85  		//Hcc.xain = FNXtr(25.0, 50.0)
    86  	}
    87  }
    88  
    89  /* ------------------------------------------ */
    90  /*  特性式の係数  */
    91  
    92  //
    93  // [IN 1] ----> +-----+ ----> [OUT 1] 空気の温度
    94  // [IN 2] ----> | HCC | ----> [OUT 2] 空気の絶対湿度
    95  // [IN 3] ----> +-----+ ----> [OUT 3] 水の温度
    96  //
    97  func Hcccfv(_hcc []*HCC) {
    98  	for _, hcc := range _hcc {
    99  		hcc.Ga = 0.0
   100  		hcc.Gw = 0.0
   101  		hcc.et = 0.0
   102  		hcc.eh = 0.0
   103  
   104  		// 経路が停止していなければ
   105  		if hcc.Cmp.Control == OFF_SW {
   106  			continue
   107  		}
   108  
   109  		// 機器出力は3つ
   110  		if len(hcc.Cmp.Elouts) != 3 || len(hcc.Cmp.Elins) != 0 {
   111  			panic("HCCの機器出力数は3、機器入力は0です。")
   112  		}
   113  
   114  		eo_ta := hcc.Cmp.Elouts[0] // 排気温度
   115  		eo_xa := hcc.Cmp.Elouts[1] // 排気湿度
   116  		eo_tw := hcc.Cmp.Elouts[2] // 排水温度
   117  
   118  		var AirSW, WaterSW ControlSWType
   119  
   120  		// 排気量・排気熱量
   121  		hcc.Ga = eo_ta.G                        // 排気量
   122  		hcc.cGa = Spcheat(eo_ta.Fluid) * hcc.Ga // 排気熱量
   123  		if hcc.Ga > 0.0 {
   124  			AirSW = ON_SW
   125  		} else {
   126  			AirSW = OFF_SW
   127  		}
   128  
   129  		// 排水量・排水熱量
   130  		hcc.Gw = eo_tw.G                        // 排水量
   131  		hcc.cGw = Spcheat(eo_tw.Fluid) * hcc.Gw // 排水熱量
   132  		if hcc.Gw > 0.0 {
   133  			WaterSW = ON_SW
   134  		} else {
   135  			WaterSW = OFF_SW
   136  		}
   137  
   138  		// 温度効率
   139  		if hcc.Etype == 'e' {
   140  			// 定格温度効率
   141  			hcc.et = hcc.Cat.et
   142  		} else if hcc.Etype == 'k' {
   143  			// 温度効率を計算
   144  			hcc.et = FNhccet(hcc.cGa, hcc.cGw, hcc.Cat.KA)
   145  		} else {
   146  			panic(hcc.Etype)
   147  		}
   148  
   149  		// エンタルピ効率 [-]
   150  		hcc.eh = hcc.Cat.eh
   151  
   152  		// 冷温水コイルの処理熱量
   153  		hcc.Et, hcc.Ex, hcc.Ew = wcoil(AirSW, WaterSW, hcc.Wet, hcc.Ga*hcc.et, hcc.Ga*hcc.eh, hcc.Xain, hcc.Twin)
   154  
   155  		// 排気温度に関する係数の設定
   156  		eo_ta.Coeffo = hcc.cGa
   157  		eo_ta.Co = -(hcc.Et.C)
   158  		eo_ta.Coeffin[0] = hcc.Et.T - hcc.cGa
   159  		eo_ta.Coeffin[1] = hcc.Et.X
   160  		eo_ta.Coeffin[2] = -(hcc.Et.W)
   161  
   162  		// 排気湿度に関する係数の設定
   163  		eo_xa.Coeffo = hcc.Ga
   164  		eo_xa.Co = -(hcc.Ex.C)
   165  		eo_xa.Coeffin[0] = hcc.Ex.T
   166  		eo_xa.Coeffin[1] = hcc.Ex.X - hcc.Ga
   167  		eo_xa.Coeffin[2] = -(hcc.Ex.W)
   168  
   169  		// 排水温度に関する係数の設定
   170  		eo_tw.Coeffo = hcc.cGw
   171  		eo_tw.Co = hcc.Ew.C
   172  		eo_tw.Coeffin[0] = -(hcc.Ew.T)
   173  		eo_tw.Coeffin[1] = -(hcc.Ew.X)
   174  		eo_tw.Coeffin[2] = hcc.Ew.W - hcc.cGw
   175  	}
   176  }
   177  
   178  /* ------------------------------------------ */
   179  
   180  // 供給熱量の計算
   181  func Hccdwreset(Hcc []*HCC, DWreset *int) {
   182  	for i, hcc := range Hcc {
   183  		xain := hcc.Cmp.Elins[1].Sysvin // <給気>絶対湿度 [kg/kg]
   184  		Twin := hcc.Cmp.Elins[2].Sysvin // <給水>温水の温度 [C]
   185  
   186  		reset := false
   187  		if hcc.Cat.eh > 1.0e-10 {
   188  			Tdp := FNDp(FNPwx(xain)) // 露点温度
   189  			if hcc.Wet == 'w' && Twin > Tdp {
   190  				// 露点温度を上回った => 結露なし (乾きコイル)
   191  				hcc.Wet = 'd'
   192  				reset = true
   193  			} else if hcc.Wet == 'd' && Twin < Tdp {
   194  				// 露点温度を上回った => 結露あり (湿りコイル)
   195  				hcc.Wet = 'w'
   196  				reset = true
   197  			}
   198  
   199  			if reset {
   200  				(*DWreset)++
   201  				Hcccfv(Hcc[i : i+1])
   202  			}
   203  		}
   204  	}
   205  }
   206  
   207  /* ------------------------------------------ */
   208  
   209  // 冷温水コイルHccの供給熱量 Qs, Ql, Qt の計算を行う。
   210  func Hccene(Hcc []*HCC) {
   211  	for _, hcc := range Hcc {
   212  		hcc.Tain = hcc.Cmp.Elins[0].Sysvin // <給気>空気温度 [C]
   213  		hcc.Xain = hcc.Cmp.Elins[1].Sysvin // <給気>絶対湿度 [kg/kg]
   214  		hcc.Twin = hcc.Cmp.Elins[2].Sysvin // <給水>温水の温度 [C]
   215  
   216  		if hcc.Cmp.Control != OFF_SW {
   217  			// <排気>空気温度 [C]
   218  			hcc.Taout = hcc.Cmp.Elouts[0].Sysv
   219  			hcc.Qs = hcc.cGa * (hcc.Taout - hcc.Tain)
   220  
   221  			// <排気>空気絶対湿度 [kg/kg]
   222  			Xaout := hcc.Cmp.Elouts[1].Sysv
   223  			hcc.Ql = Ro * hcc.Ga * (Xaout - hcc.Xain)
   224  
   225  			// <排水>温水の温度 [C]
   226  			hcc.Twout = hcc.Cmp.Elouts[2].Sysv
   227  			hcc.Qt = hcc.cGw * (hcc.Twout - hcc.Twin)
   228  		} else {
   229  			// 経路が停止している場合は熱供給しない
   230  			hcc.Qs = 0.0
   231  			hcc.Ql = 0.0
   232  			hcc.Qt = 0.0
   233  		}
   234  	}
   235  }
   236  
   237  /* ------------------------------------------ */
   238  
   239  // 冷温水コイルHccの状態をfoに出力する。
   240  func hccprint(fo io.Writer, id int, Hcc []*HCC) {
   241  	switch id {
   242  	case 0:
   243  		if len(Hcc) > 0 {
   244  			fmt.Fprintf(fo, "%s %d\n", HCCOIL_TYPE, len(Hcc))
   245  		}
   246  		for _, hcc := range Hcc {
   247  			fmt.Fprintf(fo, " %s 1 16\n", hcc.Name)
   248  		}
   249  	case 1:
   250  		for _, hcc := range Hcc {
   251  			fmt.Fprintf(fo, "%s_ca c c %s_Ga m f %s_Ti t f %s_To t f %s_Qs q f\n", hcc.Name, hcc.Name, hcc.Name, hcc.Name, hcc.Name)
   252  			fmt.Fprintf(fo, "%s_cx c c %s_xi x f %s_xo x f %s_Ql q f\n", hcc.Name, hcc.Name, hcc.Name, hcc.Name)
   253  			fmt.Fprintf(fo, "%s_cw c c %s_Gw m f %s_Twi t f %s_Two t f %s_Qt q f\n", hcc.Name, hcc.Name, hcc.Name, hcc.Name, hcc.Name)
   254  			fmt.Fprintf(fo, "%s_et m f %s_eh m f\n\n", hcc.Name, hcc.Name)
   255  		}
   256  	default:
   257  		for _, hcc := range Hcc {
   258  			// 給排気温度に関する事項
   259  			eo_ta := hcc.Cmp.Elouts[0]
   260  			fmt.Fprintf(fo, "%c %6.4g %4.1f %4.1f %2.0f ", eo_ta.Control, hcc.Ga, hcc.Tain, eo_ta.Sysv, hcc.Qs)
   261  
   262  			// 給排気湿度に関する事項
   263  			eo_xa := hcc.Cmp.Elouts[1]
   264  			fmt.Fprintf(fo, "%c %5.3f %5.3f %2.0f ", eo_xa.Control, hcc.Xain, eo_xa.Sysv, hcc.Ql)
   265  
   266  			// 給排水温度に関する事項
   267  			eo_tw := hcc.Cmp.Elouts[2]
   268  			fmt.Fprintf(fo, "%c %6.4g %4.1f %4.1f %2.0f ", eo_tw.Control, hcc.Gw, hcc.Twin, eo_tw.Sysv, hcc.Qt)
   269  
   270  			// 温度効率、エンタルピー
   271  			fmt.Fprintf(fo, "%6.4g %6.4g\n", hcc.et, hcc.eh)
   272  		}
   273  	}
   274  }
   275  
   276  /* ------------------------------ */
   277  
   278  /* 日積算値に関する処理 */
   279  
   280  func hccdyint(Hcc []*HCC) {
   281  	for _, hcc := range Hcc {
   282  		svdyint(&hcc.Taidy)
   283  		svdyint(&hcc.xaidy)
   284  		svdyint(&hcc.Twidy)
   285  		qdyint(&hcc.Qdys)
   286  		qdyint(&hcc.Qdyl)
   287  		qdyint(&hcc.Qdyt)
   288  	}
   289  }
   290  
   291  func hccmonint(Hcc []*HCC) {
   292  	for _, hcc := range Hcc {
   293  		svdyint(&hcc.mTaidy)
   294  		svdyint(&hcc.mxaidy)
   295  		svdyint(&hcc.mTwidy)
   296  		qdyint(&hcc.mQdys)
   297  		qdyint(&hcc.mQdyl)
   298  		qdyint(&hcc.mQdyt)
   299  	}
   300  }
   301  
   302  func hccday(Mon, Day, ttmm int, Hcc []*HCC, Nday, SimDayend int) {
   303  	for _, hcc := range Hcc {
   304  		// 日集計
   305  		svdaysum(int64(ttmm), hcc.Cmp.Control, hcc.Tain, &hcc.Taidy)
   306  		svdaysum(int64(ttmm), hcc.Cmp.Control, hcc.Xain, &hcc.xaidy)
   307  		svdaysum(int64(ttmm), hcc.Cmp.Control, hcc.Twin, &hcc.Twidy)
   308  		qdaysum(int64(ttmm), hcc.Cmp.Control, hcc.Qs, &hcc.Qdys)
   309  		qdaysum(int64(ttmm), hcc.Cmp.Control, hcc.Ql, &hcc.Qdyl)
   310  		qdaysum(int64(ttmm), hcc.Cmp.Control, hcc.Qt, &hcc.Qdyt)
   311  
   312  		// 月集計
   313  		svmonsum(Mon, Day, ttmm, hcc.Cmp.Control, hcc.Tain, &hcc.mTaidy, Nday, SimDayend)
   314  		svmonsum(Mon, Day, ttmm, hcc.Cmp.Control, hcc.Xain, &hcc.mxaidy, Nday, SimDayend)
   315  		svmonsum(Mon, Day, ttmm, hcc.Cmp.Control, hcc.Twin, &hcc.mTwidy, Nday, SimDayend)
   316  		qmonsum(Mon, Day, ttmm, hcc.Cmp.Control, hcc.Qs, &hcc.mQdys, Nday, SimDayend)
   317  		qmonsum(Mon, Day, ttmm, hcc.Cmp.Control, hcc.Ql, &hcc.mQdyl, Nday, SimDayend)
   318  		qmonsum(Mon, Day, ttmm, hcc.Cmp.Control, hcc.Qt, &hcc.mQdyt, Nday, SimDayend)
   319  	}
   320  }
   321  
   322  func hccdyprt(fo io.Writer, id int, Hcc []*HCC) {
   323  	switch id {
   324  	case 0:
   325  		if len(Hcc) > 0 {
   326  			fmt.Fprintf(fo, "%s %d\n", HCCOIL_TYPE, len(Hcc))
   327  		}
   328  		for _, hcc := range Hcc {
   329  			fmt.Fprintf(fo, "%s 4 42 14 14 14\n", hcc.Name)
   330  		}
   331  	case 1:
   332  		for _, hcc := range Hcc {
   333  			fmt.Fprintf(fo, "%s_Ht H d %s_T T f ", hcc.Name, hcc.Name)
   334  			fmt.Fprintf(fo, "%s_ttn h d %s_Tn t f %s_ttm h d %s_Tm t f\n",
   335  				hcc.Name, hcc.Name, hcc.Name, hcc.Name)
   336  			fmt.Fprintf(fo, "%s_Hsh H d %s_Qsh Q f %s_Hsc H d %s_Qsc Q f\n",
   337  				hcc.Name, hcc.Name, hcc.Name, hcc.Name)
   338  			fmt.Fprintf(fo, "%s_tsh h d %s_qsh q f %s_tsc h d %s_qsc q f\n",
   339  				hcc.Name, hcc.Name, hcc.Name, hcc.Name)
   340  
   341  			fmt.Fprintf(fo, "%s_Hx H d %s_x X f ", hcc.Name, hcc.Name)
   342  			fmt.Fprintf(fo, "%s_txn h d %s_xn x f %s_txm h d %s_xm c f\n",
   343  				hcc.Name, hcc.Name, hcc.Name, hcc.Name)
   344  			fmt.Fprintf(fo, "%s_Hlh H d %s_Qlh Q f %s_Hlc H d %s_Qlc Q f\n",
   345  				hcc.Name, hcc.Name, hcc.Name, hcc.Name)
   346  			fmt.Fprintf(fo, "%s_tlh h d %s_qlh q f %s_tlc h d %s_qlc q f\n",
   347  				hcc.Name, hcc.Name, hcc.Name, hcc.Name)
   348  
   349  			fmt.Fprintf(fo, "%s_Htw H d %s_Tw T f ", hcc.Name, hcc.Name)
   350  			fmt.Fprintf(fo, "%s_ttwn h d %s_Twn t f %s_ttwm h d %s_Twm t f\n",
   351  				hcc.Name, hcc.Name, hcc.Name, hcc.Name)
   352  			fmt.Fprintf(fo, "%s_Hth H d %s_Qth Q f %s_Htc H d %s_Qtc Q f\n",
   353  				hcc.Name, hcc.Name, hcc.Name, hcc.Name)
   354  			fmt.Fprintf(fo, "%s_tth h d %s_qth q f %s_ttc h d %s_qtc q f\n\n",
   355  				hcc.Name, hcc.Name, hcc.Name, hcc.Name)
   356  		}
   357  	default:
   358  		for _, hcc := range Hcc {
   359  			fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ",
   360  				hcc.Taidy.Hrs, hcc.Taidy.M,
   361  				hcc.Taidy.Mntime, hcc.Taidy.Mn,
   362  				hcc.Taidy.Mxtime, hcc.Taidy.Mx)
   363  			fmt.Fprintf(fo, "%1d %3.1f ", hcc.Qdys.Hhr, hcc.Qdys.H)
   364  			fmt.Fprintf(fo, "%1d %3.1f ", hcc.Qdys.Chr, hcc.Qdys.C)
   365  			fmt.Fprintf(fo, "%1d %2.0f ", hcc.Qdys.Hmxtime, hcc.Qdys.Hmx)
   366  			fmt.Fprintf(fo, "%1d %2.0f ", hcc.Qdys.Cmxtime, hcc.Qdys.Cmx)
   367  
   368  			fmt.Fprintf(fo, "%1d %5.4f %1d %5.4f %1d %5.4f ",
   369  				hcc.xaidy.Hrs, hcc.xaidy.M,
   370  				hcc.xaidy.Mntime, hcc.xaidy.Mn,
   371  				hcc.xaidy.Mxtime, hcc.xaidy.Mx)
   372  			fmt.Fprintf(fo, "%1d %3.1f ", hcc.Qdyl.Hhr, hcc.Qdyl.H)
   373  			fmt.Fprintf(fo, "%1d %3.1f ", hcc.Qdyl.Chr, hcc.Qdyl.C)
   374  			fmt.Fprintf(fo, "%1d %2.0f ", hcc.Qdyl.Hmxtime, hcc.Qdyl.Hmx)
   375  			fmt.Fprintf(fo, "%1d %2.0f ", hcc.Qdyl.Cmxtime, hcc.Qdyl.Cmx)
   376  
   377  			fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ",
   378  				hcc.Twidy.Hrs, hcc.Twidy.M,
   379  				hcc.Twidy.Mntime, hcc.Twidy.Mn,
   380  				hcc.Twidy.Mxtime, hcc.Twidy.Mx)
   381  			fmt.Fprintf(fo, "%1d %3.1f ", hcc.Qdyt.Hhr, hcc.Qdyt.H)
   382  			fmt.Fprintf(fo, "%1d %3.1f ", hcc.Qdyt.Chr, hcc.Qdyt.C)
   383  			fmt.Fprintf(fo, "%1d %2.0f ", hcc.Qdyt.Hmxtime, hcc.Qdyt.Hmx)
   384  			fmt.Fprintf(fo, "%1d %2.0f\n", hcc.Qdyt.Cmxtime, hcc.Qdyt.Cmx)
   385  		}
   386  	}
   387  }
   388  
   389  func hccmonprt(fo io.Writer, id int, Hcc []*HCC) {
   390  	switch id {
   391  	case 0:
   392  		if len(Hcc) > 0 {
   393  			fmt.Fprintf(fo, "%s %d\n", HCCOIL_TYPE, len(Hcc))
   394  		}
   395  		for _, hcc := range Hcc {
   396  			fmt.Fprintf(fo, "%s 4 42 14 14 14\n", hcc.Name)
   397  		}
   398  	case 1:
   399  		for _, hcc := range Hcc {
   400  			fmt.Fprintf(fo, "%s_Ht H d %s_T T f ", hcc.Name, hcc.Name)
   401  			fmt.Fprintf(fo, "%s_ttn h d %s_Tn t f %s_ttm h d %s_Tm t f\n",
   402  				hcc.Name, hcc.Name, hcc.Name, hcc.Name)
   403  			fmt.Fprintf(fo, "%s_Hsh H d %s_Qsh Q f %s_Hsc H d %s_Qsc Q f\n",
   404  				hcc.Name, hcc.Name, hcc.Name, hcc.Name)
   405  			fmt.Fprintf(fo, "%s_tsh h d %s_qsh q f %s_tsc h d %s_qsc q f\n",
   406  				hcc.Name, hcc.Name, hcc.Name, hcc.Name)
   407  
   408  			fmt.Fprintf(fo, "%s_Hx H d %s_x X f ", hcc.Name, hcc.Name)
   409  			fmt.Fprintf(fo, "%s_txn h d %s_xn x f %s_txm h d %s_xm c f\n",
   410  				hcc.Name, hcc.Name, hcc.Name, hcc.Name)
   411  			fmt.Fprintf(fo, "%s_Hlh H d %s_Qlh Q f %s_Hlc H d %s_Qlc Q f\n",
   412  				hcc.Name, hcc.Name, hcc.Name, hcc.Name)
   413  			fmt.Fprintf(fo, "%s_tlh h d %s_qlh q f %s_tlc h d %s_qlc q f\n",
   414  				hcc.Name, hcc.Name, hcc.Name, hcc.Name)
   415  
   416  			fmt.Fprintf(fo, "%s_Htw H d %s_Tw T f ", hcc.Name, hcc.Name)
   417  			fmt.Fprintf(fo, "%s_ttwn h d %s_Twn t f %s_ttwm h d %s_Twm t f\n",
   418  				hcc.Name, hcc.Name, hcc.Name, hcc.Name)
   419  			fmt.Fprintf(fo, "%s_Hth H d %s_Qth Q f %s_Htc H d %s_Qtc Q f\n",
   420  				hcc.Name, hcc.Name, hcc.Name, hcc.Name)
   421  			fmt.Fprintf(fo, "%s_tth h d %s_qth q f %s_ttc h d %s_qtc q f\n\n",
   422  				hcc.Name, hcc.Name, hcc.Name, hcc.Name)
   423  		}
   424  	default:
   425  		for _, hcc := range Hcc {
   426  			fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ",
   427  				hcc.mTaidy.Hrs, hcc.mTaidy.M,
   428  				hcc.mTaidy.Mntime, hcc.mTaidy.Mn,
   429  				hcc.mTaidy.Mxtime, hcc.mTaidy.Mx)
   430  			fmt.Fprintf(fo, "%1d %3.1f ", hcc.mQdys.Hhr, hcc.mQdys.H)
   431  			fmt.Fprintf(fo, "%1d %3.1f ", hcc.mQdys.Chr, hcc.mQdys.C)
   432  			fmt.Fprintf(fo, "%1d %2.0f ", hcc.mQdys.Hmxtime, hcc.mQdys.Hmx)
   433  			fmt.Fprintf(fo, "%1d %2.0f ", hcc.mQdys.Cmxtime, hcc.mQdys.Cmx)
   434  
   435  			fmt.Fprintf(fo, "%1d %5.4f %1d %5.4f %1d %5.4f ",
   436  				hcc.mxaidy.Hrs, hcc.mxaidy.M,
   437  				hcc.mxaidy.Mntime, hcc.mxaidy.Mn,
   438  				hcc.mxaidy.Mxtime, hcc.mxaidy.Mx)
   439  			fmt.Fprintf(fo, "%1d %3.1f ", hcc.mQdyl.Hhr, hcc.mQdyl.H)
   440  			fmt.Fprintf(fo, "%1d %3.1f ", hcc.mQdyl.Chr, hcc.mQdyl.C)
   441  			fmt.Fprintf(fo, "%1d %2.0f ", hcc.mQdyl.Hmxtime, hcc.mQdyl.Hmx)
   442  			fmt.Fprintf(fo, "%1d %2.0f ", hcc.mQdyl.Cmxtime, hcc.mQdyl.Cmx)
   443  
   444  			fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ",
   445  				hcc.mTwidy.Hrs, hcc.mTwidy.M,
   446  				hcc.mTwidy.Mntime, hcc.mTwidy.Mn,
   447  				hcc.mTwidy.Mxtime, hcc.mTwidy.Mx)
   448  			fmt.Fprintf(fo, "%1d %3.1f ", hcc.mQdyt.Hhr, hcc.mQdyt.H)
   449  			fmt.Fprintf(fo, "%1d %3.1f ", hcc.mQdyt.Chr, hcc.mQdyt.C)
   450  			fmt.Fprintf(fo, "%1d %2.0f ", hcc.mQdyt.Hmxtime, hcc.mQdyt.Hmx)
   451  			fmt.Fprintf(fo, "%1d %2.0f\n", hcc.mQdyt.Cmxtime, hcc.mQdyt.Cmx)
   452  		}
   453  	}
   454  }
   455  
   456  // 温水コイルの温度効率計算関数
   457  // 計算モデルは向流コイル
   458  func FNhccet(Wa, Ww, KA float64) float64 {
   459  	Ws := Wa
   460  	Wl := Ww
   461  
   462  	NTU := KA / Ws
   463  	C := Ws / Wl
   464  	B := (1.0 - C) * NTU
   465  
   466  	if math.Abs(Ws-Wl) < 1.0e-5 {
   467  		return NTU / (1.0 + NTU)
   468  	} else {
   469  		if exB := math.Exp(-B); math.IsInf(exB, 0) {
   470  			return 1.0 / C
   471  		} else {
   472  			return (1.0 - exB) / (1.0 - C*exB)
   473  		}
   474  	}
   475  }