github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/blrmprint.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  /*   rmprint.c   */
    17  
    18  package eeslism
    19  
    20  import (
    21  	"fmt"
    22  	"io"
    23  )
    24  
    25  /* ---------------------------------------------------------------- */
    26  /* 室内表面温度の出力 */
    27  
    28  var __Rmsfprint_ic int
    29  
    30  func Rmsfprint(fo io.Writer, title string, Mon, Day int, time float64, Room []*ROOM, Sd []*RMSRF) {
    31  	if __Rmsfprint_ic == 0 {
    32  		__Rmsfprint_ic++
    33  
    34  		var n int
    35  		for i := range Room {
    36  			Rm := Room[i]
    37  			if Rm.sfpri {
    38  				n++
    39  			}
    40  		}
    41  
    42  		fmt.Fprintf(fo, "%s;\n %d\n", title, n)
    43  		fmt.Fprint(fo, "Mo\tNd\ttime\t")
    44  
    45  		for i := range Room {
    46  			Rm := Room[i]
    47  			if Rm.sfpri {
    48  				fmt.Fprintf(fo, "%s\t", Rm.Name)
    49  
    50  				for n := 0; n < Rm.N; n++ {
    51  					S := Sd[Rm.Brs+n]
    52  					if S.Name == "" {
    53  						fmt.Fprintf(fo, "%d-%c_Ts\t", n-Rm.Brs, S.ble)
    54  					} else {
    55  						fmt.Fprintf(fo, "%s_Ts\t", S.Name)
    56  					}
    57  				}
    58  			}
    59  		}
    60  		fmt.Fprint(fo, "\n")
    61  	}
    62  	fmt.Fprintf(fo, "%d\t%d\t%.2f\t", Mon, Day, time)
    63  
    64  	for i := range Room {
    65  		Rm := Room[i]
    66  		if Rm.sfpri {
    67  			fmt.Fprint(fo, "\t")
    68  
    69  			for n := 0; n < Rm.N; n++ {
    70  				S := Sd[Rm.Brs+n]
    71  				fmt.Fprintf(fo, "%.1f\t", S.Ts)
    72  			}
    73  		}
    74  	}
    75  	fmt.Fprint(fo, "\n")
    76  }
    77  
    78  /* ---------------------------------------------------------------- */
    79  /* 室内表面熱流の出力 */
    80  
    81  var __Rmsfqprint_ic int
    82  
    83  func Rmsfqprint(fo io.Writer, title string, Mon, Day int, time float64, Room []*ROOM, Sd []*RMSRF) {
    84  	if __Rmsfqprint_ic == 0 {
    85  		__Rmsfqprint_ic++
    86  
    87  		var n int
    88  		for i := range Room {
    89  			Rm := Room[i]
    90  			if Rm.sfpri {
    91  				n++
    92  			}
    93  		}
    94  
    95  		fmt.Fprintf(fo, "%s;\n %d\n", title, n)
    96  		fmt.Fprint(fo, "Mo\tNd\ttime\t")
    97  
    98  		for i := range Room {
    99  			Rm := Room[i]
   100  			if Rm.sfpri {
   101  				fmt.Fprintf(fo, "%s\t", Rm.Name)
   102  
   103  				for n := 0; n < Rm.N; n++ {
   104  					S := Sd[Rm.Brs+n]
   105  					if S.Name == "" {
   106  						fmt.Fprintf(fo, "%d-%c_Qc\t%d-%c_Qr\t%d-%c_RS\t%d-%c_Qi\t%d-%c_RSsol\t%d-%c_RSli\t%d-%c_tsol\t%d-%c_asol\t%d-%c_rn\t",
   107  							n, S.ble, n, S.ble, n, S.ble,
   108  							n, S.ble, n, S.ble, n, S.ble, n, S.ble, n, S.ble, n, S.ble)
   109  					} else {
   110  						fmt.Fprintf(fo, "%s_Qc\t%s_Qr\t%s_RS\t%s_Qi\t%s_RSsol\t%s_RSli\t%s_tsol\t%s_asol\t%s_rn\t",
   111  							S.Name, S.Name, S.Name, S.Name, S.Name, S.Name, S.Name, S.Name, S.Name)
   112  					}
   113  				}
   114  			}
   115  		}
   116  		fmt.Fprint(fo, "\n")
   117  	}
   118  	fmt.Fprintf(fo, "%d\t%d\t%.2f\t", Mon, Day, time)
   119  
   120  	for i := range Room {
   121  		Rm := Room[i]
   122  		if Rm.sfpri {
   123  			fmt.Fprint(fo, "\t")
   124  
   125  			// 2003/9/10 表面熱取得を負とするために短波長成分RSの符号を変更した。
   126  			for n := 0; n < Rm.N; n++ {
   127  				S := Sd[Rm.Brs+n]
   128  				fmt.Fprintf(fo, "%.4e\t%.4e\t%.4e\t%.4e\t%.4e\t%.4e\t%.4e\t%.4e\t%.4e\t", S.Qc, S.Qr,
   129  					-S.RS*S.A, S.Qi, -S.RSsol*S.A, -S.RSli*S.A, S.Qgt, S.Qga, S.Qrn)
   130  			}
   131  		}
   132  	}
   133  	fmt.Fprint(fo, "\n")
   134  }
   135  
   136  /* ---------------------------------------------------------------- */
   137  /* 室内表面熱伝達率の出力 */
   138  
   139  var __Rmsfaprint_ic int
   140  
   141  func Rmsfaprint(fo io.Writer, title string, Mon, Day int, time float64, Room []*ROOM, Sd []*RMSRF) {
   142  	if __Rmsfaprint_ic == 0 {
   143  		__Rmsfaprint_ic++
   144  
   145  		var n int
   146  		for i := range Room {
   147  			Rm := Room[i]
   148  			if Rm.sfpri {
   149  				n++
   150  			}
   151  		}
   152  
   153  		fmt.Fprintf(fo, "%s;\n %d\n", title, n)
   154  		fmt.Fprint(fo, "Mo\tNd\ttime\t")
   155  
   156  		for i := range Room {
   157  			Rm := Room[i]
   158  			if Rm.sfpri {
   159  				fmt.Fprintf(fo, "%s\t", Rm.Name)
   160  
   161  				for nn := 0; nn < Rm.N; nn++ {
   162  					S := Sd[Rm.Brs+nn]
   163  					if S.Name == "" {
   164  						fmt.Fprintf(fo, "%d-%c_K\t%d-%c_alc\t%d-%c_alr\t",
   165  							n-Rm.Brs, S.ble, n-Rm.Brs, S.ble, n-Rm.Brs, S.ble)
   166  					} else {
   167  						fmt.Fprintf(fo, "%s_K\t%s_alc\t%s_alr\t",
   168  							S.Name, S.Name, S.Name)
   169  					}
   170  				}
   171  			}
   172  		}
   173  		fmt.Fprint(fo, "\n")
   174  	}
   175  	fmt.Fprintf(fo, "%d\t%d\t%.2f\t", Mon, Day, time)
   176  
   177  	for i := range Room {
   178  		Rm := Room[i]
   179  		if Rm.sfpri {
   180  			fmt.Fprint(fo, "\t")
   181  
   182  			for nn := 0; nn < Rm.N; nn++ {
   183  				S := Sd[Rm.Brs+nn]
   184  				fmt.Fprintf(fo, "%.3g\t%.3g\t%.3g\t", S.K, S.alic, S.alir)
   185  			}
   186  		}
   187  	}
   188  	fmt.Fprint(fo, "\n")
   189  }
   190  
   191  /* 日積算壁体貫流熱取得の出力 */
   192  var __Dysfprint_ic int
   193  
   194  func Dysfprint(fo io.Writer, title string, Mon, Day int, Room []*ROOM) {
   195  	if __Dysfprint_ic == 0 {
   196  		__Dysfprint_ic++
   197  
   198  		var n int
   199  		for i := range Room {
   200  			Rm := Room[i]
   201  			if Rm.sfpri {
   202  				n++
   203  			}
   204  		}
   205  
   206  		fmt.Fprintf(fo, "%s;\n %d\n", title, n)
   207  		fmt.Fprint(fo, "Mo\tNd\t")
   208  
   209  		for i := range Room {
   210  			Rm := Room[i]
   211  			if Rm.sfpri {
   212  				fmt.Fprintf(fo, "%s\t", Rm.Name)
   213  
   214  				for n := 0; n < Rm.N; n++ {
   215  					Sd := Rm.rsrf[n]
   216  					if Sd.Name == "" {
   217  						fmt.Fprintf(fo, "%d-%c_Ts\t%d-%c_Tsmax\t%d-%c_Tsmin\t%d-%c_Qih\t%d-%c_Qic\t",
   218  							n, Sd.ble, n, Sd.ble, n, Sd.ble, n, Sd.ble, n, Sd.ble)
   219  					} else {
   220  						fmt.Fprintf(fo, "%s_Ts\t%s_Tsmax\t%s_Tsmin\t%s_Qih\t%s_Qic\t",
   221  							Sd.Name, Sd.Name, Sd.Name, Sd.Name, Sd.Name)
   222  					}
   223  				}
   224  			}
   225  		}
   226  		fmt.Fprint(fo, "\n")
   227  	}
   228  
   229  	fmt.Fprintf(fo, "%d\t%d\t", Mon, Day)
   230  
   231  	for i := range Room {
   232  		Rm := Room[i]
   233  		if Rm.sfpri {
   234  			fmt.Fprint(fo, "\t")
   235  
   236  			for n := 0; n < Rm.N; n++ {
   237  				Sd := Rm.rsrf[n]
   238  				fmt.Fprintf(fo, "%.2f\t%.2f\t%.2f\t%.3g\t%.3g\t",
   239  					Sd.Tsdy.M, Sd.Tsdy.Mx, Sd.Tsdy.Mn, Sd.SQi.H, Sd.SQi.C)
   240  			}
   241  		}
   242  	}
   243  
   244  	fmt.Fprint(fo, "\n")
   245  }
   246  
   247  /* ---------------------------------------------------------------- */
   248  
   249  /* 日よけの影面積の出力 */
   250  
   251  var __Shdprint_ic int
   252  
   253  func Shdprint(fo io.Writer, title string, Mon, Day int, time float64, Sd []*RMSRF) {
   254  	if __Shdprint_ic == 0 {
   255  		__Shdprint_ic++
   256  
   257  		var m int
   258  		for i := range Sd {
   259  			Sdd := Sd[i]
   260  			if Sdd.shdpri && Sdd.sb >= 0 {
   261  				m++
   262  			}
   263  		}
   264  
   265  		fmt.Fprintf(fo, "%s;\n %d\n", title, m)
   266  
   267  		for i := range Sd {
   268  			Sdd := Sd[i]
   269  			if Sdd.shdpri && Sdd.sb >= 0 {
   270  				fmt.Fprintf(fo, "%s\t%d:%s\n", Sdd.room.Name, i-Sdd.room.Brs, Sdd.Name)
   271  			}
   272  		}
   273  	}
   274  
   275  	fmt.Fprintf(fo, "%d\t%d\t%.2f\t", Mon, Day, time)
   276  
   277  	for i := range Sd {
   278  		Sdd := Sd[i]
   279  		if Sdd.shdpri && Sdd.sb >= 0 {
   280  			fmt.Fprintf(fo, "%.2f\t", Sdd.Fsdworg)
   281  		}
   282  	}
   283  
   284  	fmt.Fprint(fo, "\n")
   285  }
   286  
   287  /* ---------------------------------------------------------------- */
   288  
   289  /* 壁体内部温度の出力 */
   290  
   291  var __Wallprint_ic int
   292  
   293  func Wallprint(fo io.Writer, title string, Mon, Day int, time float64, Sd []*RMSRF) {
   294  	if __Wallprint_ic == 0 {
   295  		__Wallprint_ic++
   296  		var m int
   297  		for i := range Sd {
   298  			Sdd := Sd[i]
   299  			if Sdd.wlpri && Sdd.wd >= 0 {
   300  				m++
   301  			}
   302  		}
   303  
   304  		fmt.Fprintf(fo, "%s;\n %d\n", title, m)
   305  
   306  		for i := range Sd {
   307  			Sdd := Sd[i]
   308  			if Sdd.wlpri && Sdd.wd >= 0 {
   309  				fmt.Fprintf(fo, "%s\t%d-%c:%s\t%d\n", Sdd.room.Name, i-Sdd.room.Brs, Sdd.ble, Sdd.Name, Sdd.mw.M)
   310  			}
   311  		}
   312  	}
   313  
   314  	fmt.Fprintf(fo, "%d\t%d\t%.2f\t", Mon, Day, time)
   315  
   316  	for i := range Sd {
   317  		Sdd := Sd[i]
   318  		if Sdd.wlpri && Sdd.wd >= 0 {
   319  			Mw := Sdd.mw
   320  
   321  			// 室内が壁体0側の場合
   322  			if Sdd.mwside == RMSRFMwSideType_i {
   323  				for m := 0; m < Mw.M; m++ {
   324  					fmt.Fprintf(fo, "\t%.2f", Mw.Tw[m])
   325  				}
   326  			} else { // 室内が壁体M側の場合
   327  				for m := Mw.M - 1; m >= 0; m-- {
   328  					fmt.Fprintf(fo, "\t%.2f", Mw.Tw[m])
   329  				}
   330  			}
   331  
   332  			fmt.Fprint(fo, "\t")
   333  		}
   334  	}
   335  
   336  	fmt.Fprint(fo, "\n")
   337  }
   338  
   339  /* ---------------------------------------------------------------- */
   340  
   341  /* 潜熱蓄熱材の状態値の出力 */
   342  var __PCMprint_ic int
   343  
   344  func PCMprint(fo io.Writer, title string, Mon, Day int, time float64, Sd []*RMSRF) {
   345  	var Sdd *RMSRF
   346  	var pcmstate *PCMSTATE
   347  
   348  	if __PCMprint_ic == 0 {
   349  		__PCMprint_ic++
   350  
   351  		Sdd = Sd[0]
   352  		m := 0
   353  		for i := range Sd {
   354  			if Sdd.pcmpri && Sdd.wd >= 0 {
   355  				m += Sdd.Npcm
   356  			}
   357  			Sdd = Sd[i]
   358  		}
   359  
   360  		fmt.Fprintf(fo, "%s;\n %d\n", title, m)
   361  
   362  		for i := range Sd {
   363  			Sdd := Sd[i]
   364  			if Sdd.mwside == RMSRFMwSideType_i {
   365  				if Sdd.pcmpri && Sdd.wd >= 0 {
   366  					for m := 0; m < Sdd.mw.M; m++ {
   367  						pcmstate = Sdd.pcmstate[m]
   368  						if pcmstate != nil && pcmstate.Name != nil {
   369  							fmt.Fprintf(fo, "%s\t%d-%c:%s\t%s\tTpcm\tcp\tLamda\n", Sdd.room.Name, i-Sdd.room.Brs, Sdd.ble, Sdd.Name, *pcmstate.Name)
   370  						}
   371  					}
   372  				}
   373  			}
   374  		}
   375  	}
   376  
   377  	fmt.Fprintf(fo, "%d\t%d\t%.2f\t", Mon, Day, time)
   378  
   379  	for _, Sdd := range Sd {
   380  		if Sdd.pcmpri && Sdd.wd >= 0 {
   381  			Mw := Sdd.mw
   382  
   383  			if Sdd.mwside == RMSRFMwSideType_i {
   384  				for j := 0; j < Mw.M; j++ {
   385  					pcmstate = Sdd.pcmstate[j]
   386  					if pcmstate != nil && pcmstate.Name != nil {
   387  						fmt.Fprintf(fo, "\t%.3f\t%.3f\t%.3f\t%.0f\t%.0f\t%.4g\t%.4g",
   388  							pcmstate.TempPCMNodeL, pcmstate.TempPCMNodeR,
   389  							pcmstate.TempPCMave, pcmstate.CapmL, pcmstate.CapmR,
   390  							pcmstate.LamdaL, pcmstate.LamdaR)
   391  					}
   392  				}
   393  			}
   394  
   395  			fmt.Fprintf(fo, "\t")
   396  		}
   397  	}
   398  
   399  	fmt.Fprintf(fo, "\n")
   400  }
   401  
   402  /* ---------------------------------------------------------------- */
   403  
   404  /* 日射、室内熱取得の出力 */
   405  
   406  var __Qrmprint_ic int
   407  
   408  func Qrmprint(fo io.Writer, title string, Mon, Day int, time float64, Room []*ROOM, Qrm []*QRM) {
   409  	if __Qrmprint_ic == 0 {
   410  		__Qrmprint_ic++
   411  
   412  		// 日射、室内発熱取得出力指定の部屋数を数える
   413  		var n int
   414  		for i := range Room {
   415  			Rm := Room[i]
   416  			if Rm.eqpri {
   417  				n++
   418  			}
   419  		}
   420  
   421  		fmt.Fprintf(fo, "%s;\n %d\n", title, n)
   422  		fmt.Fprint(fo, "Mo\tNd\ttt\t")
   423  
   424  		key := []string{"tsol", "asol", "arn", "hums", "light", "apls",
   425  			"huml", "apll", "Qeqp", "Qfun", "Qis", "Qil", "Qsto", "Qstol", "AE", "AG"}
   426  
   427  		for _, Rm := range Room {
   428  			if Rm.eqpri {
   429  				for j := range key {
   430  					fmt.Fprintf(fo, "%s_%s\t", Rm.Name, key[j])
   431  				}
   432  			}
   433  		}
   434  
   435  		fmt.Fprint(fo, "\n")
   436  	}
   437  
   438  	fmt.Fprintf(fo, "%d\t%d\t%.2f\t", Mon, Day, time)
   439  
   440  	for i, Rm := range Room {
   441  		if Rm.eqpri {
   442  			Q := Qrm[i]
   443  			fmt.Fprintf(fo, "%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t",
   444  				Q.Tsol, Q.Asol, Q.Arn, Q.Hums, Q.Light, Q.Apls, Q.Huml, Q.Apll, Q.Qeqp, Rm.QM, Q.Qinfs, Q.Qinfl)
   445  			fmt.Fprintf(fo, "%.5g\t%.5g\t", Q.Qsto, Q.Qstol)
   446  			fmt.Fprintf(fo, "%.5g\t%.5g\t", Q.AE, Q.AG)
   447  		}
   448  	}
   449  
   450  	fmt.Fprint(fo, "\n")
   451  }
   452  
   453  /* ---------------------------------------------------------------- */
   454  
   455  /* 日射、室内熱取得の出力 */
   456  
   457  var __Dyqrmprint_ic int
   458  
   459  func Dyqrmprint(fo io.Writer, title string, Mon int, Day int, Room []*ROOM, Trdav []float64, Qrmd []*QRM) {
   460  	if __Dyqrmprint_ic == 0 {
   461  		__Dyqrmprint_ic++
   462  
   463  		var n int
   464  
   465  		for i := range Room {
   466  			Rm := Room[i]
   467  			if Rm.eqpri {
   468  				n++
   469  			}
   470  		}
   471  
   472  		fmt.Fprintf(fo, "%s;\n %d\n", title, n)
   473  		fmt.Fprintf(fo, "Mo\tNd\t")
   474  
   475  		key := [16]string{"Tr", "tsol", "asol", "arn", "hums", "light", "apls",
   476  			"huml", "apll", "Qeqp", "Qis", "Qil", "Qsto", "Qstol", "AE", "AG"}
   477  
   478  		for i := range Room {
   479  			Rm := Room[i]
   480  			if Rm.eqpri {
   481  				for j := 0; j < 16; j++ {
   482  					fmt.Fprintf(fo, "%s_%s\t", Rm.Name, key[j])
   483  				}
   484  			}
   485  		}
   486  
   487  		fmt.Fprintf(fo, "\n")
   488  	}
   489  
   490  	fmt.Fprintf(fo, "%d\t%d\t", Mon, Day)
   491  
   492  	for i := range Room {
   493  		if Room[i].eqpri {
   494  			Q := Qrmd[i]
   495  			fmt.Fprintf(fo,
   496  				"%.1f\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t",
   497  				Trdav[i], Q.Tsol, Q.Asol, Q.Arn, Q.Hums, Q.Light, Q.Apls, Q.Huml, Q.Apll,
   498  				Q.Qeqp, Q.Qinfs, Q.Qinfl, Q.Qsto, Q.Qstol, Q.AE, Q.AG)
   499  		}
   500  	}
   501  
   502  	fmt.Fprintf(fo, "\n")
   503  }
   504  
   505  /* ---------------------------------------------------------------- */
   506  
   507  var __Qrmsum_oldday int
   508  
   509  func Qrmsum(Day int, _Room []*ROOM, Qrm []*QRM, Trdav []float64, Qrmd []*QRM) {
   510  	if Day != __Qrmsum_oldday {
   511  		for i := range _Room {
   512  			Q := Qrmd[i]
   513  			T := &Trdav[i]
   514  
   515  			*T = 0.0
   516  			Q.Tsol = 0.0
   517  			Q.Asol = 0.0
   518  			Q.Arn = 0.0
   519  			Q.Hums = 0.0
   520  			Q.Light = 0.0
   521  			Q.Apls = 0.0
   522  			Q.Huml = 0.0
   523  			Q.Apll = 0.0
   524  			Q.Qeqp = 0.0
   525  			Q.Qinfl = 0.0
   526  			Q.Qinfs = 0.0
   527  			Q.Qsto = 0.0
   528  			Q.Qstol = 0.0
   529  			Q.AE = 0.0
   530  			Q.AG = 0.0
   531  		}
   532  		__Qrmsum_oldday = Day
   533  	}
   534  
   535  	for i := range _Room {
   536  		Q := Qrmd[i]
   537  		Qr := Qrm[i]
   538  		T := &Trdav[i]
   539  		Room := _Room[i]
   540  
   541  		scale := DTM / 3600.0
   542  
   543  		*T += Room.Tr * scale / 24.0
   544  		Q.Tsol += Qr.Tsol * scale
   545  		Q.Asol += Qr.Asol * scale
   546  		Q.Arn += Qr.Arn * scale
   547  		Q.Hums += Qr.Hums * scale
   548  		Q.Light += Qr.Light * scale
   549  		Q.Apls += Qr.Apls * scale
   550  		Q.Huml += Qr.Huml * scale
   551  		Q.Apll += Qr.Apll * scale
   552  		Q.Qinfs += Qr.Qinfs * scale
   553  		Q.Qinfl += Qr.Qinfl * scale
   554  		Q.Qeqp += Qr.Qeqp * scale
   555  		Q.Qsto += Qr.Qsto * scale
   556  		Q.Qstol += Qr.Qstol * scale
   557  		Q.AE += Qr.AE * scale
   558  		Q.AG += Qr.AG * scale
   559  	}
   560  }