github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/blhelmlib.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  /* helmlib.c */
    17  
    18  package eeslism
    19  
    20  import "fmt"
    21  
    22  // 外乱要素別表面温度の計算
    23  // 入力値:
    24  //  外気温度 Ta [C]
    25  func helmrmsrt(Room *ROOM, Ta float64) {
    26  	if Room.rmqe == nil {
    27  		return
    28  	}
    29  
    30  	for i := 0; i < Room.N; i++ {
    31  		Sd := Room.rsrf[i]
    32  		Rmsb := Room.rmqe.rmsb[i]
    33  		WSC := Room.rmqe.WSCwk[i]
    34  
    35  		helmclear(WSC)
    36  
    37  		if Mw := Sd.mw; Mw != nil {
    38  			helmsumpd(Mw.M, Mw.UX, Rmsb.Told, WSC)
    39  		}
    40  		WSC.trs += Sd.FI * (Sd.alic / Sd.ali) * Room.Tr
    41  
    42  		if Sd.rpnl != nil {
    43  			Twmp := Sd.mw.Tw[Sd.mw.mp]
    44  			WSC.pnl += Sd.FP * (Sd.rpnl.Tpi - Twmp)
    45  			WSC.trs += Sd.FP * Twmp
    46  		}
    47  
    48  		switch Rmsb.Type {
    49  		case RMSBType_E: // 外気に接する壁
    50  			WSC.trs += Sd.FO * Ta
    51  			WSC.rn += Sd.FO * Sd.TeErn
    52  			if Sd.ble == BLE_ExternalWall {
    53  				WSC.so += Sd.FO * Sd.TeEsol
    54  			} else if Sd.ble == BLE_Window {
    55  				WSC.sg += Sd.FO * Sd.TeEsol
    56  			}
    57  		case RMSBType_G: // 地盤に接する壁
    58  			WSC.trs += Sd.FO * Sd.Te
    59  		case RMSBType_i: // 内壁
    60  			WSC.trs += Sd.FO * Sd.nextroom.Trold
    61  		}
    62  
    63  		WSC.sg += Sd.FI * Sd.RSsol / Sd.ali
    64  		WSC.in += Sd.FI * Sd.RSin / Sd.ali
    65  	}
    66  
    67  	for i := 0; i < Room.N; i++ {
    68  		Rmsb := Room.rmqe.rmsb[i]
    69  		XA := Room.XA[Room.N*i : Room.N*(i+1)]
    70  		Ts := &Rmsb.Ts
    71  		helmclear(Ts)
    72  		helmsumpd(Room.N, XA, Room.rmqe.WSCwk, Ts)
    73  	}
    74  }
    75  
    76  /* ---------------------------------------------- */
    77  
    78  /* 壁体内温度 */
    79  // 入力値:
    80  //  外気温度 Ta [C]
    81  func helmwall(Room *ROOM, Ta float64) {
    82  	if Room.rmqe == nil {
    83  		return
    84  	}
    85  
    86  	for i := 0; i < Room.N; i++ {
    87  		alr := Room.alr[Room.N*i : Room.N*(i+1)]
    88  		Sd := Room.rsrf[i]
    89  		rmsb := Room.rmqe.rmsb[i]
    90  
    91  		if Mw := Sd.mw; Mw != nil {
    92  			var Tie, Te, Tpe BHELM
    93  			var Tm BHELM
    94  
    95  			helmclear(&Tie)
    96  			helmclear(&Te)
    97  			helmclear(&Tpe)
    98  
    99  			helmwlsft(i, Room.N, alr, Room.rmqe.rmsb, &Tm)
   100  
   101  			helmsumpf(1, Sd.alir, &Tm, &Tie)
   102  
   103  			Tie.trs += Sd.alic * Room.Tr
   104  
   105  			if Sd.rpnl != nil {
   106  				Twp := Mw.Tw
   107  				Twmp := Twp[Mw.mp]
   108  				Tpe.pnl = Sd.rpnl.Tpi - Twmp
   109  				Tpe.trs = Twmp
   110  			}
   111  
   112  			switch rmsb.Type {
   113  			case 'E': // 外気に接する壁
   114  				Te.trs = Ta
   115  				Te.so = Sd.TeEsol
   116  				Te.rn = Sd.TeErn
   117  			case 'G': // 地盤に接する壁
   118  				Te.trs = Sd.Te
   119  			case 'i': // 内壁
   120  				Te.trs = Sd.nextroom.Trold
   121  			}
   122  
   123  			Tie.sg += Sd.RSsol
   124  			Tie.in += Sd.RSin
   125  			helmdiv(&Tie, Sd.ali)
   126  
   127  			helmwlt(Mw.M, Mw.mp, Mw.UX, Mw.uo, Mw.um, Mw.Pc, []*BHELM{&Tie}, []*BHELM{&Te}, []*BHELM{&Tpe}, rmsb.Told, rmsb.Tw)
   128  
   129  			for m := 0; m < Mw.M; m++ {
   130  				Told := rmsb.Told[m]
   131  				Tw := rmsb.Tw[m]
   132  				helmcpy(Tw, Told)
   133  			}
   134  		}
   135  	}
   136  }
   137  
   138  /* ---------------------------------------------- */
   139  
   140  /* 面 i についての平均表面温度 */
   141  
   142  func helmwlsft(i, N int, alr []float64, rmsb []*RMSB, Tm *BHELM) {
   143  	Ralr := alr[i]
   144  
   145  	helmclear(Tm)
   146  
   147  	for j := 0; j < N; j++ {
   148  		if j != i {
   149  			helmsumpf(1, alr[0], &rmsb[j].Ts, Tm)
   150  		}
   151  	}
   152  
   153  	helmdiv(Tm, Ralr)
   154  }
   155  
   156  /* ---------------------------------------------- */
   157  
   158  func helmwlt(M, mp int, UX []float64, uo, um, Pc float64, Tie, Te, Tpe, Told, Tw []*BHELM) {
   159  	helmsumpd(1, []float64{uo}, Tie, Told[0])
   160  	helmsumpd(1, []float64{um}, Te, Told[M-1])
   161  
   162  	if Pc > 0.0 {
   163  		helmsumpd(1, []float64{Pc}, Tpe, Told[mp])
   164  	}
   165  
   166  	for m := 0; m < M; m++ {
   167  		helmclear(Tw[m])
   168  		helmsumpd(M, UX, Told, Tw[m])
   169  		UX = UX[M:]
   170  	}
   171  }
   172  
   173  /* ---------------------------------------------- */
   174  
   175  /* 要素別熱損失・熱取得 */
   176  
   177  // 入力値:
   178  //  外気温度 Ta [C]
   179  //  絶対湿度 xa [kg/kg]
   180  func helmq(_Room []*ROOM, Ta, xa float64) {
   181  	var q, Ts *BHELM
   182  	var qh *QHELM
   183  	var Sd *RMSRF
   184  	var rmsb *RMSB
   185  	var achr *ACHIR
   186  	var Aalc, qloss float64
   187  
   188  	Room := _Room[0]
   189  
   190  	qelmclear(&Room.rmqe.qelm)
   191  	q = &Room.rmqe.qelm.qe
   192  	qh = &Room.rmqe.qelm
   193  
   194  	qh.loadh = 0.0
   195  	qh.loadc = 0.0
   196  	qh.loadcl = 0.0
   197  	qh.loadhl = 0.0
   198  	if Room.rmld != nil {
   199  		if Room.rmld.Qs > 0.0 {
   200  			qh.loadh = Room.rmld.Qs
   201  		} else {
   202  			qh.loadc = Room.rmld.Qs
   203  		}
   204  
   205  		if Room.rmld.Ql > 0.0 {
   206  			qh.loadhl = Room.rmld.Ql
   207  		} else {
   208  			qh.loadcl = Room.rmld.Ql
   209  		}
   210  	}
   211  
   212  	for i := 0; i < Room.N; i++ {
   213  		Sd = Room.rsrf[i]
   214  		rmsb = Room.rmqe.rmsb[i]
   215  
   216  		Aalc = Sd.A * Sd.alic
   217  		Ts = &rmsb.Ts
   218  		qloss = Aalc * (Room.Tr - Ts.trs)
   219  		q.trs -= qloss
   220  
   221  		if rmsb.Type == RMSBType_E {
   222  			if Sd.ble == BLE_ExternalWall {
   223  				qh.ew -= qloss
   224  			} else if Sd.ble == BLE_Window {
   225  				qh.wn -= qloss
   226  			}
   227  		} else if rmsb.Type == RMSBType_G {
   228  			qh.gd -= qloss
   229  		} else if rmsb.Type == RMSBType_i {
   230  			qh.nx -= qloss
   231  		}
   232  
   233  		if Sd.ble == BLE_Ceil || Sd.ble == BLE_Roof {
   234  			qh.c -= qloss
   235  		} else if Sd.ble == BLE_InnerFloor || Sd.ble == BLE_Floor {
   236  			qh.f -= qloss
   237  		} else if Sd.ble == BLE_InnerWall || Sd.ble == BLE_d {
   238  			qh.i -= qloss
   239  		}
   240  
   241  		q.so += Aalc * Ts.so
   242  		q.sg += Aalc * Ts.sg
   243  		q.rn += Aalc * Ts.rn
   244  		q.in += Aalc * Ts.in
   245  		q.pnl += Aalc * Ts.pnl
   246  	}
   247  
   248  	q.in += Room.Hc + Room.Lc + Room.Ac
   249  
   250  	qh.hinl = Room.AL + Room.HL
   251  
   252  	qh.sto = Room.MRM * (Room.Trold - Room.Tr) / DTM
   253  	qh.stol = Room.GRM * Ro * (Room.xrold - Room.xr) / DTM
   254  	qh.vo = Ca * Room.Gvent * (Ta - Room.Tr)
   255  	qh.vol = Ro * Room.Gvent * (xa - Room.xr)
   256  
   257  	qh.vr = 0.0
   258  	qh.vrl = 0.0
   259  	for j := 0; j < Room.Nachr; j++ {
   260  		achr = Room.achr[j]
   261  		qh.vr += Ca * achr.Gvr * (_Room[achr.rm].Tr - Room.Tr)
   262  		qh.vrl += Ro * achr.Gvr * (_Room[achr.rm].xr - Room.xr)
   263  	}
   264  }
   265  
   266  /* ---------------------------------------------- */
   267  
   268  // Reset q to zero
   269  func qelmclear(q *QHELM) {
   270  	helmclear(&q.qe)
   271  	q.slo = 0.0
   272  	q.slw = 0.0
   273  	q.asl = 0.0
   274  	q.tsol = 0.0
   275  	q.hins = 0.0
   276  	q.nx = 0.0
   277  	q.gd = 0.0
   278  	q.ew = 0.0
   279  	q.wn = 0.0
   280  	q.i = 0.0
   281  	q.c = 0.0
   282  	q.f = 0.0
   283  	q.vo = 0.0
   284  	q.vr = 0.0
   285  	q.sto = 0.0
   286  	q.loadh = 0.0
   287  	q.loadc = 0.0
   288  	q.hinl = 0.0
   289  	q.vol = 0.0
   290  	q.vrl = 0.0
   291  	q.stol = 0.0
   292  	q.loadcl = 0.0
   293  	q.loadhl = 0.0
   294  }
   295  
   296  /* ---------------------------------------------- */
   297  
   298  // Add a to b
   299  func qelmsum(a, b *QHELM) {
   300  	helmsum(&a.qe, &b.qe)
   301  
   302  	b.slo += a.slo
   303  	b.slw += a.slw
   304  	b.asl += a.asl
   305  	b.tsol += a.tsol
   306  	b.hins += a.hins
   307  
   308  	b.nx += a.nx
   309  	b.gd += a.gd
   310  	b.ew += a.ew
   311  	b.wn += a.wn
   312  
   313  	b.i += a.i
   314  	b.c += a.c
   315  	b.f += a.f
   316  	b.vo += a.vo
   317  	b.vr += a.vr
   318  	b.sto += a.sto
   319  	b.loadh += a.loadh
   320  	b.loadc += a.loadc
   321  
   322  	b.hinl += a.hinl
   323  	b.vol += a.vol
   324  	b.stol += a.stol
   325  	b.vrl += a.vrl
   326  	b.loadcl += a.loadcl
   327  	b.loadhl += a.loadhl
   328  }
   329  
   330  /* ---------------------------------------------- */
   331  
   332  // Reset b to zero
   333  func helmclear(b *BHELM) {
   334  	b.trs = 0.0
   335  	b.so = 0.0
   336  	b.sg = 0.0
   337  	b.rn = 0.0
   338  	b.in = 0.0
   339  	b.pnl = 0.0
   340  }
   341  
   342  /* ---------------------------------------------- */
   343  
   344  // Mutiply a by u(vector) and add to b
   345  func helmsumpd(N int, u []float64, a []*BHELM, b *BHELM) {
   346  	for i := 0; i < N; i++ {
   347  		b.trs += u[i] * a[i].trs
   348  		b.so += u[i] * a[i].so
   349  		b.sg += u[i] * a[i].sg
   350  		b.rn += u[i] * a[i].rn
   351  		b.in += u[i] * a[i].in
   352  		b.pnl += u[i] * a[i].pnl
   353  	}
   354  }
   355  
   356  /* ---------------------------------------------- */
   357  
   358  // Mutiply a by u(scalar) and add to b
   359  func helmsumpf(N int, u float64, a *BHELM, b *BHELM) {
   360  	if N != 1 {
   361  		panic("N != 1")
   362  	}
   363  
   364  	b.trs += u * a.trs
   365  	b.so += u * a.so
   366  	b.sg += u * a.sg
   367  	b.rn += u * a.rn
   368  	b.in += u * a.in
   369  	b.pnl += u * a.pnl
   370  }
   371  
   372  /* ---------------------------------------------- */
   373  
   374  // Divide a by c
   375  func helmdiv(a *BHELM, c float64) {
   376  	a.trs /= c
   377  	a.so /= c
   378  	a.sg /= c
   379  	a.rn /= c
   380  	a.in /= c
   381  	a.pnl /= c
   382  }
   383  
   384  /* ---------------------------------------------- */
   385  
   386  // Add a to b
   387  func helmsum(a, b *BHELM) {
   388  	b.trs += a.trs
   389  	b.so += a.so
   390  	b.sg += a.sg
   391  	b.rn += a.rn
   392  	b.in += a.in
   393  	b.pnl += a.pnl
   394  }
   395  
   396  /* ---------------------------------------------- */
   397  
   398  // Copy a to b
   399  func helmcpy(a, b *BHELM) {
   400  	b.trs = a.trs
   401  	b.so = a.so
   402  	b.sg = a.sg
   403  	b.rn = a.rn
   404  	b.in = a.in
   405  	b.pnl = a.pnl
   406  }
   407  
   408  /* ========================================== */
   409  
   410  func helmxxprint(s string, a *BHELM) {
   411  	fmt.Printf("xxx helmprint xxx %s  trs so sg rn in pnl\n", s)
   412  	fmt.Printf("%6.2f %6.2f %6.2f %6.2f %6.2f %6.2f\n", a.trs, a.so, a.sg, a.rn, a.in, a.pnl)
   413  }