github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/mcdesiccant.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  /*  mcdessicant.C  */
    17  /*  バッチ式デシカント空調機 */
    18  
    19  package eeslism
    20  
    21  import (
    22  	"errors"
    23  	"fmt"
    24  	"io"
    25  	"strconv"
    26  	"strings"
    27  )
    28  
    29  /* ------------------------------------------ */
    30  
    31  // 要素方程式の変数のためのメモリの割り当て
    32  func Desielm(Desi []*DESI) {
    33  	for _, desi := range Desi {
    34  		Eot := desi.Cmp.Elouts[0] // 空気温度出口
    35  		Eox := desi.Cmp.Elouts[1] // 空気湿度出口
    36  
    37  		elin := Eot.Elins[1]
    38  		elin.Upo = Eox.Elins[0].Upo // 出口空気温度の要素方程式の2つめの変数は絶対湿度
    39  		elin.Upv = Eox.Elins[0].Upo
    40  
    41  		elin = Eox.Elins[1]
    42  		elin.Upo = Eot.Elins[0].Upo // 出口絶対湿度の要素方程式の2つめの変数は空気温度
    43  		elin.Upv = Eot.Elins[0].Upo // 空気温度の要素方程式の2つ目の変数(空気入口温度)のupo、upvに空気湿度をつなげる
    44  	}
    45  }
    46  
    47  /* 機器仕様入力      */
    48  
    49  /*---- Satoh追加 2013/10/20 ----*/
    50  func Desiccantdata(s string, desica *DESICA) int {
    51  	st := strings.Index(s, "=")
    52  	var dt float64
    53  	var id int
    54  
    55  	if st == -1 {
    56  		desica.name = s
    57  		desica.r = -999.0
    58  		desica.rows = -999.0
    59  		desica.Uad = -999.0
    60  		desica.A = -999.0
    61  		desica.Vm = 18.0
    62  		desica.eps = 0.4764
    63  		desica.P0 = 0.4
    64  		desica.kp = 0.0012
    65  		desica.cps = 710.0
    66  		desica.ms = -999.0
    67  	} else {
    68  		st++
    69  		dt, _ = strconv.ParseFloat(s[st:], 64)
    70  
    71  		switch {
    72  		case s == "Uad": // シリカゲル槽壁面の熱貫流率[W/m2K]
    73  			desica.Uad = dt
    74  		case s == "A": // シリカゲル槽表面積[m2]
    75  			desica.A = dt
    76  		case s == "ms": // シリカゲル質量[g]
    77  			desica.ms = dt
    78  		case s == "r": // シリカゲル平均直径[cm]
    79  			desica.r = dt
    80  		case s == "rows": // シリカゲル充填密度[g/cm3]
    81  			desica.rows = dt
    82  		default:
    83  			id = 1
    84  		}
    85  	}
    86  	return id
    87  }
    88  
    89  /* --------------------------- */
    90  
    91  /*  管長・ダクト長、周囲温度設定 */
    92  
    93  func Desiint(Desi []*DESI, Simc *SIMCONTL, Compnt []*COMPNT, Wd *WDAT) {
    94  	var Err string
    95  	var Desica *DESICA
    96  
    97  	for _, desi := range Desi {
    98  
    99  		if desi.Cmp.Envname != "" {
   100  			desi.Tenv = envptr(desi.Cmp.Envname, Simc, Compnt, Wd, nil)
   101  		} else {
   102  			desi.Room = roomptr(desi.Cmp.Roomname, Compnt)
   103  		}
   104  
   105  		Desica = desi.Cat
   106  
   107  		if Desica.Uad < 0.0 {
   108  			Err = fmt.Sprintf("Name=%s  Uad=%.4g", Desica.name, Desica.Uad)
   109  			Eprint("Desiint", Err)
   110  		}
   111  		if Desica.A < 0.0 {
   112  			Err = fmt.Sprintf("Name=%s  A=%.4g", Desica.name, Desica.A)
   113  			Eprint("Desiint", Err)
   114  		}
   115  		if Desica.r < 0.0 {
   116  			Err = fmt.Sprintf("Name=%s  r=%.4g", Desica.name, Desica.r)
   117  			Eprint("Desiint", Err)
   118  		}
   119  		if Desica.rows < 0.0 {
   120  			Err = fmt.Sprintf("Name=%s  rows=%.4g", Desica.name, Desica.rows)
   121  			Eprint("Desiint", Err)
   122  		}
   123  		if Desica.ms < 0.0 {
   124  			Err = fmt.Sprintf("Name=%s  ms=%.4g", Desica.name, Desica.ms)
   125  			Eprint("Desiint", Err)
   126  		}
   127  
   128  		// 初期温度、出入口温度の初期化
   129  		desi.Tsold = 20.0
   130  		desi.Xsold = FNXtr(desi.Tsold, 50.0)
   131  		desi.Tain = desi.Tsold
   132  		desi.Taout = desi.Tsold
   133  		desi.Xain = desi.Xsold
   134  		desi.Xaout = desi.Xsold
   135  
   136  		// デシカント槽熱損失係数の計算
   137  		desi.UA = Desica.Uad * Desica.A
   138  
   139  		// 吸湿量の初期化
   140  		desi.Pold = Desica.P0
   141  
   142  		// シリカゲルと槽内空気の熱伝達面積[m2]
   143  		desi.Asa = 3.0 * Desica.ms * 1000.0 * (1.0 - Desica.eps) / (1.0e4 * (Desica.r / 10.0) * Desica.rows)
   144  
   145  		// 逆行列
   146  		desi.UX = make([]float64, 5*5)
   147  		desi.UXC = make([]float64, 5)
   148  	}
   149  }
   150  
   151  /* --------------------------- */
   152  
   153  /*  特性式の係数  */
   154  
   155  //
   156  // 温度 [IN 1] --> +------+ --> [OUT 1] 出口温度
   157  //                 | DESI |
   158  // 湿度 [IN 2] --> +------+ --> [OUT 2] 出口湿度
   159  //
   160  func Desicfv(Desi []*DESI) {
   161  	var Eo1 *ELOUT
   162  	var h, i, j float64
   163  	var Te, hsa, hsad, hAsa, hdAsa float64
   164  	var Desica *DESICA
   165  	var U, C, Cmat []float64
   166  
   167  	N := 5
   168  	N2 := N * N
   169  	for _, desi := range Desi {
   170  		Desica = desi.Cat
   171  
   172  		// 係数行列のメモリ確保
   173  		U = make([]float64, N2)
   174  		// 定数行列のメモリ確保
   175  		C = make([]float64, N)
   176  
   177  		if desi.Cmp.Envname != "" {
   178  			Te = *desi.Tenv
   179  		} else {
   180  			Te = desi.Room.Tot
   181  		}
   182  
   183  		Eo1 = desi.Cmp.Elouts[0]
   184  		// 熱容量流量の計算
   185  		desi.CG = Spcheat(Eo1.Fluid) * Eo1.G
   186  
   187  		// シリカゲルと槽内空気の対流熱伝達率の計算
   188  		if Eo1.Cmp.Control == OFF_SW {
   189  			hsa = 4.614
   190  		} else {
   191  			hsa = 40.0
   192  		}
   193  
   194  		// シリカゲルと槽内空気の湿気伝達率の計算
   195  		hsad = hsa / Ca
   196  
   197  		hAsa = hsa * desi.Asa
   198  		hdAsa = hsad * desi.Asa
   199  
   200  		if desi.Pold >= 0.25 {
   201  			h = 0.001319
   202  			i = 0.103335
   203  			j = -0.05416
   204  		} else {
   205  			h = 0.001158
   206  			i = 0.149479
   207  			j = -0.05835
   208  		}
   209  
   210  		// 定数行列Cの作成
   211  		Cmat = C
   212  		Cmat[0] = Desica.ms * Desica.cps / DTM * desi.Tsold
   213  		Cmat[1] = desi.UA * Te
   214  		Cmat[3] = Desica.ms / DTM * desi.Pold
   215  		Cmat[4] = -j
   216  
   217  		// 係数行列の作成
   218  		U[0*N+0] = Desica.ms*Desica.cps/DTM + hAsa
   219  		U[0*N+1] = -hAsa
   220  		U[0*N+2] = -hdAsa * Ro
   221  		U[0*N+3] = hdAsa * Ro
   222  		U[1*N+0] = -hAsa
   223  		U[1*N+1] = Ca*Eo1.G + hAsa + desi.UA
   224  		U[2*N+2] = Eo1.G + hdAsa
   225  		U[2*N+3] = -hdAsa
   226  		U[3*N+2] = -hdAsa
   227  		U[3*N+3] = hdAsa
   228  		U[3*N+4] = Desica.ms / DTM
   229  		U[4*N+0] = h
   230  		U[4*N+3] = -1.0
   231  		U[4*N+4] = i
   232  
   233  		// 逆行列の計算
   234  		Matinv(U, N, N, "<Desicfv U>")
   235  
   236  		// 行列のコピー
   237  		matinit(desi.UX, N2)
   238  		matcpy(U, desi.UX, N2)
   239  
   240  		// {UXC}=[UX]*{C}の作成
   241  		matinit(desi.UXC, N)
   242  		for ii := 0; ii < N; ii++ {
   243  			for jj := 0; jj < N; jj++ {
   244  				desi.UXC[ii] += desi.UX[ii*N+jj] * C[jj]
   245  			}
   246  		}
   247  
   248  		// 出口温度の要素方程式
   249  		Eo1.Coeffo = -1.0
   250  		Eo1.Co = -desi.UXC[1]
   251  		Eo1.Coeffin[0] = desi.UX[1*N+1] * Eo1.G * Ca
   252  		Eo1.Coeffin[1] = desi.UX[1*N+2] * Eo1.G
   253  
   254  		// 出口湿度の要素方程式
   255  		Eo2 := desi.Cmp.Elouts[1]
   256  		Eo2.Coeffo = -1.0
   257  		Eo2.Co = -desi.UXC[2]
   258  		Eo2.Coeffin[0] = desi.UX[2*N+2] * Eo2.G
   259  		Eo2.Coeffin[1] = desi.UX[2*N+1] * Eo2.G * Ca
   260  	}
   261  }
   262  
   263  ///* --------------------------- */
   264  //
   265  ///* 取得熱量の計算 */
   266  //
   267  func Desiene(Desi []*DESI) {
   268  	Sin := make([]float64, 5)
   269  	S := make([]float64, 5)
   270  
   271  	N := 5
   272  	//N2 := N * N
   273  	for _, desi := range Desi {
   274  		matinit(Sin, N)
   275  		matinit(S, N)
   276  		elo := desi.Cmp.Elouts[0]
   277  		elox := desi.Cmp.Elouts[1]
   278  		elix := elo.Elins[1]
   279  		desi.Tain = elo.Elins[0].Sysvin
   280  		desi.Xain = elix.Sysvin
   281  
   282  		var Te float64
   283  		if desi.Cmp.Envname != "" {
   284  			Te = *desi.Tenv
   285  		} else {
   286  			Te = desi.Room.Tot
   287  		}
   288  
   289  		desi.Taout = elo.Sysv
   290  		desi.Xaout = elox.Sysv
   291  
   292  		// 入口状態行列Sinの作成
   293  		Sin[1] = Ca * elo.G * desi.Tain
   294  		Sin[2] = elo.G * desi.Xain
   295  		// 内部状態値の計算
   296  		for ii := 0; ii < N; ii++ {
   297  			for jj := 0; jj < N; jj++ {
   298  				S[ii] += desi.UX[ii*N+jj] * Sin[jj]
   299  			}
   300  			S[ii] += desi.UXC[ii]
   301  		}
   302  		// 変数への格納
   303  		desi.Tsold = S[0]
   304  		desi.Ta = S[1]
   305  		desi.Xa = S[2]
   306  		desi.Xsold = S[3]
   307  		desi.Pold = S[4]
   308  		desi.RHold = FNRhtx(desi.Tsold, desi.Xsold)
   309  
   310  		// 顕熱の計算
   311  		desi.Qs = desi.CG * (desi.Taout - desi.Tain)
   312  		desi.Ql = elo.G * Ro * (desi.Xaout - desi.Xain)
   313  		desi.Qt = desi.Qs + desi.Ql
   314  
   315  		// デシカント槽からの熱損失の計算
   316  		desi.Qloss = desi.UA * (Te - desi.Ta)
   317  
   318  		// 設置室内部発熱の計算
   319  		if desi.Room != nil {
   320  			desi.Room.Qeqp += (-desi.Qloss)
   321  		}
   322  	}
   323  }
   324  
   325  // 制御で使用する内部変数
   326  func Desivptr(key []string, Desi *DESI) (VPTR, error) {
   327  	var err error
   328  	var vptr VPTR
   329  
   330  	switch key[1] {
   331  	case "Ts":
   332  		vptr.Ptr = &Desi.Tsold
   333  		vptr.Type = VAL_CTYPE
   334  	case "xs":
   335  		vptr.Ptr = &Desi.Xsold
   336  		vptr.Type = VAL_CTYPE
   337  	case "RH":
   338  		vptr.Ptr = &Desi.RHold
   339  		vptr.Type = VAL_CTYPE
   340  	default:
   341  		err = errors.New("'Ts', 'xs' or 'RH' is expected")
   342  	}
   343  
   344  	return vptr, err
   345  }
   346  
   347  ///* ---------------------------*/
   348  //
   349  func Desiprint(fo io.Writer, id int, Desi []*DESI) {
   350  	switch id {
   351  	case 0:
   352  		if len(Desi) > 0 {
   353  			fmt.Fprintf(fo, "%s %d\n", DESI_TYPE, len(Desi))
   354  		}
   355  		for _, desi := range Desi {
   356  			fmt.Fprintf(fo, " %s 1 14\n", desi.Name)
   357  		}
   358  	case 1:
   359  		for _, desi := range Desi {
   360  			fmt.Fprintf(fo, "%s_c c c %s_G m f %s_Ts t f %s_Ti t f %s_To t f %s_Qs q f ", desi.Name, desi.Name, desi.Name, desi.Name, desi.Name, desi.Name)
   361  			fmt.Fprintf(fo, "%s_xs x f %s_RHs r f %s_xi x f %s_xo x f %s_Ql q f %s_Qt q f ", desi.Name, desi.Name, desi.Name, desi.Name, desi.Name, desi.Name)
   362  			fmt.Fprintf(fo, "%s_Qls q f %s_P m f\n", desi.Name, desi.Name)
   363  		}
   364  	default:
   365  		for _, desi := range Desi {
   366  			fmt.Fprintf(fo, "%c %6.4g %4.1f %4.1f %4.1f %2.0f  ", desi.Cmp.Elouts[0].Control, desi.Cmp.Elouts[0].G, desi.Tsold, desi.Tain, desi.Taout, desi.Qs)
   367  			fmt.Fprintf(fo, "%.3f %.0f %.3f %.3f %2.0f %2.0f  ", desi.Xsold, desi.RHold, desi.Xain, desi.Xaout, desi.Ql, desi.Qt)
   368  			fmt.Fprintf(fo, "%.0f %.3f\n", desi.Qloss, desi.Pold)
   369  		}
   370  	}
   371  }
   372  
   373  ///* --------------------------- */
   374  //
   375  ///* 日積算値に関する処理 */
   376  //
   377  ///*******************/
   378  func Desidyint(Desi []*DESI) {
   379  	for _, desi := range Desi {
   380  		svdyint(&desi.Tidy)
   381  		svdyint(&desi.Tsdy)
   382  		svdyint(&desi.Tody)
   383  		svdyint(&desi.xidy)
   384  		svdyint(&desi.xsdy)
   385  		svdyint(&desi.xody)
   386  		qdyint(&desi.Qsdy)
   387  		qdyint(&desi.Qldy)
   388  		qdyint(&desi.Qtdy)
   389  		qdyint(&desi.Qlsdy)
   390  	}
   391  }
   392  
   393  func Desiday(Mon, Day, ttmm int, Desi []*DESI, Nday, SimDayend int) {
   394  	// Mo := Mon - 1
   395  	// tt := ConvertHour(ttmm)
   396  
   397  	for _, desi := range Desi {
   398  		// 日集計
   399  		svdaysum(int64(ttmm), desi.Cmp.Control, desi.Tain, &desi.Tidy)
   400  		svdaysum(int64(ttmm), desi.Cmp.Control, desi.Taout, &desi.Tody)
   401  		svdaysum(int64(ttmm), desi.Cmp.Control, desi.Tsold, &desi.Tsdy)
   402  		svdaysum(int64(ttmm), desi.Cmp.Control, desi.Xain, &desi.xidy)
   403  		svdaysum(int64(ttmm), desi.Cmp.Control, desi.Xaout, &desi.xody)
   404  		svdaysum(int64(ttmm), desi.Cmp.Control, desi.Xsold, &desi.xsdy)
   405  		qdaysum(int64(ttmm), desi.Cmp.Control, desi.Qs, &desi.Qsdy)
   406  		qdaysum(int64(ttmm), desi.Cmp.Control, desi.Ql, &desi.Qldy)
   407  		qdaysum(int64(ttmm), desi.Cmp.Control, desi.Qt, &desi.Qtdy)
   408  		qdaysum(int64(ttmm), desi.Cmp.Control, desi.Qloss, &desi.Qlsdy)
   409  	}
   410  }
   411  
   412  func Desidyprt(fo io.Writer, id int, Desi []*DESI) {
   413  	switch id {
   414  	case 0:
   415  		if len(Desi) > 0 {
   416  			fmt.Fprintf(fo, "%s %d\n", DESI_TYPE, len(Desi))
   417  		}
   418  		for _, desi := range Desi {
   419  			fmt.Fprintf(fo, " %s 1 68\n", desi.Name)
   420  		}
   421  	case 1:
   422  		for _, desi := range Desi {
   423  
   424  			fmt.Fprintf(fo, "%s_Ht H d %s_Ti T f ", desi.Name, desi.Name)
   425  			fmt.Fprintf(fo, "%s_ttn h d %s_Tin t f %s_ttm h d %s_Tim t f\n", desi.Name, desi.Name, desi.Name, desi.Name)
   426  
   427  			fmt.Fprintf(fo, "%s_Ht H d %s_To T f ", desi.Name, desi.Name)
   428  			fmt.Fprintf(fo, "%s_ttn h d %s_Ton t f %s_ttm h d %s_Tom t f\n", desi.Name, desi.Name, desi.Name, desi.Name)
   429  
   430  			fmt.Fprintf(fo, "%s_Ht H d %s_Ts T f ", desi.Name, desi.Name)
   431  			fmt.Fprintf(fo, "%s_ttn h d %s_Tsn t f %s_ttm h d %s_Tsm t f\n", desi.Name, desi.Name, desi.Name, desi.Name)
   432  
   433  			fmt.Fprintf(fo, "%s_Ht H d %s_xi T f ", desi.Name, desi.Name)
   434  			fmt.Fprintf(fo, "%s_ttn h d %s_xin t f %s_ttm h d %s_xim t f\n", desi.Name, desi.Name, desi.Name, desi.Name)
   435  
   436  			fmt.Fprintf(fo, "%s_Ht H d %s_xo T f ", desi.Name, desi.Name)
   437  			fmt.Fprintf(fo, "%s_ttn h d %s_xon t f %s_ttm h d %s_xom t f\n", desi.Name, desi.Name, desi.Name, desi.Name)
   438  
   439  			fmt.Fprintf(fo, "%s_Ht H d %s_xs T f ", desi.Name, desi.Name)
   440  			fmt.Fprintf(fo, "%s_ttn h d %s_xsn t f %s_ttm h d %s_xsm t f\n", desi.Name, desi.Name, desi.Name, desi.Name)
   441  
   442  			fmt.Fprintf(fo, "%s_Hsh H d %s_Qsh Q f %s_Hsc H d %s_Qsc Q f\n", desi.Name, desi.Name, desi.Name, desi.Name)
   443  			fmt.Fprintf(fo, "%s_tsh h d %s_qsh q f %s_tsc h d %s_qsc q f\n", desi.Name, desi.Name, desi.Name, desi.Name)
   444  
   445  			fmt.Fprintf(fo, "%s_Hlh H d %s_Qlh Q f %s_Hlc H d %s_Qlc Q f\n", desi.Name, desi.Name, desi.Name, desi.Name)
   446  			fmt.Fprintf(fo, "%s_tlh h d %s_qlh q f %s_tlc h d %s_qlc q f\n", desi.Name, desi.Name, desi.Name, desi.Name)
   447  
   448  			fmt.Fprintf(fo, "%s_Hth H d %s_Qth Q f %s_Htc H d %s_Qtc Q f\n", desi.Name, desi.Name, desi.Name, desi.Name)
   449  			fmt.Fprintf(fo, "%s_tth h d %s_qth q f %s_ttc h d %s_qtc q f\n", desi.Name, desi.Name, desi.Name, desi.Name)
   450  
   451  			fmt.Fprintf(fo, "%s_Hlsh H d %s_Qlsh Q f %s_Hlsc H d %s_Qlsc Q f\n", desi.Name, desi.Name, desi.Name, desi.Name)
   452  			fmt.Fprintf(fo, "%s_tlsh h d %s_qlsh q f %s_tlsc h d %s_qlsc q f\n", desi.Name, desi.Name, desi.Name, desi.Name)
   453  		}
   454  	default:
   455  		for _, desi := range Desi {
   456  			fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ", desi.Tidy.Hrs, desi.Tidy.M, desi.Tidy.Mntime, desi.Tidy.Mn, desi.Tidy.Mxtime, desi.Tidy.Mx)
   457  			fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ", desi.Tody.Hrs, desi.Tody.M, desi.Tody.Mntime, desi.Tody.Mn, desi.Tody.Mxtime, desi.Tody.Mx)
   458  			fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ", desi.Tsdy.Hrs, desi.Tsdy.M, desi.Tsdy.Mntime, desi.Tsdy.Mn, desi.Tsdy.Mxtime, desi.Tsdy.Mx)
   459  
   460  			fmt.Fprintf(fo, "%1d %.4f %1d %.4f %1d %.4f ", desi.xidy.Hrs, desi.xidy.M, desi.xidy.Mntime, desi.xidy.Mn, desi.xidy.Mxtime, desi.xidy.Mx)
   461  			fmt.Fprintf(fo, "%1d %.4f %1d %.4f %1d %.4f ", desi.xody.Hrs, desi.xody.M, desi.xody.Mntime, desi.xody.Mn, desi.xody.Mxtime, desi.xody.Mx)
   462  			fmt.Fprintf(fo, "%1d %.4f %1d %.4f %1d %.4f ", desi.xsdy.Hrs, desi.xsdy.M, desi.xsdy.Mntime, desi.xsdy.Mn, desi.xsdy.Mxtime, desi.xsdy.Mx)
   463  
   464  			fmt.Fprintf(fo, "%1d %3.1f ", desi.Qsdy.Hhr, desi.Qsdy.H)
   465  			fmt.Fprintf(fo, "%1d %3.1f ", desi.Qsdy.Chr, desi.Qsdy.C)
   466  			fmt.Fprintf(fo, "%1d %2.0f ", desi.Qsdy.Hmxtime, desi.Qsdy.Hmx)
   467  			fmt.Fprintf(fo, "%1d %2.0f ", desi.Qsdy.Cmxtime, desi.Qsdy.Cmx)
   468  
   469  			fmt.Fprintf(fo, "%1d %3.1f ", desi.Qldy.Hhr, desi.Qldy.H)
   470  			fmt.Fprintf(fo, "%1d %3.1f ", desi.Qldy.Chr, desi.Qldy.C)
   471  			fmt.Fprintf(fo, "%1d %2.0f ", desi.Qldy.Hmxtime, desi.Qldy.Hmx)
   472  			fmt.Fprintf(fo, "%1d %2.0f ", desi.Qldy.Cmxtime, desi.Qldy.Cmx)
   473  
   474  			fmt.Fprintf(fo, "%1d %3.1f ", desi.Qtdy.Hhr, desi.Qtdy.H)
   475  			fmt.Fprintf(fo, "%1d %3.1f ", desi.Qtdy.Chr, desi.Qtdy.C)
   476  			fmt.Fprintf(fo, "%1d %2.0f ", desi.Qtdy.Hmxtime, desi.Qtdy.Hmx)
   477  			fmt.Fprintf(fo, "%1d %2.0f ", desi.Qtdy.Cmxtime, desi.Qtdy.Cmx)
   478  
   479  			fmt.Fprintf(fo, "%1d %3.1f ", desi.Qlsdy.Hhr, desi.Qlsdy.H)
   480  			fmt.Fprintf(fo, "%1d %3.1f ", desi.Qlsdy.Chr, desi.Qlsdy.C)
   481  			fmt.Fprintf(fo, "%1d %2.0f ", desi.Qlsdy.Hmxtime, desi.Qlsdy.Hmx)
   482  			fmt.Fprintf(fo, "%1d %2.0f\n", desi.Qlsdy.Cmxtime, desi.Qlsdy.Cmx)
   483  		}
   484  	}
   485  }