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  }