github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/blhelm.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  /* helm.c */
    17  
    18  package eeslism
    19  
    20  import (
    21  	"fmt"
    22  	"io"
    23  )
    24  
    25  /* 要素別熱損失・熱取得(記憶域確保) */
    26  
    27  func Helminit(errkey string, helmkey rune, _Room []*ROOM, Qetotal *QETOTAL) {
    28  	var Nmax, k int
    29  
    30  	if helmkey != 'y' {
    31  		for i := range _Room {
    32  			Room := _Room[i]
    33  			Room.rmqe = nil
    34  		}
    35  		return
    36  	}
    37  
    38  	for i := range _Room {
    39  		Room := _Room[i]
    40  
    41  		Room.rmqe = &RMQELM{}
    42  
    43  		if Room.rmqe != nil {
    44  			Rq := Room.rmqe
    45  			Rq.rmsb = nil
    46  			Rq.WSCwk = nil
    47  		}
    48  
    49  		N := Room.N
    50  		if N > 0 {
    51  			Room.rmqe.rmsb = make([]*RMSB, N)
    52  		}
    53  
    54  		if Room.rmqe.rmsb != nil {
    55  			for k = 0; k < N; k++ {
    56  				Rs := Room.rmqe.rmsb[k]
    57  				Rs.Told = nil
    58  				Rs.Tw = nil
    59  			}
    60  		}
    61  
    62  		for j := 0; j < Room.N; j++ {
    63  			Sd := Room.rsrf[j]
    64  			Rs := Room.rmqe.rmsb[j]
    65  
    66  			if Sd.mw != nil {
    67  				N := Sd.mw.M
    68  				if N > 0 {
    69  					Rs.Tw = make([]*BHELM, N)
    70  					Rs.Told = make([]*BHELM, N)
    71  				}
    72  			} else {
    73  				Rs.Tw = nil
    74  				Rs.Told = nil
    75  			}
    76  
    77  			switch Sd.ble {
    78  			case BLE_ExternalWall, BLE_Roof, BLE_Floor, BLE_Window:
    79  				if Sd.typ != RMSRFType_E && Sd.typ != RMSRFType_e {
    80  					Rs.Type = RMSBType_E
    81  				} else {
    82  					Rs.Type = RMSBType_G
    83  				}
    84  				break
    85  			case BLE_InnerWall, BLE_InnerFloor, BLE_Ceil, BLE_d:
    86  				Rs.Type = RMSBType_i
    87  				break
    88  			}
    89  		}
    90  		if Room.N > Nmax {
    91  			Nmax = Room.N
    92  		}
    93  	}
    94  
    95  	for i := range _Room {
    96  		Room := _Room[i]
    97  		if i == 0 {
    98  			if Nmax > 0 {
    99  				Room.rmqe.WSCwk = make([]*BHELM, Nmax)
   100  
   101  				Bh := Room.rmqe.WSCwk[0]
   102  				Bh.trs = 0.0
   103  				Bh.so = 0.0
   104  				Bh.sg = 0.0
   105  				Bh.rn = 0.0
   106  				Bh.in = 0.0
   107  				Bh.pnl = 0.0
   108  			}
   109  		} else {
   110  			Room.rmqe.WSCwk = _Room[0].rmqe.WSCwk
   111  		}
   112  	}
   113  	Qetotal.Name = "Qetotal"
   114  }
   115  
   116  /* ----------------------------------------------------- */
   117  
   118  // 要素別熱損失・熱取得(計算)
   119  // 入力値:
   120  //  外気温度 Ta [C]
   121  //  絶対湿度 xa [kg/kg]
   122  func Helmroom(Room []*ROOM, Qrm []*QRM, Qetotal *QETOTAL, Ta, xa float64) {
   123  	qelmclear(&Qetotal.Qelm)
   124  
   125  	for i := range Room {
   126  		Rm := Room[i]
   127  		Qr := Qrm[i]
   128  		qe := &Rm.rmqe.qelm
   129  
   130  		helmrmsrt(Rm, Ta)
   131  		helmq(Room, Ta, xa)
   132  
   133  		qe.slo = Qr.Solo
   134  		qe.slw = Qr.Solw
   135  		qe.asl = Qr.Asl
   136  		qe.tsol = Qr.Tsol
   137  		qe.hins = Qr.Hgins
   138  
   139  		qelmsum(qe, &Qetotal.Qelm)
   140  	}
   141  
   142  	for i := range Room {
   143  		Rm := Room[i]
   144  		helmwall(Rm, Ta)
   145  	}
   146  }
   147  
   148  /* ----------------------------------------------------- */
   149  
   150  /* 要素別熱損失・熱取得(時刻別出力) */
   151  
   152  var __Helmprint_id int = 0
   153  
   154  func Helmprint(fo io.Writer, mrk string, Simc *SIMCONTL, mon, day int, time float64,
   155  	Room []*ROOM, Qetotal *QETOTAL) {
   156  	var j int
   157  
   158  	if __Helmprint_id == 0 {
   159  		ttlprint(fo, mrk, Simc)
   160  
   161  		for j = 0; j < 2; j++ {
   162  			if j == 0 {
   163  				fmt.Fprintf(fo, "-cat\n")
   164  			}
   165  			helmrmprint(fo, __Helmprint_id, Room, Qetotal)
   166  			if j == 0 {
   167  				fmt.Fprintf(fo, "*\n#\n")
   168  			}
   169  			__Helmprint_id++
   170  		}
   171  	}
   172  
   173  	fmt.Fprintf(fo, "%02d %02d %5.2f\n", mon, day, time)
   174  	helmrmprint(fo, __Helmprint_id, Room, Qetotal)
   175  }
   176  
   177  /* ----------------------------------------------------- */
   178  
   179  func helmrmprint(fo io.Writer, id int, _Room []*ROOM, Qetotal *QETOTAL) {
   180  	var q *BHELM
   181  	var qh *QHELM
   182  	var name string
   183  
   184  	Nroom := len(_Room)
   185  
   186  	switch id {
   187  	case 0:
   188  		if Nroom > 0 {
   189  			fmt.Fprintf(fo, "%s %d\n", ROOM_TYPE, Nroom+1)
   190  		}
   191  
   192  		for i := 0; i < Nroom; i++ {
   193  			Room := _Room[i]
   194  			if Room.rmqe != nil {
   195  				fmt.Fprintf(fo, "%s 1 %d\n", Room.Name, 29)
   196  			}
   197  		}
   198  		fmt.Fprintf(fo, "%s 1 %d\n", Qetotal.Name, 29)
   199  		break
   200  
   201  	case 1:
   202  		for i := 0; i < Nroom+1; i++ {
   203  			if i < Nroom {
   204  				name = _Room[i].Name
   205  			} else {
   206  				name = Qetotal.Name
   207  			}
   208  
   209  			fmt.Fprintf(fo, "%s_qldh q f %s_qldc q f ", name, name)
   210  			fmt.Fprintf(fo, "%s_slo q f %s_slw q f %s_asl q f %s_tsol q f %s_hins q f\n",
   211  				name, name, name, name, name)
   212  			fmt.Fprintf(fo, "%s_so q f %s_sw q f %s_rn q f %s_in q f %s_pnl q f\n",
   213  				name, name, name, name, name)
   214  			fmt.Fprintf(fo, "%s_trs q f %s_qew q f %s_qwn q f %s_qgd q f %s_qnx q f ",
   215  				name, name, name, name, name)
   216  			fmt.Fprintf(fo, "%s_qi q f %s_qc q f %s_qf q f\n",
   217  				name, name, name)
   218  			fmt.Fprintf(fo, "%s_vo q f %s_vr q f %s_sto q f\n", name, name, name)
   219  			fmt.Fprintf(fo, "%s_qldhl q f %s_qldcl q f %s_hinl q f\n", name, name, name)
   220  			fmt.Fprintf(fo, "%s_vol q f %s_vrl q f %s_stol q f\n", name, name, name)
   221  		}
   222  		break
   223  
   224  	default:
   225  		for i := 0; i < Nroom+1; i++ {
   226  			if i < Nroom {
   227  				Room := _Room[i]
   228  				q = &(Room.rmqe.qelm.qe)
   229  				qh = &Room.rmqe.qelm
   230  
   231  				fmt.Fprintf(fo, "%3.0f %3.0f ", qh.loadh, qh.loadc)
   232  				fmt.Fprintf(fo, "%3.0f %3.0f %3.0f %3.0f %3.0f ",
   233  					qh.slo, qh.slw, qh.asl, qh.tsol, qh.hins)
   234  
   235  				fmt.Fprintf(fo, "%3.0f %3.0f %3.0f %3.0f %3.0f ",
   236  					q.so, q.sg, q.rn, q.in, q.pnl)
   237  				fmt.Fprintf(fo, "%3.0f %3.0f %3.0f %3.0f %3.0f ",
   238  					q.trs, qh.ew, qh.wn, qh.gd, qh.nx)
   239  				fmt.Fprintf(fo, "%3.0f %3.0f %3.0f %3.0f %3.0f %3.0f ",
   240  					qh.i, qh.c, qh.f, qh.vo, qh.vr, qh.sto)
   241  				fmt.Fprintf(fo, "%3.0f %3.0f %3.0f %3.0f %3.0f %3.0f\n",
   242  					qh.loadhl, qh.loadcl, qh.hinl, qh.vol, qh.vrl, qh.stol)
   243  			} else {
   244  				q = &Qetotal.Qelm.qe
   245  				qh = &Qetotal.Qelm
   246  				fmt.Fprintf(fo, "%3.0f %3.0f ", qh.loadh, qh.loadc)
   247  				fmt.Fprintf(fo, "%3.0f %3.0f %3.0f %3.0f %3.0f ",
   248  					qh.slo, qh.slw, qh.asl, qh.tsol, qh.hins)
   249  
   250  				fmt.Fprintf(fo, "%3.0f %3.0f %3.0f %3.0f %3.0f ",
   251  					q.so, q.sg, q.rn, q.in, q.pnl)
   252  				fmt.Fprintf(fo, "%3.0f %3.0f %3.0f %3.0f %3.0f ",
   253  					q.trs, qh.ew, qh.wn, qh.gd, qh.nx)
   254  				fmt.Fprintf(fo, "%3.0f %3.0f %3.0f %3.0f %3.0f %3.0f ",
   255  					qh.i, qh.c, qh.f, qh.vo, qh.vr, qh.sto)
   256  				fmt.Fprintf(fo, "%3.0f %3.0f %3.0f %3.0f %3.0f %3.0f\n",
   257  					qh.loadhl, qh.loadcl, qh.hinl, qh.vol, qh.vrl, qh.stol)
   258  			}
   259  		}
   260  		break
   261  	}
   262  }
   263  
   264  /* ----------------------------------------------------- */
   265  
   266  /* 要素別熱損失・熱取得(時刻別出力) */
   267  
   268  var __Helmsurfprint_id int = 0
   269  
   270  func Helmsurfprint(fo io.Writer, mrk string, Simc *SIMCONTL, mon, day int, time float64, Room []*ROOM) {
   271  	var j int
   272  
   273  	if __Helmsurfprint_id == 0 {
   274  		ttlprint(fo, mrk, Simc)
   275  
   276  		for j = 0; j < 2; j++ {
   277  			if j == 0 {
   278  				fmt.Fprintf(fo, "-cat\n")
   279  			}
   280  			helmsfprint(fo, __Helmsurfprint_id, Room)
   281  			if j == 0 {
   282  				fmt.Fprintf(fo, "*\n#\n")
   283  			}
   284  			__Helmsurfprint_id++
   285  		}
   286  	}
   287  
   288  	fmt.Fprintf(fo, "%02d %02d %5.2f\n", mon, day, time)
   289  	helmsfprint(fo, __Helmsurfprint_id, Room)
   290  }
   291  
   292  /* ----------------------------------------------------- */
   293  
   294  func helmsfprint(fo io.Writer, id int, _Room []*ROOM) {
   295  	switch id {
   296  	case 0:
   297  		if len(_Room) > 0 {
   298  			fmt.Fprintf(fo, "%s %d\n", ROOM_TYPE, len(_Room))
   299  		}
   300  
   301  		for i := range _Room {
   302  			Room := _Room[i]
   303  			Nsf := 0
   304  			for j := 0; j < Room.N; j++ {
   305  				Sd := Room.rsrf[j]
   306  				if Sd.sfepri {
   307  					Nsf++
   308  				}
   309  			}
   310  			fmt.Fprintf(fo, "%s 1 %d\n", Room.Name, 6*Nsf)
   311  
   312  		}
   313  		break
   314  
   315  	case 1:
   316  		for i := range _Room {
   317  			Room := _Room[i]
   318  			for j := 0; j < Room.N; j++ {
   319  				Sd := Room.rsrf[j]
   320  				if Sd.sfepri {
   321  					var s string
   322  					if len(Sd.Name) == 0 {
   323  						s = fmt.Sprintf(s, "%s-%d-%c", Room.Name, j, Sd.ble)
   324  					} else {
   325  						s = fmt.Sprintf(s, "%s-%s", Room.Name, Sd.Name)
   326  					}
   327  
   328  					fmt.Fprintf(fo, "%s_trs t f %s_so f %s_sg t f ", s, s, s)
   329  					fmt.Fprintf(fo, "%s_rn t f %s_in t f %s_pnl t f\n", s, s, s)
   330  				}
   331  			}
   332  		}
   333  		break
   334  
   335  	default:
   336  		for i := range _Room {
   337  			Room := _Room[i]
   338  			for j := 0; j < Room.N; j++ {
   339  				Sd := Room.rsrf[j]
   340  				rmsb := Room.rmqe.rmsb[j]
   341  				if Sd.sfepri {
   342  					Ts := &rmsb.Ts
   343  					fmt.Fprintf(fo, "%5.2f %5.2f %5.2f ", Ts.trs, Ts.so, Ts.sg)
   344  					fmt.Fprintf(fo, "%5.2f %5.2f %5.2f\n", Ts.rn, Ts.in, Ts.pnl)
   345  				}
   346  			}
   347  
   348  		}
   349  		break
   350  	}
   351  }
   352  
   353  /* ----------------------------------------------------- */
   354  
   355  /* 要素別熱損失・熱取得(日積算値) */
   356  
   357  var __Helmdy_oldday int = -1
   358  
   359  func Helmdy(day int, Room []*ROOM, Qetotal *QETOTAL) {
   360  	if day != __Helmdy_oldday {
   361  		helmdyint(Room, Qetotal)
   362  		__Helmdy_oldday = day
   363  	}
   364  
   365  	for i := range Room {
   366  		rmq := Room[i].rmqe
   367  
   368  		if rmq != nil {
   369  			qelmsum(&rmq.qelm, &rmq.qelmdy)
   370  		}
   371  	}
   372  
   373  	qelmsum(&Qetotal.Qelm, &Qetotal.Qelmdy)
   374  }
   375  
   376  /* ----------------------------------------------------- */
   377  
   378  func helmdyint(Room []*ROOM, Qetotal *QETOTAL) {
   379  	for i := range Room {
   380  		if Room[i].rmqe != nil {
   381  			qelmclear(&Room[i].rmqe.qelmdy)
   382  		}
   383  	}
   384  
   385  	qelmclear(&Qetotal.Qelmdy)
   386  }
   387  
   388  /* ----------------------------------------------------- */
   389  
   390  /* 要素別熱損失・熱取得(日積算値出力) */
   391  
   392  var __Helmdyprint_id int
   393  
   394  func Helmdyprint(fo io.Writer, mrk string, Simc *SIMCONTL, mon, day int, Room []*ROOM, Qetotal *QETOTAL) {
   395  	var j int
   396  
   397  	if __Helmdyprint_id == 0 {
   398  		ttldyprint(fo, mrk, Simc)
   399  
   400  		for j = 0; j < 2; j++ {
   401  			if j == 0 {
   402  				fmt.Fprintf(fo, "-cat\n")
   403  			}
   404  			helmrmdyprint(fo, __Helmdyprint_id, Room, Qetotal)
   405  			if j == 0 {
   406  				fmt.Fprintf(fo, "*\n#\n")
   407  			}
   408  			__Helmdyprint_id++
   409  		}
   410  	}
   411  
   412  	fmt.Fprintf(fo, "%02d %02d\n", mon, day)
   413  	helmrmdyprint(fo, __Helmdyprint_id, Room, Qetotal)
   414  }
   415  
   416  /* ----------------------------------------------------- */
   417  
   418  func helmrmdyprint(fo io.Writer, id int, _Room []*ROOM, Qetotal *QETOTAL) {
   419  	var i int
   420  	var q *BHELM
   421  	var qh *QHELM
   422  
   423  	Nroom := len(_Room)
   424  
   425  	switch id {
   426  	case 0:
   427  		if Nroom > 0 {
   428  			fmt.Fprintf(fo, "%s %d\n", ROOM_TYPE, Nroom+1)
   429  		}
   430  
   431  		for i = 0; i < Nroom; i++ {
   432  			Room := _Room[i]
   433  			if Room.rmqe != nil {
   434  				fmt.Fprintf(fo, "%s 1 %d\n", Room.Name, 29)
   435  			}
   436  		}
   437  		fmt.Fprintf(fo, "%s 1 %d\n", Qetotal.Name, 29)
   438  		break
   439  
   440  	case 1:
   441  		for i = 0; i < Nroom+1; i++ {
   442  			var name string
   443  			if i < Nroom {
   444  				Room := _Room[i]
   445  				name = Room.Name
   446  			} else {
   447  				name = Qetotal.Name
   448  			}
   449  
   450  			fmt.Fprintf(fo, "%s_qldh Q f %s_qldc Q f ", name, name)
   451  			fmt.Fprintf(fo, "%s_slo Q f %s_slw Q f %s_asl Q f %s_tsol Q f %s_hins Q f\n",
   452  				name, name, name, name, name)
   453  			fmt.Fprintf(fo, "%s_so Q f %s_sw Q f %s_rn Q f %s_in Q f %s_pnl Q f\n",
   454  				name, name, name, name, name)
   455  			fmt.Fprintf(fo, "%s_trs Q f %s_qew Q f %s_qwn Q f %s_qgd Q f %s_qnx Q f ",
   456  				name, name, name, name, name)
   457  			fmt.Fprintf(fo, "%s_qi Q f %s_qc Q f %s_qf Q f\n",
   458  				name, name, name)
   459  			fmt.Fprintf(fo, "%s_qvo Q f %s_qvr Q f %s_sto Q f\n", name, name, name)
   460  			fmt.Fprintf(fo, "%s_qldhl Q f %s_qldcl Q f %s_hinl Q f\n", name, name, name)
   461  			fmt.Fprintf(fo, "%s_vol Q f %s_vrl Q f %s_stol Q f\n", name, name, name)
   462  		}
   463  		break
   464  
   465  	default:
   466  		for i = 0; i < Nroom+1; i++ {
   467  			if i < Nroom {
   468  				Room := _Room[i]
   469  				q = &Room.rmqe.qelmdy.qe
   470  				qh = &Room.rmqe.qelmdy
   471  				fmt.Fprintf(fo, "%3.1f %3.1f ",
   472  					qh.loadh*Cff_kWh, qh.loadc*Cff_kWh)
   473  				fmt.Fprintf(fo, "%3.1f %3.1f %3.1f %3.1f %3.1f  ",
   474  					qh.slo*Cff_kWh, qh.slw*Cff_kWh, qh.asl*Cff_kWh,
   475  					qh.tsol*Cff_kWh, qh.hins*Cff_kWh)
   476  				fmt.Fprintf(fo, "%3.1f %3.1f %3.1f %3.1f %3.1f  ",
   477  					q.so*Cff_kWh, q.sg*Cff_kWh, q.rn*Cff_kWh,
   478  					q.in*Cff_kWh, q.pnl*Cff_kWh)
   479  				fmt.Fprintf(fo, "%3.1f %3.1f %3.1f %3.1f %3.1f ",
   480  					q.trs*Cff_kWh, qh.ew*Cff_kWh,
   481  					qh.wn*Cff_kWh, qh.gd*Cff_kWh, qh.nx*Cff_kWh)
   482  				fmt.Fprintf(fo, "%3.1f %3.1f %3.1f %3.1f %3.1f %3.1f ",
   483  					qh.i*Cff_kWh, qh.c*Cff_kWh, qh.f*Cff_kWh,
   484  					qh.vo*Cff_kWh, qh.vr*Cff_kWh, qh.sto*Cff_kWh)
   485  				fmt.Fprintf(fo, "%3.1f %3.1f %3.1f %3.1f %3.1f %3.1f\n",
   486  					qh.loadhl*Cff_kWh, qh.loadcl*Cff_kWh, qh.hinl*Cff_kWh,
   487  					qh.vol*Cff_kWh, qh.vrl*Cff_kWh, qh.stol*Cff_kWh)
   488  			} else {
   489  				q = &Qetotal.Qelmdy.qe
   490  				qh = &Qetotal.Qelmdy
   491  				fmt.Fprintf(fo, "%3.1f %3.1f ",
   492  					qh.loadh*Cff_kWh, qh.loadc*Cff_kWh)
   493  				fmt.Fprintf(fo, "%3.1f %3.1f %3.1f %3.1f %3.1f  ",
   494  					qh.slo*Cff_kWh, qh.slw*Cff_kWh, qh.asl*Cff_kWh,
   495  					qh.tsol*Cff_kWh, qh.hins*Cff_kWh)
   496  
   497  				fmt.Fprintf(fo, "%3.1f %3.1f %3.1f %3.1f %3.1f  ",
   498  					q.so*Cff_kWh, q.sg*Cff_kWh, q.rn*Cff_kWh,
   499  					q.in*Cff_kWh, q.pnl*Cff_kWh)
   500  				fmt.Fprintf(fo, "%3.1f %3.1f %3.1f %3.1f %3.1f ",
   501  					q.trs*Cff_kWh, qh.ew*Cff_kWh,
   502  					qh.wn*Cff_kWh, qh.gd*Cff_kWh, qh.nx*Cff_kWh)
   503  				fmt.Fprintf(fo, "%3.1f %3.1f %3.1f %3.1f %3.1f %3.1f ",
   504  					qh.i*Cff_kWh, qh.c*Cff_kWh, qh.f*Cff_kWh,
   505  					qh.vo*Cff_kWh, qh.vr*Cff_kWh, qh.sto*Cff_kWh)
   506  				fmt.Fprintf(fo, "%3.1f %3.1f %3.1f %3.1f %3.1f %3.1f\n",
   507  					qh.loadhl*Cff_kWh, qh.loadcl*Cff_kWh, qh.hinl*Cff_kWh,
   508  					qh.vol*Cff_kWh, qh.vrl*Cff_kWh, qh.stol*Cff_kWh)
   509  			}
   510  		}
   511  		break
   512  	}
   513  }
   514  
   515  /* ----------------------------------------------------- */