github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/eesysupv_s.go (about) 1 package eeslism 2 3 import ( 4 "fmt" 5 ) 6 7 // Upo, Upv の書き換え 8 // NOTE: おそらく、 Upoは経路要素における上流の要素を指す。 9 // Upvは計算時に参照すべき上流要素を指す。多くの場合は Upo == Upv だと考えらえる。 10 func Sysupv(Mpath []*MPATH, Rmvls *RMVLS) { 11 var Rdpnl *RDPNL 12 var Nrdpnl int 13 var up *ELOUT 14 15 for m, mpath := range Mpath { 16 /* 停止要素のシステム方程式からの除外 */ 17 18 if DEBUG { 19 fmt.Printf("\n\n<< Sysupv >> m=%d MAX=%d\n", m, len(Mpath)) 20 } 21 22 for i, plist := range mpath.Plist { 23 24 if DEBUG { 25 fmt.Printf("\n<<Sysupv> i=%d iMAX=%d\n", i, len(mpath.Plist)) 26 fmt.Printf("OFF_SW=%c Plist->control=%c\n", OFF_SW, plist.Control) 27 } 28 if dayprn && Ferr != nil { 29 fmt.Fprintf(Ferr, "\n<<Sysupv> i=%d iMAX=%d\n", i, len(mpath.Plist)) 30 fmt.Fprintf(Ferr, "OFF_SW=%c Plist->control=%c\n", OFF_SW, plist.Control) 31 } 32 33 if plist.Control != OFF_SW { 34 // 末端経路が停止してなければ: 35 // 36 37 // 末端経路が分岐・合流の場合は、最初の要素を無視する 38 var pelmStartIdx int 39 if plist.Type == DIVERG_LPTP || plist.Type == CONVRG_LPTP { 40 pelmStartIdx = 1 41 } else { 42 pelmStartIdx = 0 43 } 44 45 // Testcode 46 pelm := plist.Pelm[pelmStartIdx] 47 if pelm.Out != nil && pelm.Out.Control != FLWIN_SW && pelm.In != nil { 48 up = pelm.In.Upo 49 } 50 plist.Plmvb = nil 51 52 // 末端経路内の要素のループ 53 for j := pelmStartIdx; j < len(plist.Pelm); j++ { 54 pelm = plist.Pelm[j] 55 if DEBUG { 56 fmt.Printf("\n<< sysupv >> pelm=%d %s MAX=%d\n", j, pelm.Cmp.Name, len(plist.Pelm)) 57 if pelm.Out != nil { 58 fmt.Printf("<< Sysupv >> Pelm->out->control=%c\n", pelm.Out.Control) 59 } 60 } 61 if dayprn && Ferr != nil { 62 fmt.Fprintf(Ferr, "\n<< sysupv >> pelm=%d %s MAX=%d\n", j, pelm.Cmp.Name, len(plist.Pelm)) 63 if pelm.Out != nil { 64 fmt.Fprintf(Ferr, "<< Sysupv >> Pelm->out->control=%c\n", pelm.Out.Control) 65 } 66 } 67 if pelm.Out == nil { 68 pelm.In.Upv = up 69 if plist.Plmvb == nil { 70 // 末端経路内で出口がない要素のうち経路内で最上流のもの 71 plist.Plmvb = pelm 72 } 73 } else if pelm.Out.Control != OFF_SW { 74 if DEBUG { 75 fmt.Printf("<<<<<< Pelm->out->control=%c FLWIN_SW=%c\n", pelm.Out.Control, FLWIN_SW) 76 } 77 if dayprn && Ferr != nil { 78 fmt.Fprintf(Ferr, "<<<<<< Pelm->out->control=%c FLWIN_SW=%c\n", pelm.Out.Control, FLWIN_SW) 79 } 80 if pelm.Out.Control == FLWIN_SW { 81 up = pelm.Out 82 } else { 83 if DEBUG { 84 fmt.Printf("up->cmp->name=%s\n", up.Cmp.Name) 85 } 86 87 if dayprn && Ferr != nil { 88 fmt.Fprintf(Ferr, "up->cmp->name=%s\n", up.Cmp.Name) 89 } 90 91 // Testcode 92 if pelm.In != nil { 93 pelm.In.Upv = up 94 } 95 96 if DEBUG { 97 fmt.Printf("<< Sysupv >> pelm=%s up=%s\n", pelm.Cmp.Name, pelm.In.Upv.Cmp.Name) 98 } 99 100 up = pelm.Out 101 if plist.Plmvb == nil { 102 plist.Plmvb = pelm 103 } 104 } 105 } else if plist.Batch && j == 0 { 106 up = pelm.Out 107 } else { 108 if DEBUG { 109 fmt.Printf("<Sysupv> 1\n") 110 } 111 if pelm.In != nil { 112 pelm.In.Upv = nil 113 } 114 if DEBUG { 115 fmt.Printf("<Sysupv> 2\n") 116 } 117 } 118 } 119 120 if mpath.Type == CIR_PTYP { 121 // 合流経路の場合: 122 // ex) `> G4 G5 >` の場合、G5が停止していれば、 123 124 ptermel := plist.Pelm[len(plist.Pelm)-1] // 末端要素 125 if ptermel.Out.Control == OFF_SW { 126 ptermel = plist.Plmvb 127 ptermel.In.Upv = up 128 } 129 } 130 } else { 131 // 末端経路が停止している場合: 入力無し 132 // 133 for _, Pelm := range plist.Pelm { 134 if Pelm.In != nil { 135 Pelm.In.Upv = nil 136 } 137 } 138 } 139 } 140 141 /* 分岐要素のシステム方程式からの除外 */ 142 143 for i, Plist := range mpath.Plist { 144 if DEBUG { 145 fmt.Printf(" Sysupv BRC i=%d\n", i) 146 } 147 if Plist.Type == DIVERG_LPTP { 148 Pelm := Plist.Pelm[0] 149 Pelm.Out.Control = OFF_SW 150 up := Plist.Pelm[0].Cmp.Elins[0].Upv 151 if Pelm = Plist.Plmvb; Pelm != nil { 152 Pelm.In.Upv = up 153 } 154 } 155 } 156 157 } 158 if SIMUL_BUILDG { 159 /*********************************/ 160 /* 放射パネル設置室についてのパネル上流要素 */ 161 162 for i := range Rmvls.Room { 163 room := Rmvls.Room[i] 164 for j := 0; j < room.Nrp; j++ { 165 rmpnl := room.rmpnl[j] 166 elin := room.cmp.Elins[room.Nachr+room.Ntr+j] 167 elp := rmpnl.pnl.cmp.Elins[0] 168 elin.Upv = elp.Upv 169 } 170 } 171 172 for i := 0; i < Nrdpnl; i++ { 173 Rdpnl = Rmvls.Rdpnl[i] 174 175 for j := 0; j < Rdpnl.MC; j++ { 176 rm := Rdpnl.rm[j] 177 rmpnl := rm.rmpnl[j] 178 elin := Rdpnl.cmp.Elins[Rdpnl.elinpnl[j]] 179 for jj := 0; jj < Rdpnl.Nrp[j]; jj++ { 180 elin.Upv = rmpnl.pnl.cmp.Elins[0].Upv 181 } 182 } 183 } 184 185 if DEBUG { 186 fmt.Printf(" Sysupv end ========\n") 187 } 188 } 189 }