github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/mcrefas.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  /*  refas.c */
    17  
    18  package eeslism
    19  
    20  import (
    21  	"errors"
    22  	"fmt"
    23  	"io"
    24  	"os"
    25  	"strconv"
    26  	"strings"
    27  )
    28  
    29  /*  圧縮式冷凍機
    30  
    31  機器仕様入力          */
    32  var __Refadata_hpch *HPCH
    33  
    34  func Refadata(s string, Refaca *REFACA, Rfcmp []*RFCMP) int {
    35  	var c ControlSWType
    36  	var dt float64
    37  	var id int
    38  
    39  	if !strings.ContainsAny(s, "=-") {
    40  		// イコールとハイフンが含まれていない場合の処理
    41  		Refaca.name = s
    42  		Refaca.Nmode = 0
    43  		Refaca.unlimcap = 'n'
    44  		Refaca.cool = nil
    45  		Refaca.heat = nil
    46  		Refaca.awtyp = ' '
    47  		Refaca.plf = ' '
    48  		Refaca.rfc = nil
    49  		Refaca.Ph = -999.0
    50  	} else {
    51  		if s[0] == 'a' {
    52  			Refaca.awtyp = rune(s[1])
    53  		} else if strings.Compare(s, "-U") == 0 {
    54  			Refaca.unlimcap = 'y'
    55  		} else if s[0] == 'c' {
    56  			var i int
    57  			Nrfcmp := len(Rfcmp)
    58  			for i = 0; i < Nrfcmp; i++ {
    59  				rfc := Rfcmp[i]
    60  				if strings.Compare(s[1:], rfc.cname) == 0 {
    61  					Refaca.rfc = rfc
    62  					break
    63  				}
    64  			}
    65  			if i == Nrfcmp {
    66  				id = 1
    67  			}
    68  		} else if s[0] == 'p' {
    69  			Refaca.plf = rune(s[1])
    70  		} else if s[0] == 'm' {
    71  			c = ControlSWType(s[1])
    72  			Refaca.mode[Refaca.Nmode] = c
    73  			if c == COOLING_SW {
    74  				Refaca.cool = new(HPCH)
    75  				__Refadata_hpch = Refaca.cool
    76  			} else if c == HEATING_SW {
    77  				Refaca.heat = new(HPCH)
    78  				__Refadata_hpch = Refaca.heat
    79  			}
    80  			Refaca.Nmode++
    81  		} else {
    82  			dt, _ = strconv.ParseFloat(s[1:], 64)
    83  			switch {
    84  			case strings.HasPrefix(s, "Qo"):
    85  				__Refadata_hpch.Qo = dt
    86  			case strings.HasPrefix(s, "Go"):
    87  				__Refadata_hpch.Go = dt
    88  			case strings.HasPrefix(s, "Two"):
    89  				__Refadata_hpch.Two = dt
    90  			case strings.HasPrefix(s, "eo"):
    91  				__Refadata_hpch.eo = dt
    92  			case strings.HasPrefix(s, "Qex"):
    93  				__Refadata_hpch.Qex = dt
    94  			case strings.HasPrefix(s, "Gex"):
    95  				__Refadata_hpch.Gex = dt
    96  			case strings.HasPrefix(s, "Tex"):
    97  				__Refadata_hpch.Tex = dt
    98  			case strings.HasPrefix(s, "eex"):
    99  				__Refadata_hpch.eex = dt
   100  			case s[0] == 'W':
   101  				__Refadata_hpch.Wo = dt
   102  			case strings.HasPrefix(s, "Ph"):
   103  				Refaca.Ph = dt
   104  			default:
   105  				id = 1
   106  			}
   107  		}
   108  	}
   109  	return id
   110  }
   111  
   112  /* -------------------------------------------- */
   113  
   114  /*  冷凍機/ヒ-トポンプの圧縮機特性設定   */
   115  
   116  func Refaint(Refa []*REFA, Wd *WDAT, Compnt []*COMPNT) {
   117  	var Cmp *RFCMP
   118  	var Teo, Tco, cGex, Qeo, Qco float64
   119  	var Qes, Qcs, Ws, ke, kc, kw, E float64
   120  	var i int
   121  
   122  	for _, refa := range Refa {
   123  		refa.Ta = &Wd.T
   124  
   125  		if refa.Cat.awtyp != 'a' {
   126  			fmt.Printf("Refcfi   awtyp=%c\n", refa.Cat.awtyp)
   127  		}
   128  		if refa.Cmp.Roomname != "" {
   129  			refa.Room = roomptr(refa.Cmp.Roomname, Compnt)
   130  			fmt.Printf("RefaRoom=%s\n", refa.Cmp.Roomname)
   131  		}
   132  
   133  		for m := 0; m < refa.Cat.Nmode; m++ {
   134  			if refa.Cat.mode[m] == COOLING_SW {
   135  				cGex = Ca * refa.Cat.cool.Gex
   136  				E = (1.0 - refa.Cat.cool.eo) / refa.Cat.cool.eo
   137  				Qeo = refa.Cat.cool.Qo
   138  				Qco = refa.Cat.cool.Qex
   139  				Teo = Qeo*E/(Cw*refa.Cat.cool.Go) + refa.Cat.cool.Two
   140  				Tco = Qco/(refa.Cat.cool.eex*cGex) + refa.Cat.cool.Tex
   141  			} else if refa.Cat.mode[m] == HEATING_SW {
   142  				cGex = Ca * refa.Cat.heat.Gex
   143  				E = (1.0 - refa.Cat.heat.eo) / refa.Cat.heat.eo
   144  				Qeo = refa.Cat.heat.Qex
   145  				Qco = refa.Cat.heat.Qo
   146  				Tco = Qco*E/(Cw*refa.Cat.heat.Go) + refa.Cat.heat.Two
   147  				Teo = Qeo/(refa.Cat.heat.eex*cGex) + refa.Cat.heat.Tex
   148  			}
   149  
   150  			Cmp = refa.Cat.rfc
   151  			Qes = Cmp.e[0] + Cmp.e[1]*Teo + Cmp.e[2]*Tco + Cmp.e[3]*Teo*Tco
   152  			Qcs = Cmp.d[0] + Cmp.d[1]*Teo + Cmp.d[2]*Tco + Cmp.d[3]*Teo*Tco
   153  			Ws = Cmp.w[0] + Cmp.w[1]*Teo + Cmp.w[2]*Tco + Cmp.w[3]*Teo*Tco
   154  			ke = Qeo / Qes
   155  			kc = Qco / Qcs
   156  			if refa.Cat.mode[m] == COOLING_SW {
   157  				kw = refa.Cat.cool.Wo / Ws
   158  			} else if refa.Cat.mode[m] == HEATING_SW {
   159  				kw = refa.Cat.heat.Wo / Ws
   160  			}
   161  
   162  			if refa.Cat.mode[m] == COOLING_SW {
   163  				for i = 0; i < 4; i++ {
   164  					refa.c_e[i] = ke * Cmp.e[i]
   165  					refa.c_d[i] = kc * Cmp.d[i]
   166  					refa.c_w[i] = kw * Cmp.w[i]
   167  				}
   168  			} else if refa.Cat.mode[m] == HEATING_SW {
   169  				for i = 0; i < 4; i++ {
   170  					refa.h_e[i] = ke * Cmp.e[i]
   171  					refa.h_d[i] = kc * Cmp.d[i]
   172  					refa.h_w[i] = kw * Cmp.w[i]
   173  				}
   174  			}
   175  		}
   176  		if refa.Cat.Nmode == 1 {
   177  			refa.Chmode = refa.Cat.mode[0]
   178  		}
   179  	}
   180  }
   181  
   182  /* -------------------------------------------- */
   183  
   184  /*  冷凍機/ヒ-トポンプのシステム方程式の係数  */
   185  
   186  //
   187  //             +------+
   188  // [IN 1] ---> | REFA | --> [OUT 1]
   189  //             +------+
   190  //
   191  func Refacfv(Refa []*REFA) {
   192  	for _, refa := range Refa {
   193  		if refa.Cmp.Control != OFF_SW {
   194  			Eo1 := refa.Cmp.Elouts[0]
   195  
   196  			cG := Spcheat(Eo1.Fluid) * Eo1.G
   197  			refa.cG = cG
   198  			Eo1.Coeffo = cG
   199  
   200  			if Eo1.Control != OFF_SW {
   201  				if Eo1.Sysld == 'y' {
   202  					Eo1.Co = 0.0
   203  					Eo1.Coeffin[0] = -cG
   204  				} else {
   205  					var err int
   206  					refacoeff(refa, &err)
   207  					if err == 0 {
   208  						Eo1.Co = refa.Do
   209  						Eo1.Coeffin[0] = refa.D1 - cG
   210  					} else {
   211  						s := fmt.Sprintf("xxxxx refacoeff xxx stop xx  %s chmode=%c  monitor=%s",
   212  							refa.Name, refa.Chmode, refa.Cmp.Elouts[0].Emonitr.Cmp.Name)
   213  						Eprint("<Refacfv>", s)
   214  						os.Exit(EXIT_REFA)
   215  					}
   216  				}
   217  			}
   218  		}
   219  	}
   220  }
   221  
   222  /* ------------------------------------------------------------- */
   223  
   224  /*    冷凍機/ヒ-トポンプの能力特性一次式の係数  */
   225  
   226  func refacoeff(Refa *REFA, err *int) {
   227  	var E, EGex, Px float64
   228  	*err = 0
   229  
   230  	if Refa.Chmode == COOLING_SW {
   231  		if Refa.Cat.cool != nil {
   232  			EGex = Refa.Cat.cool.eex * Ca * Refa.Cat.cool.Gex
   233  			Compca(&Refa.c_e, &Refa.c_d, EGex, Refa.Cat.rfc.Teo, *Refa.Ta, &Refa.Ho, &Refa.He)
   234  			E = Refa.cG * Refa.Cat.cool.eo
   235  		} else {
   236  			*err = 1
   237  		}
   238  	} else if Refa.Chmode == HEATING_SW {
   239  		if Refa.Cat.heat != nil {
   240  			EGex = Refa.Cat.heat.eex * Ca * Refa.Cat.heat.Gex
   241  			Compha(&Refa.h_e, &Refa.h_d, EGex, Refa.Cat.rfc.Tco, *Refa.Ta, &Refa.Ho, &Refa.He)
   242  			E = Refa.cG * Refa.Cat.heat.eo
   243  		} else {
   244  			*err = 1
   245  		}
   246  	}
   247  
   248  	if *err == 0 {
   249  		Px = E / (E + Refa.He)
   250  		Refa.Do = Refa.Ho * Px
   251  		Refa.D1 = Refa.He * Px
   252  	} else {
   253  		Refa.Do = 0.0
   254  		Refa.D1 = 0.0
   255  	}
   256  }
   257  
   258  /* ------------------------------------------------------------- */
   259  
   260  // 冷却熱量/加熱量、エネルギーの計算
   261  func Refaene(Refa []*REFA, LDreset *int) {
   262  	var err, reset int
   263  	var Emax float64
   264  	var Eo *ELOUT
   265  
   266  	for i, refa := range Refa {
   267  		refa.Tin = refa.Cmp.Elins[0].Sysvin
   268  		Eo = refa.Cmp.Elouts[0]
   269  		refa.E = 0.0
   270  
   271  		if Eo.Control != OFF_SW {
   272  			refa.Ph = refa.Cat.Ph
   273  			refa.Q = refa.cG * (Eo.Sysv - refa.Tin)
   274  
   275  			if Eo.Sysld == 'n' {
   276  				refa.Qmax = refa.Q
   277  
   278  				if refa.Cat.Nmode > 0 {
   279  					refa.E = Refpow(refa, refa.Q) / refa.Cat.rfc.Meff
   280  				}
   281  
   282  			} else {
   283  				reset = chswreset(refa.Q, refa.Chmode, Eo)
   284  
   285  				if reset != 0 {
   286  					(*LDreset)++
   287  					refa.Cmp.Control = OFF_SW
   288  				} else {
   289  					if refa.Cat.Nmode > 0 {
   290  						refacoeff(refa, &err)
   291  
   292  						if err == 0 {
   293  							refa.Qmax = refa.Do - refa.D1*refa.Tin
   294  							Emax = Refpow(refa, refa.Qmax) / refa.Cat.rfc.Meff
   295  							refa.E = (refa.Q / refa.Qmax) * Emax
   296  
   297  							if refa.Cat.unlimcap == 'n' {
   298  								reset = maxcapreset(refa.Q, refa.Qmax, refa.Chmode, Eo)
   299  							}
   300  							if reset != 0 {
   301  								Refacfv(Refa[i : i+1])
   302  								(*LDreset)++
   303  							}
   304  						}
   305  					} else {
   306  						refa.Qmax = refa.Q
   307  					}
   308  
   309  				}
   310  			}
   311  		} else {
   312  			refa.Q = 0.0
   313  			refa.Ph = 0.0
   314  		}
   315  	}
   316  }
   317  
   318  func Refaene2(Refa []*REFA) {
   319  	for _, refa := range Refa {
   320  		if refa.Room != nil {
   321  			refa.Room.Qeqp += (refa.Q * refa.Cmp.Eqpeff)
   322  		}
   323  	}
   324  }
   325  
   326  /* ------------------------------------------------------------- */
   327  
   328  /* 負荷計算指定時の設定値のポインター */
   329  
   330  func refaldptr(load *ControlSWType, key []string, Refa *REFA) (VPTR, error) {
   331  	var err error
   332  	var vptr VPTR
   333  
   334  	if key[1] == "Tout" {
   335  		vptr.Ptr = &Refa.Toset
   336  		vptr.Type = VAL_CTYPE
   337  		Refa.Load = load
   338  	} else {
   339  		err = errors.New("Tout expected")
   340  	}
   341  	return vptr, err
   342  }
   343  
   344  /* ------------------------------------------------------------- */
   345  
   346  /* 冷暖運転切換のポインター */
   347  
   348  func refaswptr(key []string, Refa *REFA) (VPTR, error) {
   349  	if key[1] == "chmode" {
   350  		return VPTR{
   351  			Ptr:  &Refa.Chmode,
   352  			Type: SW_CTYPE,
   353  		}, nil
   354  	}
   355  
   356  	return VPTR{}, errors.New("refaswptr error")
   357  }
   358  
   359  /* --------------------------- */
   360  
   361  /* 負荷計算指定時のスケジュール設定 */
   362  
   363  func refaldschd(Refa *REFA) {
   364  	Eo := Refa.Cmp.Elouts[0]
   365  
   366  	if Refa.Load != nil {
   367  		if Eo.Control != OFF_SW {
   368  			if Refa.Toset > TEMPLIMIT {
   369  				Eo.Control = LOAD_SW
   370  				Eo.Sysv = Refa.Toset
   371  			} else {
   372  				Eo.Control = OFF_SW
   373  			}
   374  		}
   375  	}
   376  }
   377  
   378  /* --------------------------- */
   379  
   380  func refaprint(fo io.Writer, id int, Refa []*REFA) {
   381  	switch id {
   382  	case 0:
   383  		if len(Refa) > 0 {
   384  			fmt.Fprintf(fo, "%s %d\n", REFACOMP_TYPE, len(Refa))
   385  		}
   386  		for _, refa := range Refa {
   387  			fmt.Fprintf(fo, " %s 1 7\n", refa.Name)
   388  		}
   389  	case 1:
   390  		for _, refa := range Refa {
   391  			fmt.Fprintf(fo, "%s_c c c %s_G m f %s_Ti t f %s_To t f ",
   392  				refa.Name, refa.Name, refa.Name, refa.Name)
   393  			fmt.Fprintf(fo, "%s_Q q f  %s_E e f %s_P e f\n",
   394  				refa.Name, refa.Name, refa.Name)
   395  		}
   396  	default:
   397  		for _, refa := range Refa {
   398  			fmt.Fprintf(fo, "%c %6.4g %4.1f %4.1f %3.0f %3.0f %2.0f\n",
   399  				refa.Cmp.Elouts[0].Control, refa.Cmp.Elouts[0].G, refa.Tin,
   400  				refa.Cmp.Elouts[0].Sysv, refa.Q, refa.E, refa.Ph)
   401  		}
   402  	}
   403  }
   404  
   405  /* --------------------------- */
   406  
   407  /* 日積算値に関する処理 */
   408  
   409  func refadyint(Refa []*REFA) {
   410  	for _, refa := range Refa {
   411  		svdyint(&refa.Tidy)
   412  		qdyint(&refa.Qdy)
   413  		edyint(&refa.Edy)
   414  		edyint(&refa.Phdy)
   415  	}
   416  }
   417  
   418  func refamonint(Refa []*REFA) {
   419  	for _, refa := range Refa {
   420  		svdyint(&refa.mTidy)
   421  		qdyint(&refa.mQdy)
   422  		edyint(&refa.mEdy)
   423  		edyint(&refa.mPhdy)
   424  	}
   425  }
   426  
   427  func refaday(Mon int, Day int, ttmm int, Refa []*REFA, Nday int, SimDayend int) {
   428  	Mo := Mon - 1
   429  	tt := ConvertHour(ttmm)
   430  	for _, refa := range Refa {
   431  
   432  		// 日集計
   433  		svdaysum(int64(ttmm), refa.Cmp.Control, refa.Tin, &refa.Tidy)
   434  		qdaysum(int64(ttmm), refa.Cmp.Control, refa.Q, &refa.Qdy)
   435  		edaysum(ttmm, refa.Cmp.Control, refa.E, &refa.Edy)
   436  		edaysum(ttmm, refa.Cmp.Control, refa.Ph, &refa.Phdy)
   437  
   438  		// 月集計
   439  		svmonsum(Mon, Day, ttmm, refa.Cmp.Control, refa.Tin, &refa.mTidy, Nday, SimDayend)
   440  		qmonsum(Mon, Day, ttmm, refa.Cmp.Control, refa.Q, &refa.mQdy, Nday, SimDayend)
   441  		emonsum(Mon, Day, ttmm, refa.Cmp.Control, refa.E, &refa.mEdy, Nday, SimDayend)
   442  		emonsum(Mon, Day, ttmm, refa.Cmp.Control, refa.Ph, &refa.mPhdy, Nday, SimDayend)
   443  
   444  		// 月・時刻のクロス集計
   445  		emtsum(Mon, Day, ttmm, refa.Cmp.Control, refa.E, &refa.mtEdy[Mo][tt])
   446  		emtsum(Mon, Day, ttmm, refa.Cmp.Control, refa.E, &refa.mtPhdy[Mo][tt])
   447  	}
   448  }
   449  
   450  func refadyprt(fo io.Writer, id int, Refa []*REFA) {
   451  	switch id {
   452  	case 0:
   453  		if len(Refa) > 0 {
   454  			fmt.Fprintf(fo, "%s %d\n", REFACOMP_TYPE, len(Refa))
   455  		}
   456  		for _, refa := range Refa {
   457  			fmt.Fprintf(fo, " %s 1 22\n", refa.Name)
   458  		}
   459  	case 1:
   460  		for _, refa := range Refa {
   461  			fmt.Fprintf(fo, "%s_Ht H d %s_T T f ", refa.Name, refa.Name)
   462  			fmt.Fprintf(fo, "%s_ttn h d %s_Tn t f %s_ttm h d %s_Tm t f\n",
   463  				refa.Name, refa.Name, refa.Name, refa.Name)
   464  			fmt.Fprintf(fo, "%s_Hh H d %s_Qh Q f %s_Hc H d %s_Qc Q f\n",
   465  				refa.Name, refa.Name, refa.Name, refa.Name)
   466  			fmt.Fprintf(fo, "%s_th h d %s_qh q f %s_tc h d %s_qc q f\n",
   467  				refa.Name, refa.Name, refa.Name, refa.Name)
   468  			fmt.Fprintf(fo, "%s_He H d %s_E E f %s_te h d %s_Em e f\n",
   469  				refa.Name, refa.Name, refa.Name, refa.Name)
   470  			fmt.Fprintf(fo, "%s_Hp H d %s_P E f %s_tp h d %s_Pm e f\n\n",
   471  				refa.Name, refa.Name, refa.Name, refa.Name)
   472  		}
   473  	default:
   474  		for _, refa := range Refa {
   475  			fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ",
   476  				refa.Tidy.Hrs, refa.Tidy.M,
   477  				refa.Tidy.Mntime, refa.Tidy.Mn,
   478  				refa.Tidy.Mxtime, refa.Tidy.Mx)
   479  
   480  			fmt.Fprintf(fo, "%1d %3.1f ", refa.Qdy.Hhr, refa.Qdy.H)
   481  			fmt.Fprintf(fo, "%1d %3.1f ", refa.Qdy.Chr, refa.Qdy.C)
   482  			fmt.Fprintf(fo, "%1d %2.0f ", refa.Qdy.Hmxtime, refa.Qdy.Hmx)
   483  			fmt.Fprintf(fo, "%1d %2.0f ", refa.Qdy.Cmxtime, refa.Qdy.Cmx)
   484  
   485  			fmt.Fprintf(fo, "%1d %3.1f ", refa.Edy.Hrs, refa.Edy.D)
   486  			fmt.Fprintf(fo, "%1d %2.0f ", refa.Edy.Mxtime, refa.Edy.Mx)
   487  
   488  			fmt.Fprintf(fo, "%1d %3.1f ", refa.Phdy.Hrs, refa.Phdy.D)
   489  			fmt.Fprintf(fo, "%1d %2.0f\n", refa.Phdy.Mxtime, refa.Phdy.Mx)
   490  		}
   491  	}
   492  }
   493  
   494  func refamonprt(fo io.Writer, id int, Refa []*REFA) {
   495  	switch id {
   496  	case 0:
   497  		if len(Refa) > 0 {
   498  			fmt.Fprintf(fo, "%s %d\n", REFACOMP_TYPE, len(Refa))
   499  		}
   500  		for _, refa := range Refa {
   501  			fmt.Fprintf(fo, " %s 1 22\n", refa.Name)
   502  		}
   503  	case 1:
   504  		for _, refa := range Refa {
   505  			fmt.Fprintf(fo, "%s_Ht H d %s_T T f ", refa.Name, refa.Name)
   506  			fmt.Fprintf(fo, "%s_ttn h d %s_Tn t f %s_ttm h d %s_Tm t f\n",
   507  				refa.Name, refa.Name, refa.Name, refa.Name)
   508  			fmt.Fprintf(fo, "%s_Hh H d %s_Qh Q f %s_Hc H d %s_Qc Q f\n",
   509  				refa.Name, refa.Name, refa.Name, refa.Name)
   510  			fmt.Fprintf(fo, "%s_th h d %s_qh q f %s_tc h d %s_qc q f\n",
   511  				refa.Name, refa.Name, refa.Name, refa.Name)
   512  			fmt.Fprintf(fo, "%s_He H d %s_E E f %s_te h d %s_Em e f\n",
   513  				refa.Name, refa.Name, refa.Name, refa.Name)
   514  			fmt.Fprintf(fo, "%s_Hp H d %s_P E f %s_tp h d %s_Pm e f\n\n",
   515  				refa.Name, refa.Name, refa.Name, refa.Name)
   516  		}
   517  	default:
   518  		for _, refa := range Refa {
   519  			fmt.Fprintf(fo, "%1d %3.1f %1d %3.1f %1d %3.1f ",
   520  				refa.mTidy.Hrs, refa.mTidy.M,
   521  				refa.mTidy.Mntime, refa.mTidy.Mn,
   522  				refa.mTidy.Mxtime, refa.mTidy.Mx)
   523  
   524  			fmt.Fprintf(fo, "%1d %3.1f ", refa.mQdy.Hhr, refa.mQdy.H)
   525  			fmt.Fprintf(fo, "%1d %3.1f ", refa.mQdy.Chr, refa.mQdy.C)
   526  			fmt.Fprintf(fo, "%1d %2.0f ", refa.mQdy.Hmxtime, refa.mQdy.Hmx)
   527  			fmt.Fprintf(fo, "%1d %2.0f ", refa.mQdy.Cmxtime, refa.mQdy.Cmx)
   528  
   529  			fmt.Fprintf(fo, "%1d %3.1f ", refa.mEdy.Hrs, refa.mEdy.D)
   530  			fmt.Fprintf(fo, "%1d %2.0f ", refa.mEdy.Mxtime, refa.mEdy.Mx)
   531  
   532  			fmt.Fprintf(fo, "%1d %3.1f ", refa.mPhdy.Hrs, refa.mPhdy.D)
   533  			fmt.Fprintf(fo, "%1d %2.0f\n", refa.mPhdy.Mxtime, refa.mPhdy.Mx)
   534  		}
   535  	}
   536  }
   537  
   538  func refamtprt(fo io.Writer, id int, Refa []*REFA, Mo int, tt int) {
   539  	switch id {
   540  	case 0:
   541  		if len(Refa) > 0 {
   542  			fmt.Fprintf(fo, "%s %d\n", REFACOMP_TYPE, len(Refa))
   543  		}
   544  		for _, refa := range Refa {
   545  			fmt.Fprintf(fo, " %s 1 2\n", refa.Name)
   546  		}
   547  	case 1:
   548  		for _, refa := range Refa {
   549  			fmt.Fprintf(fo, "%s_E E f %s_Ph E f \n", refa.Name, refa.Name)
   550  		}
   551  	default:
   552  		for _, refa := range Refa {
   553  			fmt.Fprintf(fo, " %.2f %.2f\n", refa.mtEdy[Mo-1][tt-1].D*Cff_kWh, refa.mtPhdy[Mo-1][tt-1].D*Cff_kWh)
   554  		}
   555  	}
   556  }