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 }