github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/eevcdat.go (about) 1 package eeslism 2 3 import ( 4 "errors" 5 "fmt" 6 "io" 7 "os" 8 "strings" 9 ) 10 11 /* 境界条件・負荷仮想機器の要素機器データ入力ファイル設定 */ 12 13 func Vcfdata(fi *EeTokens, simcon *SIMCONTL) { 14 var ( 15 s string 16 errFmt = "(vcfileint)" 17 ) 18 19 N := VCFcount(fi) 20 if N > 0 { 21 simcon.Vcfile = make([]VCFILE, N) 22 for i := range simcon.Vcfile { 23 simcon.Vcfile[i] = VCFILE{ 24 Name: "", 25 Fname: "", 26 Ad: -999, 27 Ic: 0, 28 Tlist: nil, 29 Fi: nil, 30 Estl: ESTL{ 31 Flid: "", 32 Title: "", 33 Wdatfile: "", 34 Timeid: "", 35 Wdloc: "", 36 Catnm: nil, 37 Ntimeid: 0, 38 Ntime: 0, 39 dtm: 0, 40 Nunit: 0, 41 Nrqlist: 0, 42 Nvreq: 0, 43 Npreq: 0, 44 Npprd: 0, 45 Ndata: 0, 46 Rq: nil, 47 Prq: nil, 48 Vreq: []rune{}, 49 Unit: []string{}, 50 }, 51 } 52 } 53 } 54 55 vcIdx := 0 56 for fi.IsEnd() == false { 57 s = fi.GetToken() 58 if s == "*" { 59 break 60 } 61 62 vcfile := &simcon.Vcfile[vcIdx] 63 64 vcfile.Name = s 65 for fi.IsEnd() == false { 66 s = fi.GetToken() 67 if s == ";" { 68 break 69 } 70 switch s { 71 case "-f": 72 vcfile.Fname = fi.GetToken() 73 default: 74 e := fmt.Sprintf("Vcfile=%s %s %s", vcfile.Name, errFmt, s) 75 Eprint("<Vcfdata>", e) 76 } 77 } 78 vcIdx++ 79 } 80 81 simcon.Nvcfile = vcIdx 82 83 for i := 0; i < simcon.Nvcfile; i++ { 84 vcfile := &simcon.Vcfile[i] 85 86 if f, err := os.Open(vcfile.Fname); err != nil { 87 Eprint("<Vcfdata>", vcfile.Fname) 88 os.Exit(EXIT_VCFILE) 89 } else { 90 vcfile.Fi = f 91 } 92 93 esondat(vcfile.Fi, &vcfile.Estl) 94 N := vcfile.Estl.Ndata 95 if N > 0 { 96 vcfile.Tlist = make([]TLIST, N) 97 for j := range vcfile.Tlist { 98 vcfile.Tlist[j] = TLIST{ 99 Cname: "", 100 Name: "", 101 Id: "", 102 Unit: "", 103 Fval: nil, 104 Fstat: nil, 105 Ival: nil, 106 Istat: nil, 107 Cval: nil, 108 Cstat: nil, 109 Fmt: "", 110 Pair: nil, 111 } 112 } 113 } 114 115 esoint(vcfile.Fi, "esoint", 1, &vcfile.Estl, vcfile.Tlist) 116 vcfile.Ad, _ = vcfile.Fi.Seek(0, io.SeekCurrent) 117 118 if simcon.Wdtype == 'E' { 119 simcon.Wfname = vcfile.Fname 120 wdflinit(simcon, &vcfile.Estl, vcfile.Tlist) 121 } 122 } 123 } 124 125 /***** VCFILEの定義数を数える ******/ 126 127 func VCFcount(fi *EeTokens) int { 128 var N int 129 ad := fi.GetPos() 130 131 for fi.IsEnd() == false { 132 s := fi.GetToken() 133 if s[0] != '*' { 134 words := strings.Fields(s) 135 if len(words) > 0 && words[0] == "-f" { 136 N++ 137 } 138 } 139 } 140 141 fi.RestorePos(ad) 142 143 return N 144 } 145 146 /* -------------------------------------------------- */ 147 148 /* 境界条件・負荷仮想機器の要素機器データとしての入力処理 */ 149 150 func flindat(Flin *FLIN) { 151 var s string 152 n := 0 153 //Err := fmt.Sprintf(ERRFMT, "(flindat)") 154 ss := Flin.Cmp.Tparm 155 156 for _, err := fmt.Sscanf(ss, "%s", &s); err == nil && strings.IndexRune(s, '*') == -1; _, err = fmt.Sscanf(ss, "%s", &s) { 157 ss = ss[len(s):] 158 for len(ss) > 0 && ss[0] == ' ' { 159 ss = ss[1:] 160 } 161 162 if st := strings.IndexRune(s, '='); st != -1 { 163 name, value := string(s[:st]), string(s[st+1:]) 164 if name == "t" { 165 Flin.Namet = value 166 n++ 167 } else if name == "x" { 168 Flin.Namex = value 169 n++ 170 } 171 } else { 172 Eprint("<flindat>", string(s)) 173 os.Exit(EXIT_FLIN) 174 } 175 } 176 177 if n == 1 { 178 Flin.Awtype = 'W' 179 Flin.Cmp.Idi = []ELIOType{ELIO_W} 180 Flin.Cmp.Ido = []ELIOType{ELIO_W} 181 Flin.Cmp.Airpathcpy = false 182 } else { 183 Flin.Awtype = 'A' 184 Flin.Cmp.Idi = []ELIOType{ELIO_t, ELIO_x} 185 Flin.Cmp.Ido = []ELIOType{ELIO_t, ELIO_x} 186 Flin.Cmp.Airpathcpy = true 187 } 188 189 Flin.Cmp.Nin = n 190 Flin.Cmp.Nout = n 191 } 192 193 /* -------------------------------------------------- */ 194 195 /* 境界条件・負荷仮想機器の要素機器データのポインター設定 */ 196 197 func Flinint(Flin []*FLIN, Simc *SIMCONTL, Compnt []*COMPNT, Wd *WDAT) { 198 for _, flin := range Flin { 199 // fmt.Printf("<<Flinint>> i=%d namet=%s\n", i, Flin[i].namet) 200 201 flin.Vart = envptr(flin.Namet, Simc, Compnt, Wd, nil) 202 if flin.Awtype == 'A' { 203 flin.Varx = envptr(flin.Namex, Simc, Compnt, Wd, nil) 204 } 205 } 206 } 207 208 /* -------------------------------------------------- */ 209 210 /* 境界条件・負荷仮想機器のファイル入力データのポインター */ 211 212 func vcfptr(key []string, Simc *SIMCONTL) (VPTR, error) { 213 var Ndata int = 1 214 var Tlist *TLIST 215 216 for j := 0; j < Simc.Nvcfile; j++ { 217 Vcfile := &Simc.Vcfile[j] 218 219 if key[0] == Vcfile.Name { 220 Ndata = Vcfile.Estl.Ndata 221 for k := 0; k < Ndata; k++ { 222 Tlist = &Vcfile.Tlist[k] 223 if key[1] == Tlist.Name && key[2] == Tlist.Id { 224 return VPTR{ 225 Ptr: Tlist.Fval, 226 Type: VAL_CTYPE, 227 }, nil 228 } 229 } 230 } 231 } 232 233 return VPTR{}, errors.New("vcfptr error") 234 } 235 236 /* -------------------------------------------------- */ 237 238 /* 境界条件・負荷仮想機器のデータファイル入力 */ 239 240 var __Vcfinput_Mon, __Vcfinput_Day, __Vcfinput_Time int 241 242 func Vcfinput(Daytm *DAYTM, Nvcfile int, Vcfile []VCFILE, perio rune) { 243 var Tmdt TMDT 244 TMDTinit(&Tmdt) 245 246 var idend int 247 for i := 0; i < Nvcfile; i++ { 248 iderr := 0 249 vcfile := &Vcfile[i] 250 251 if vcfile.Estl.Tid == 'M' && __Vcfinput_Mon != Daytm.Mon { 252 idend = tmdata(vcfile, &Tmdt, Daytm, perio) 253 if idend != 0 { 254 if Daytm.Mon == Tmdt.Mon { 255 esdatgt(vcfile.Fi, 0, vcfile.Estl.Ndata, vcfile.Tlist) 256 } else { 257 iderr = 1 258 } 259 } 260 } else if vcfile.Estl.Tid == 'd' && __Vcfinput_Day != Daytm.Day { 261 idend = tmdata(vcfile, &Tmdt, Daytm, perio) 262 if idend != 0 { 263 if Daytm.Day == Tmdt.Day { 264 esdatgt(vcfile.Fi, 0, vcfile.Estl.Ndata, vcfile.Tlist) 265 } else { 266 iderr = 1 267 } 268 } 269 } else if vcfile.Estl.Tid == 'h' && __Vcfinput_Time != Daytm.Ttmm { 270 idend = tmdata(vcfile, &Tmdt, Daytm, perio) 271 if idend != 0 { 272 if Daytm.Mon == Tmdt.Mon && Daytm.Day == Tmdt.Day && Daytm.Ttmm == Tmdt.Time { 273 esdatgt(vcfile.Fi, 0, vcfile.Estl.Ndata, vcfile.Tlist) 274 } else { 275 iderr = 1 276 } 277 } 278 } 279 if idend == 0 { 280 E := fmt.Sprintf("Vcfinput file-end: %s\n", vcfile.Fname) 281 Eprint("<Vcfinput>", E) 282 } 283 284 if iderr != 0 { 285 E := fmt.Sprintf("Vcfinput xxx file=%s prog_MM/DD/TM=%d/%d/%d file_MM/DD/TM=%d/%d/%d\n", 286 vcfile.Fname, Daytm.Mon, Daytm.Day, Daytm.Ttmm, Tmdt.Mon, Tmdt.Day, Tmdt.Time) 287 Eprint("<Vcfinput>", E) 288 } 289 } 290 291 __Vcfinput_Mon, __Vcfinput_Day, __Vcfinput_Time = Daytm.Mon, Daytm.Day, Daytm.Ttmm 292 } 293 294 /********************************************************************/ 295 296 func Flinprt(Fl []*FLIN) { 297 if DEBUG { 298 for i, f := range Fl { 299 fmt.Printf("<< Flinprt >> Flin i=%d %s %s = %.2g\n", i, f.Name, f.Namet, *f.Vart) 300 } 301 } 302 for i, f := range Fl { 303 if Ferr != nil { 304 fmt.Fprintf(Ferr, "<< Flinprt >> Flin i=%d %s %s = %.2g\n", i, f.Name, f.Namet, *f.Vart) 305 } 306 } 307 if Ferr != nil { 308 fmt.Fprintf(Ferr, "\n\n") 309 } 310 }