github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/eesyseqv.go (about) 1 package eeslism 2 3 import ( 4 "fmt" 5 ) 6 7 // システム方程式の作成およびシステム変数の計算 8 func Syseqv(_Elout []*ELOUT, Syseq *SYSEQ) { 9 var eleq, elosv []*ELOUT 10 var sysmcf, syscv, Y []float64 11 var i, m, n, Nsv int 12 var mrk []rune 13 14 Syseq.A = ' ' 15 eleq = nil 16 elosv = nil 17 sysmcf = nil 18 syscv = nil 19 Y = nil 20 21 Nelout := len(_Elout) 22 23 if Nelout > 0 { 24 eleq = make([]*ELOUT, Nelout) 25 26 for i = 0; i < Nelout; i++ { 27 eleq[i] = nil 28 } 29 } 30 31 if Nelout > 0 { 32 elosv = make([]*ELOUT, Nelout) 33 34 for i = 0; i < Nelout; i++ { 35 elosv[i] = nil 36 } 37 } 38 39 mrk = make([]rune, Nelout) 40 41 for i, Elout := range _Elout { 42 43 if DEBUG { 44 fmt.Printf("xxx syseqv Eo name=%s control=%c sysld=%c i=%d MAX=%d\n", 45 Elout.Cmp.Name, Elout.Control, Elout.Sysld, i, Nelout) 46 } 47 48 if dayprn && Ferr != nil { 49 fmt.Fprintf(Ferr, "xxx syseqv Eo name=%s control=%c sysld=%c i=%d MAX=%d\n", 50 Elout.Cmp.Name, Elout.Control, Elout.Sysld, i, Nelout) 51 } 52 53 if Elout.Control != LOAD_SW && 54 Elout.Control != FLWIN_SW && 55 Elout.Control != BATCH_SW { 56 Elout.Sv = -1 57 Elout.Sysv = 0.0 58 } 59 60 if Elout.Control == ON_SW { 61 if DEBUG { 62 fmt.Printf("ON_SW = [i=%d m=%d n=%d] %s G=%f\n", i, m, n, Elout.Cmp.Name, Elout.G) 63 } 64 65 eleq[m] = Elout 66 elosv[n] = Elout 67 mrk[n] = SYSV_EQV 68 Elout.Sv = n 69 Elout.Sld = -1 70 n++ 71 72 if Elout.Sysld == 'y' { 73 elosv[n] = Elout 74 mrk[n] = LOAD_EQV 75 Elout.Sld = n 76 n++ 77 } 78 m++ 79 } else if Elout.Control == LOAD_SW && Elout.Sysld != 'y' { 80 eleq[m] = Elout 81 Elout.Sv = -1 82 Elout.Sld = -1 83 m++ 84 } 85 } 86 Nsv = n 87 88 sysmcf = make([]float64, Nsv*Nsv) 89 syscv = make([]float64, Nsv) 90 Y = make([]float64, Nsv) 91 92 for i = 0; i < Nsv; i++ { 93 elout := eleq[i] 94 a := sysmcf[Nsv*i : Nsv*i+Nsv] 95 b := syscv[i : i+1] 96 97 if DEBUG { 98 fmt.Printf("xxx syseqv Elout=%d %s Ni=%d cfo=%f\n", 99 i, elout.Cmp.Name, elout.Ni, elout.Coeffo) 100 } 101 102 if dayprn && Ferr != nil { 103 fmt.Fprintf(Ferr, "xxx syseqv Elout=%d %s Ni=%d cfo=%f\n", 104 i, elout.Cmp.Name, elout.Ni, elout.Coeffo) 105 } 106 107 c := a 108 matinit(c, Nsv) 109 110 b[0] = elout.Co 111 112 if n = elout.Sv; n >= 0 { 113 a[n] = elout.Coeffo 114 if nn := elout.Sld; nn >= 0 { 115 a[nn] = -1.0 116 } 117 } else { 118 b[0] -= elout.Coeffo * elout.Sysv 119 } 120 121 for j := 0; j < elout.Ni; j++ { 122 elin := elout.Elins[j] 123 cfin := elout.Coeffin[j] 124 elov := elin.Upv 125 126 if elov != nil { 127 if DEBUG { 128 fmt.Printf("xxx syseqv Elout=%d %s in=%d elov=%s control=%c sys=%f\n", 129 i, elout.Cmp.Name, j, 130 elov.Cmp.Name, elov.Control, elov.Sysv) 131 } 132 133 if dayprn && Ferr != nil { 134 fmt.Fprintf(Ferr, "xxx syseqv Elout=%d %s in=%d elov=%s control=%c sys=%f\n", 135 i, elout.Cmp.Name, j, 136 elov.Cmp.Name, elov.Control, elov.Sysv) 137 } 138 139 if elov.Control == ON_SW { 140 n = elin.Upv.Sv 141 a[n] += cfin 142 } else if elov.Control == LOAD_SW || 143 elov.Control == FLWIN_SW || 144 elov.Control == BATCH_SW { 145 if DEBUG { 146 fmt.Printf("xxx syseqv elov=%s control=%c sys=%f\n", 147 elov.Cmp.Name, elov.Control, elov.Sysv) 148 } 149 150 if dayprn && Ferr != nil { 151 fmt.Fprintf(Ferr, "xxx syseqv elov=%s control=%c sys=%f\n", 152 elov.Cmp.Name, elov.Control, elov.Sysv) 153 } 154 155 b[0] -= cfin * elov.Sysv 156 } 157 } 158 } 159 if DEBUG { 160 fmt.Printf("xx syseqv i=%d b=%f\n", i, b[0]) 161 } 162 } 163 164 /********* 連立方程式 ***********/ 165 166 if DEBUG { 167 Seqprint("%.6g\t", Nsv, sysmcf, "%.6g", syscv) 168 169 //for ( i = 0; i < Nsv; i++ ) 170 // fmt.Printf ( "%g\n", sysmcf[i+Nsv*7] ) ; 171 } 172 173 if Nsv > 0 { 174 /********************** 175 matprint("%6.2f ", Nsv, sysmcf) ; 176 /**********************/ 177 178 Matinv(sysmcf, Nsv, Nsv, "<Syseqv>") 179 Matmalv(sysmcf, syscv, Nsv, Nsv, Y) 180 } 181 182 for i = 0; i < Nsv; i++ { 183 if mrk[i] == SYSV_EQV { 184 elosv[i].Sysv = Y[i] 185 } else if mrk[i] == LOAD_EQV { 186 elosv[i].Load = Y[i] 187 } 188 if DEBUG { 189 fmt.Printf("%d: %s = %f\n", i, elosv[i].Cmp.Name, Y[i]) 190 } 191 } 192 193 if DEBUG { 194 for i = 0; i < Nsv; i++ { 195 fmt.Printf("Y[%d]=%.5f mrk=%c Elo=%s\n", 196 i, Y[i], mrk[i], elosv[i].Cmp.Name) 197 } 198 fmt.Printf("\n") 199 } 200 201 if dayprn && Ferr != nil { 202 for i = 0; i < Nsv; i++ { 203 fmt.Fprintf(Ferr, "Y[%d]=%6.3f mrk=%c Elo=%s\n", 204 i, Y[i], mrk[i], elosv[i].Cmp.Name) 205 } 206 fmt.Fprintf(Ferr, "\n") 207 } 208 }