EMlab-generation Documentation  1.0
Documentation of the EMLab-Generation model.
StrategicReserveOperatorRole.java
1 package emlab.gen.role.capacitymechanisms;
2 
3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.transaction.annotation.Transactional;
5 
6 import agentspring.role.AbstractRole;
7 import agentspring.role.Role;
8 import agentspring.role.RoleComponent;
21 
27 @RoleComponent
28 public class StrategicReserveOperatorRole extends AbstractRole<StrategicReserveOperator> implements Role<StrategicReserveOperator>{
29 
30  @Autowired
31  Reps reps;
32 
33  @Autowired
34  SegmentLoadRepository segmentLoadRepository;
35 
36  @Autowired
37  MarketRepository marketRepository;
38 
39  @Autowired
40  BidRepository bidRepository;
41 
42  @Autowired
43  PowerPlantDispatchPlanRepository plantDispatchPlanRepository;
44 
45  @Autowired
46  ZoneRepository zoneRepository;
47 
48  //private Segment currentSegment;
49 
50  @Override
51  @Transactional
52  public void act(StrategicReserveOperator strategicReserveOperator) {
53 
54  // Insert a loop for zone so that strategic reserve can be turned on and off for certain zones
55  Zone curZone = strategicReserveOperator.getZone();
56  //logger.warn("is SR Present " + curZone.getNodeId());
57  //if (curZone.isStrategicReserveOperatorDeployed() == true){
58 
59  //loop to see if this zone has a strategic reserve
60  ElectricitySpotMarket market = marketRepository.findElectricitySpotMarketForZone(curZone);
61  //logger.warn(market.getName());
62  double peakLoadforMarketNOtrend = segmentLoadRepository.peakLoadbyZoneMarketandTime(curZone, market);
63 
64  double trend = market.getDemandGrowthTrend().getValue(getCurrentTick());
65 
66  double peakLoadforMarket = trend*peakLoadforMarketNOtrend;
67 
68 
69 
70  //multiply by whatever factor
71  long segmentCounter=0;
72  // Set volume to be contracted
73 
74  strategicReserveOperator.setReserveVolume(peakLoadforMarket*strategicReserveOperator.getReserveVolumePercentSR());
75  //logger.warn(strategicReserveOperator.setReserveVolume(peakLoadforMarket*strategicReserveOperator.getReserveVolumePercent()));
76 
77  //Find peak supply in the market
78  // double peakCapacityforMarket = reps.powerPlantRepository.calculatePeakCapacityOfOperationalPowerPlantsInMarket(market,
79  // getCurrentTick());
80 
81  // Find difference between peakload and peak capacity
82 
83 
84 
85 
86 
87  // Sets Dispatch price set by operator
88 
89  strategicReserveOperator.getReservePriceSR();
90  //logger.warn(" Reserve Price " + strategicReserveOperator.getReservePriceSR());
91  // Contract Powers Power Plants
92 
93  // Iterable<Bid> sortedListofBidPairs = bidRepository.findOffersDescendingForMarketForTime(currentMarket, getCurrentTick());
94 
95  //finds List of all segments
96  //List<Segment> segments = Utils.asList(reps.segmentRepository.findAll());
97  //for(Segment currentSegment: reps.segmentRepository.findAll()){
98  //segmentCounter += 1;
99  //}
100 
101  // Count all segments in the given market
102 
103  segmentCounter = reps.segmentRepository.count();
104  // find all segments for the given market
105  for(Segment currentSegment: reps.segmentRepository.findAll()){
106  //logger.warn("Current segment is" + currentSegment);
107  //find query for specific market
108 
109 
110  boolean isORMarketCleared = false;
111  double sumofContractedBids=0;
112  double volumetobeContracted = strategicReserveOperator.getReserveVolume();
113  //logger.warn("volumetobeContracted " + volumetobeContracted);
114  double clearingEpsilon = 0.001;
115  double dispatchPrice = strategicReserveOperator.getReservePriceSR();
116  //logger.warn("dispatchPrice " + dispatchPrice);
117  //double reserveMargin = peakCapacityforMarket-peakLoadforMarket;
118 
119  Iterable<PowerPlantDispatchPlan> sortedListofPPDP = plantDispatchPlanRepository
120  .findDescendingSortedPowerPlantDispatchPlansForSegmentForTime(currentSegment, getCurrentTick(),
121  false);
122 
123  for (PowerPlantDispatchPlan currentPPDP: sortedListofPPDP){
124 
125  //logger.warn("Bidding Market " + currentPPDP.getBiddingMarket().getNodeId().intValue());
126  //logger.warn("Bidding Volume" + (currentPPDP.getAmount()));
127  //logger.warn("current Market" + market.getNodeId().intValue());
128  // **use querying for market**
129  if (currentPPDP.getBiddingMarket().getNodeId().intValue() == market.getNodeId().intValue()){
130  //logger.warn("isOR market cleared" + isORMarketCleared);
131 
132  // Check the size of margin
133 
134  /* if (strategicReserveOperator.getReserveVolume()>reserveMargin){
135  if (reserveMargin-currentPPDP.getAmount()>strategicReserveOperator.getReserveVolume()){
136  currentPPDP.setSRstatus(PowerPlantDispatchPlan.NOT_CONTRACTED);
137  reserveMargin -= currentPPDP.getAmount();
138  }
139 
140  }*/
141 
142  if (volumetobeContracted==0){
143  isORMarketCleared=true;
144  }
145  else if (isORMarketCleared == false){
146  //logger.warn("volume of current PPDP " + currentPPDP.getAmount());
147  if (volumetobeContracted-(sumofContractedBids + currentPPDP.getAmount()) >= clearingEpsilon){
148 
149  // check if already not contracted
150  //if(currentPPDP.getSRstatus()!=PowerPlantDispatchPlan.NOT_CONTRACTED){
151  //logger.warn("RemainingVolume" + (volumetobeContracted-(sumofContractedBids + currentPPDP.getAmount())));
152  currentPPDP.setSRstatus(PowerPlantDispatchPlan.CONTRACTED);
153  //logger.warn("SRSTATUS " +currentPPDP.getSRstatus());
154  sumofContractedBids += currentPPDP.getAmount();
155  currentPPDP.setOldPrice(currentPPDP.getPrice());
156  //logger.warn("Old Price" + currentPPDP.getOldPrice());
157  currentPPDP.setPrice(dispatchPrice);
158 
159  //logger.warn("New Price" + currentPPDP.getPrice());
160  // Pays O&M costs to the generated for the contracted capacity
161 
162  double Loan = 0;
163  if ((currentPPDP.getPowerPlant().getLoan().getTotalNumberOfPayments() - currentPPDP
164  .getPowerPlant().getLoan().getNumberOfPaymentsDone()) > 0d) {
165  Loan = (currentPPDP.getPowerPlant().getLoan().getAmountPerPayment());
166  }
167 
168  double money = ((currentPPDP.getPowerPlant().getActualFixedOperatingCost()) + Loan)
169  / segmentCounter;
170  //logger.warn("Annual FOC "+ currentPPDP.getPowerPlant().getTechnology().getFixedOperatingCost());
171  //logger.warn("No of Segments " +segmentCounter);
172  //logger.warn("Money Paid " +money);
173 
174  //logger.warn("SRO "+ strategicReserveOperator.getName() +" CASH Before" +strategicReserveOperator.getCash());
175  //logger.warn("Owner " + currentPPDP.getBidder().getName() + "money Before" +currentPPDP.getBidder().getCash());
176 
177 
178  reps.nonTransactionalCreateRepository.createCashFlow(strategicReserveOperator, currentPPDP.getBidder(), money, CashFlow.STRRESPAYMENT, getCurrentTick(), currentPPDP.getPowerPlant());
179 
180  //logger.warn("SRO's CASH After" +strategicReserveOperator.getCash());
181  //logger.warn("Owner " + currentPPDP.getBidder().getName() + " money After" +currentPPDP.getBidder().getCash());
182  // }
183  }
184 
185  else if (volumetobeContracted-(sumofContractedBids + currentPPDP.getAmount()) < clearingEpsilon){
186 
187  // if(currentPPDP.getSRstatus()!=PowerPlantDispatchPlan.NOT_CONTRACTED){
188 
189  currentPPDP.setSRstatus(PowerPlantDispatchPlan.PARTLY_CONTRACTED);
190  //logger.warn("SRSTATUS " +currentPPDP.getSRstatus());
191  sumofContractedBids += currentPPDP.getAmount();
192  currentPPDP.setOldPrice(currentPPDP.getPrice());
193  //logger.warn("Old Price" + currentPPDP.getOldPrice());
194  currentPPDP.setPrice(dispatchPrice);
195 
196  //logger.warn("New Price" + currentPPDP.getPrice());
197  isORMarketCleared = true;
198  // Pays O&M costs and outstanding loans to the
199  // generated for the contracted capacity
200  double Loan = 0;
201  if ((currentPPDP.getPowerPlant().getLoan().getTotalNumberOfPayments() - currentPPDP
202  .getPowerPlant().getLoan().getNumberOfPaymentsDone()) > 0d) {
203  Loan = (currentPPDP.getPowerPlant().getLoan().getAmountPerPayment());
204  }
205 
206 
207  double money = ((currentPPDP.getPowerPlant().getActualFixedOperatingCost()) + Loan)
208  / segmentCounter;
209  //logger.warn("Annual FOC "+ currentPPDP.getPowerPlant().getTechnology().getFixedOperatingCost());
210  //logger.warn("No of Segments " +segmentCounter);
211  //logger.warn("Money Paid " +money);
212 
213  //logger.warn("SRO "+ strategicReserveOperator.getName() +" CASH Before" +strategicReserveOperator.getCash());
214  //logger.warn("Owner " + currentPPDP.getBidder().getName() + "money Before" +currentPPDP.getBidder().getCash());
215 
216  reps.nonTransactionalCreateRepository.createCashFlow(strategicReserveOperator, currentPPDP.getBidder(), money, CashFlow.STRRESPAYMENT, getCurrentTick(), currentPPDP.getPowerPlant());
217 
218  //logger.warn("SRO's CASH After" +strategicReserveOperator.getCash());
219  //logger.warn("Owner " + currentPPDP.getBidder().getName() + " money After" +currentPPDP.getBidder().getCash());
220  //}
221  }
222 
223  }
224  else {
225  currentPPDP.setSRstatus(PowerPlantDispatchPlan.NOT_CONTRACTED);
226 
227  }
228  //logger.warn(volumetobeContracted-sumofContractedBids);
229  if (volumetobeContracted-sumofContractedBids < clearingEpsilon){
230  //logger.warn("is market clear" + isORMarketCleared);
231  isORMarketCleared = true;
232  }
233  //logger.warn(" iS OR CLEARED "+isORMarketCleared);
234  //logger.warn("Price is "+currentPPDP.getPrice());
235  currentPPDP.persist();
236  }
237  }
238  }
239  //logger.warn("cash of SR " +strategicReserveOperator.getCash());
240  }
241 
242 }