github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/wdprint.go (about)

     1  package eeslism
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  )
     7  
     8  var __Wdtsum_oldday, __Wdtsum_oldMon int
     9  var __Wdtsum_hrs int  // 日累計回数
    10  var __Wdtsum_hrsm int // 月累計回数
    11  var __Wdtsum_cffWh float64
    12  
    13  // 気象データ等の日集計、月集計を行います。
    14  // 気象データの日集計データは Wdd に、月集ケーデータは Wdm に反映されます。
    15  // 外表面ごとの日集計データは Soldy に、月集計データは Solmon に反映されます。
    16  func Wdtsum(Mon int, Day int, Nday int, ttmm int, Wd *WDAT, Exs []*EXSF,
    17  	Wdd *WDAT, Wdm *WDAT, Soldy []float64, Solmon []float64, Simc *SIMCONTL) {
    18  
    19  	// 日集計の初期化
    20  	if Nday != __Wdtsum_oldday {
    21  		__Wdtsum_cffWh = Cff_kWh * 1000.0
    22  		__Wdtsum_hrs = 0
    23  		Wdd.T = 0.0
    24  		Wdd.X = 0.0
    25  		Wdd.Wv = 0.0
    26  		Wdd.Idn = 0.0
    27  		Wdd.Isky = 0.0
    28  		Wdd.RN = 0.0
    29  
    30  		for i := 0; i < len(Soldy); i++ {
    31  			Soldy[i] = 0.0
    32  		}
    33  
    34  	}
    35  	__Wdtsum_oldday = Nday
    36  
    37  	// 月集計の初期化
    38  	if Mon != __Wdtsum_oldMon {
    39  		__Wdtsum_cffWh = Cff_kWh * 1000.0
    40  		__Wdtsum_hrsm = 0
    41  		Wdm.T = 0.0
    42  		Wdm.X = 0.0
    43  		Wdm.Wv = 0.0
    44  		Wdm.Idn = 0.0
    45  		Wdm.Isky = 0.0
    46  		Wdm.RN = 0.0
    47  
    48  		for i := 0; i < len(Solmon); i++ {
    49  			Solmon[i] = 0.0
    50  		}
    51  
    52  		__Wdtsum_oldMon = Mon
    53  	}
    54  
    55  	// 日集計
    56  	__Wdtsum_hrs++
    57  	Wdd.T += Wd.T
    58  	Wdd.X += Wd.X
    59  	Wdd.Wv += Wd.Wv
    60  	Wdd.Idn += Wd.Idn
    61  	Wdd.Isky += Wd.Isky
    62  	Wdd.RN += Wd.RN
    63  
    64  	for i, e := range Exs {
    65  		if e.Typ != 'E' && e.Typ != 'e' {
    66  			Soldy[i] += e.Iw
    67  		} else {
    68  			Soldy[i] += e.Tearth
    69  		}
    70  	}
    71  
    72  	// 月集計
    73  	__Wdtsum_hrsm++
    74  	Wdm.T += Wd.T
    75  	Wdm.X += Wd.X
    76  	Wdm.Wv += Wd.Wv
    77  	Wdm.Idn += Wd.Idn
    78  	Wdm.Isky += Wd.Isky
    79  	Wdm.RN += Wd.RN
    80  
    81  	for i, e := range Exs {
    82  		if e.Typ != 'E' && e.Typ != 'e' {
    83  			Solmon[i] += e.Iw
    84  		} else {
    85  			Solmon[i] += e.Tearth
    86  		}
    87  	}
    88  
    89  	// 日の終わりの処理
    90  	if ttmm == 2400 {
    91  		// 気温、絶対湿度、風速を平均値に変換
    92  		Wdd.T /= float64(__Wdtsum_hrs)
    93  		Wdd.X /= float64(__Wdtsum_hrs)
    94  		Wdd.Wv /= float64(__Wdtsum_hrs)
    95  
    96  		// 日射、ふく射を単位変換
    97  		Wdd.Idn *= __Wdtsum_cffWh
    98  		Wdd.Isky *= __Wdtsum_cffWh
    99  		Wdd.RN *= __Wdtsum_cffWh
   100  
   101  		// 外表面ごとの日射量または温度
   102  		for i, e := range Exs {
   103  			if e.Typ != EXSFType_E && e.Typ != EXSFType_e {
   104  				// 日射量の単位変換
   105  				Soldy[i] *= __Wdtsum_cffWh
   106  			} else {
   107  				// 温度を平均化
   108  				Soldy[i] /= float64(__Wdtsum_hrs)
   109  			}
   110  		}
   111  	}
   112  
   113  	// 月の終わりの処理
   114  	if IsEndDay(Mon, Day, Nday, Simc.Dayend) && __Wdtsum_hrsm > 0 && ttmm == 2400 {
   115  		// 気温、絶対湿度、風速を平均値に変換
   116  		Wdm.T /= float64(__Wdtsum_hrsm)
   117  		Wdm.X /= float64(__Wdtsum_hrsm)
   118  		Wdm.Wv /= float64(__Wdtsum_hrsm)
   119  
   120  		// 日射、ふく射を単位変換
   121  		Wdm.Idn *= __Wdtsum_cffWh
   122  		Wdm.Isky *= __Wdtsum_cffWh
   123  		Wdm.RN *= __Wdtsum_cffWh
   124  
   125  		// 外表面ごとの日射量または温度
   126  		for i, e := range Exs {
   127  			if e.Typ != EXSFType_E && e.Typ != EXSFType_e {
   128  				// 日射量の単位変換
   129  				Solmon[i] *= __Wdtsum_cffWh
   130  			} else {
   131  				// 温度を平均化
   132  				Solmon[i] /= float64(__Wdtsum_hrsm)
   133  			}
   134  		}
   135  	}
   136  }
   137  
   138  var __Wdtdprint_ic int
   139  
   140  /* 気象データ日集計値出力 */
   141  func Wdtdprint(fo io.Writer, title string, Mon int, Day int, Wdd *WDAT, Exs []*EXSF, Soldy []float64) {
   142  	if __Wdtdprint_ic == 0 {
   143  		__Wdtdprint_ic++
   144  		fmt.Fprintf(fo, "%s;\n %d\n", title, len(Exs))
   145  
   146  		fmt.Fprintf(fo, "Mo\tNd\tWd_T\tWd_x\tWd_Wv\tWd_RN\tWd_Idn\tWd_Isky\t")
   147  		for _, e := range Exs {
   148  			fmt.Fprintf(fo, "%s[%c]\t", e.Name, e.Typ)
   149  		}
   150  		fmt.Fprintf(fo, "\n")
   151  	}
   152  
   153  	fmt.Fprintf(fo, "%d\t%d\t", Mon, Day)
   154  	fmt.Fprintf(fo, "%.1f\t%.4f\t%.1f\t%.2f\t%.2f\t%4.2f", Wdd.T, Wdd.X, Wdd.Wv, Wdd.RN/1000., Wdd.Idn/1000., Wdd.Isky/1000.)
   155  
   156  	for i, e := range Exs {
   157  		if e.Typ != EXSFType_E && e.Typ != EXSFType_e {
   158  			fmt.Fprintf(fo, "\t%.2f", Soldy[i]/1000.)
   159  		} else {
   160  			fmt.Fprintf(fo, "\t%.1f", Soldy[i])
   161  		}
   162  	}
   163  	fmt.Fprintf(fo, "\n")
   164  }
   165  
   166  var __Wdtprint_ic int
   167  
   168  // 気象データの出力
   169  func Wdtprint(fo io.Writer, title string, Mon, Day int, time float64, Wd *WDAT, Exsfst *EXSFS) {
   170  	var Nexs, i int
   171  	Nexs = len(Exsfst.Exs)
   172  
   173  	if DEBUG {
   174  		fmt.Printf("N=%d\t%d/%d\t%.2f\n", Nexs, Mon, Day, time)
   175  		fmt.Printf("%s;\n %d\n", title, Nexs)
   176  	}
   177  
   178  	// ヘッダー部の出力
   179  	if __Wdtprint_ic == 0 {
   180  		__Wdtprint_ic++
   181  		fmt.Fprintf(fo, "%s;\n %d\n", title, Nexs)
   182  		fmt.Fprintf(fo, "Mon\tDay\tTime\tWd_T\tWd_x\tWd_RH\tWd_Wv\t")
   183  		fmt.Fprintf(fo, "Wd_Wdre\tWd_RN\tWd_Idn\tWd_Isky\tsolh\tsolA\t")
   184  
   185  		for i = 0; i < Nexs; i++ {
   186  			e := Exsfst.Exs[i]
   187  			if DEBUG {
   188  				fmt.Printf("%s[%c]\t", e.Name, e.Typ)
   189  			}
   190  
   191  			fmt.Fprintf(fo, "%s[%c]\t", e.Name, e.Typ)
   192  		}
   193  		fmt.Fprintf(fo, "\n")
   194  	}
   195  
   196  	// 月・日・時刻の出力
   197  	fmt.Fprintf(fo, "%d\t%d\t%.2f\t", Mon, Day, time)
   198  
   199  	// 気象データの出力
   200  	fmt.Fprintf(fo, "%.2f\t%.4f\t%.0f\t%.1f\t%.0f\t%.0f\t%.0f\t%.0f\t%.1f\t%.1f\t",
   201  		Wd.T, Wd.X, Wd.RH, Wd.Wv, Wd.Wdre, Wd.RN, Wd.Idn, Wd.Isky, Wd.Solh, Wd.SolA)
   202  
   203  	// 外表面の全日射・地中温度の出力
   204  	for i = 0; i < Nexs; i++ {
   205  		e := Exsfst.Exs[i]
   206  		if e.Typ != EXSFType_E && e.Typ != EXSFType_e {
   207  			// 一般外表面
   208  			fmt.Fprintf(fo, "%.0f\t", e.Iw) // 全日射
   209  		} else {
   210  			// 地下・地表面
   211  			fmt.Fprintf(fo, "%.1f\t", e.Tearth) // 地中温度
   212  		}
   213  	}
   214  	fmt.Fprintf(fo, "\n")
   215  }
   216  
   217  var __Wdtmprint_ic int
   218  
   219  // 気象データの出力
   220  func Wdtmprint(fo io.Writer, title string, Mon, Day int, Wdm *WDAT, Exs []*EXSF, Solmon []float64) {
   221  	if __Wdtmprint_ic == 0 {
   222  		__Wdtmprint_ic++
   223  		fmt.Fprintf(fo, "%s;\n%d\n", title, len(Exs))
   224  
   225  		fmt.Fprintf(fo, "Mo\tNd\tWd_T\tWd_x\tWd_Wv\tWd_RN\tWd_Idn\tWd_Isky\t")
   226  		for _, e := range Exs {
   227  			fmt.Fprintf(fo, "%s[%c]\t", e.Name, e.Typ)
   228  		}
   229  		fmt.Fprintln(fo)
   230  	}
   231  
   232  	fmt.Fprintf(fo, "%d\t%d\t", Mon, Day)
   233  	fmt.Fprintf(fo, "%.1f\t%.4f\t%.1f\t%.2f\t%.2f\t%4.2f",
   234  		Wdm.T, Wdm.X, Wdm.Wv, Wdm.RN/1000., Wdm.Idn/1000., Wdm.Isky/1000.)
   235  
   236  	for i, e := range Exs {
   237  		if e.Typ != 'E' && e.Typ != 'e' {
   238  			fmt.Fprintf(fo, "\t%.2f", Solmon[i]/1000.)
   239  		} else {
   240  			fmt.Fprintf(fo, "\t%.1f", Solmon[i])
   241  		}
   242  	}
   243  	fmt.Fprintln(fo)
   244  }