github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/eegndata.go (about) 1 package eeslism 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 "strconv" 8 "strings" 9 ) 10 11 /* ファイル、計算期間、出力日の入力 */ 12 13 // FILE 14 // -skyrd 15 // -intgtsupw 16 // -w 17 // -out 18 // RUN 19 // (mm/dd) => dayys 助走期間 20 // mm/dd-mm/dd => days, daye, dayxs 計算開始 計算終了 21 // Tinit => Tini 初期温度 (15[deg]) 22 // dTime => dtm 計算時間間隔 [s](指定しないとき3600 [s]となる) 23 // Stime => sttmm 計算開始時刻 24 // MaxIterate => MaxIterate 25 // RepeatDays => daye 周期定常計算の繰り返し日数の取得 26 // -periodic => perio, days, dayxs 27 // PRINT 28 // mm/dd-mm/ddまたはmm/dd => pday 29 // *wd => wdpri 30 // *rev => revpri 31 // *pmv => pmvpri 32 // *helm => helmkey 33 // *log => グローバル変数 Ferr の設定 34 // *debug => グローバル変数 DEBUGの設定 35 func Gdata(section *EeTokens, File string, wfname *string, 36 ofname *string, dtm *int, sttmm *int, dayxs *int, days *int, daye *int, 37 Tini *float64, pday []int, wdpri *int, revpri *int, pmvpri *int, 38 helmkey *rune, MaxIterate *int, Daytm *DAYTM, Wd *WDAT, perio *rune) { 39 var s, ss, ce, dd string 40 var st int 41 var Ms, Ds, Mxs, Dxs, Me, De int 42 var logprn int = 0 43 44 *dtm = 3600 45 *sttmm = -1 46 47 *wfname = "" 48 49 //E := fmt.Sprintf(ERRFMT, dsn) 50 51 *ofname = File 52 53 for i := 1; i < 366; i++ { 54 pday[i] = 0 55 } 56 57 if st = strings.LastIndex(*ofname, "."); st != -1 { 58 *ofname = (*ofname)[:st] 59 } 60 61 for section.IsEnd() == false { 62 line := section.GetLogicalLine() 63 64 if line[0] == "FILE" { 65 for _, s := range line[1:] { 66 if s == "-skyrd" { // 気象データは夜間放射量で定義されている 67 Wd.RNtype = 'R' 68 } else if s == "-intgtsupw" { // 給水温度を補間する 69 Wd.Intgtsupw = 'Y' 70 } else { 71 if st := strings.IndexRune(s, '='); st != -1 { 72 s1, s2 := s[:st], s[st+1:] 73 74 var err error 75 if s1 == "w" { 76 _, err = fmt.Sscanf(s2, "%s", &dd) 77 if err != nil { 78 panic(err) 79 } 80 *wfname = dd 81 } else if s1 == "out" { 82 _, err = fmt.Sscanf(s2, "%s", &ss) 83 if err != nil { 84 panic(err) 85 } 86 87 //NOTE: 何をやりたいのか不明(UDA) 88 const FLDELIM = "/" 89 if strings.LastIndex(ss, FLDELIM) == -1 { 90 *ofname = File 91 92 if st := strings.LastIndex(*ofname, FLDELIM); st != -1 { 93 s2 = ss 94 } 95 } else { 96 *ofname = ss 97 } 98 } else { 99 Eprint("<Gdata>", s) 100 } 101 } 102 } 103 104 if ce != "" { 105 break 106 } 107 } 108 } else if line[0] == "RUN" { 109 *Tini = 15.0 110 111 var err error 112 for i := 1; i < len(line); i++ { 113 s = line[i] 114 if strings.HasPrefix(s, "Tinit") { 115 kv := strings.SplitN(s, "=", 2) 116 *Tini, err = strconv.ParseFloat(kv[1], 64) 117 if err != nil { 118 panic(err) 119 } 120 } else if st := strings.IndexRune(s, '='); st != -1 { 121 key := s[:st] 122 value := s[st+1:] 123 124 if key == "dTime" { 125 // For `dTime=3600` 126 *dtm, err = strconv.Atoi(value) 127 if err != nil { 128 panic(err) 129 } 130 } else if key == "Stime" { 131 // For `Stime=0` 132 *sttmm, err = strconv.Atoi(value) 133 if err != nil { 134 panic(err) 135 } 136 *sttmm *= 100 137 } else if key == "MaxIterate" { 138 // For `MaxIterate=100` 139 *MaxIterate, err = strconv.Atoi(value) 140 if err != nil { 141 panic(err) 142 } 143 } else if key == "RepeatDays" { // 周期定常計算の繰り返し日数の取得 144 // For `RepeatDays=365` 145 var Ndays int 146 Ndays, err = strconv.Atoi(value) 147 if err != nil { 148 panic(err) 149 } 150 151 if *perio != 'y' { 152 fmt.Println("周期定常計算の指定がされていません") 153 } 154 155 *daye = *days + Ndays - 1 156 } else { 157 panic(s) 158 } 159 } else if s[0] == '(' { 160 // For `(1/1)` 161 _, err = fmt.Sscanf(s, "(%d/%d)", &Mxs, &Dxs) 162 if err != nil { 163 panic(err) 164 } 165 *dayxs = FNNday(Mxs, Dxs) // 助走計算開始日 166 } else if s == "-periodic" { // 周期定常計算への対応 167 // For `-periodic 1/1` 168 *perio = 'y' // 周期定常計算フラグの変更 169 s = line[i+1] // 計算する日付の読み込み 170 i++ 171 _, err = fmt.Sscanf(s, "%d/%d", &Ms, &Ds) // 計算する日付の取得 172 if err != nil { 173 panic(err) 174 } 175 *days = FNNday(Ms, Ds) 176 *dayxs = *days // 助走計算開始日 177 Daytm.Mon = Ms 178 Daytm.Day = Ds 179 } else if strings.IndexRune(s, '-') != -1 { 180 // For `1/1-12/31` 181 _, err = fmt.Sscanf(s, "%d/%d-%d/%d", &Ms, &Ds, &Me, &De) 182 if err != nil { 183 panic(err) 184 } 185 *days = FNNday(Ms, Ds) 186 *daye = FNNday(Me, De) 187 188 if Mxs == 0 { 189 *dayxs = *days // 助走計算開始日 190 Daytm.Mon = Ms 191 Daytm.Day = Ds 192 } else { 193 Daytm.Mon = Mxs 194 Daytm.Day = Dxs 195 } 196 } else { 197 Eprint("<Gdata>", s) 198 } 199 200 if ce != "" { 201 break 202 } 203 } 204 fmt.Printf("<<Gdata>> dtm=%d\n", *dtm) 205 } else if line[0] == "PRINT" { 206 for _, s := range line[1:] { 207 switch s { 208 case "*wd": 209 *wdpri = 1 210 case "*rev": 211 *revpri = 1 212 case "*pmv": 213 *pmvpri = 1 214 case "*helm": 215 *helmkey = 'y' 216 case "*log": 217 logprn = 1 218 case "*debug": 219 DEBUG = true 220 default: 221 if strings.IndexRune(s, '-') == -1 { 222 var Ms, Ds int 223 fmt.Sscanf(s, "%d/%d", &Ms, &Ds) 224 pday[FNNday(Ms, Ds)] = 1 225 } else { 226 var Ms, Ds, Me, De, ns, ne, n int 227 fmt.Sscanf(s, "%d/%d-%d/%d", &Ms, &Ds, &Me, &De) 228 ns = FNNday(Ms, Ds) 229 n = FNNday(Me, De) 230 if ns < n { 231 ne = n 232 } else { 233 ne = n + 365 234 } 235 for n = ns; n <= ne; n++ { 236 if n > 365 { 237 pday[n-365] = 1 238 } else { 239 pday[n] = 1 240 } 241 } 242 } 243 } 244 } 245 } else if line[0] == "*" { 246 break 247 } else { 248 Eprint("<Gdata>", s) 249 } 250 } 251 252 // Concatenate ".log" to the end of *ofname and copy to s 253 s = filepath.Join(*ofname + ".log") 254 255 // Open the file for writing 256 var err error 257 Ferr, err = os.Create(s) 258 if err != nil { 259 // Handle error 260 } 261 262 if logprn == 0 { 263 // Close the file and set ferr to nil if logprn is 0 264 Ferr.Close() 265 Ferr = nil 266 } 267 }