16 package emlab.gen.domain.technology;
20 import org.neo4j.graphdb.Direction;
21 import org.springframework.beans.factory.annotation.Autowired;
22 import org.springframework.beans.factory.annotation.Configurable;
23 import org.springframework.data.annotation.Transient;
24 import org.springframework.data.neo4j.annotation.NodeEntity;
25 import org.springframework.data.neo4j.annotation.RelatedTo;
26 import org.springframework.transaction.annotation.Transactional;
60 private Set<SubstanceShareInFuelMix> fuelMix;
62 @RelatedTo(type =
"POWERPLANT_OWNER", elementClass =
EnergyProducer.class, direction = Direction.OUTGOING)
65 @RelatedTo(type =
"LOCATION", elementClass =
PowerGridNode.class, direction = Direction.OUTGOING)
68 @RelatedTo(type =
"LOAN", elementClass =
Loan.class, direction = Direction.OUTGOING)
71 @RelatedTo(type =
"DOWNPAYMENT", elementClass =
Loan.class, direction = Direction.OUTGOING)
72 private Loan downpayment;
78 private long dismantleTime;
79 private long constructionStartTime;
80 private long actualLeadtime;
81 private long actualPermittime;
82 private long actualLifetime;
85 private double actualInvestedCapital;
86 private double actualFixedOperatingCost;
87 private double actualEfficiency;
88 private double expectedEndOfLife;
89 private double actualNominalCapacity;
91 public boolean isOperational(
long currentTick) {
93 double finishedConstruction = getConstructionStartTime()
94 + calculateActualPermittime() + calculateActualLeadtime();
96 if (finishedConstruction <= currentTick) {
99 if (getDismantleTime() == 1000) {
102 }
else if (getDismantleTime() > currentTick) {
105 }
else if (getDismantleTime() <= currentTick) {
114 public boolean isExpectedToBeOperational(
long time) {
116 double finishedConstruction = getConstructionStartTime()
117 + calculateActualPermittime() + calculateActualLeadtime();
119 if (finishedConstruction <= time) {
122 if (getExpectedEndOfLife() > time) {
131 public boolean isInPipeline(
long currentTick) {
133 double finishedConstruction = getConstructionStartTime()
134 + calculateActualPermittime() + calculateActualLeadtime();
136 if (finishedConstruction > currentTick) {
139 if (getDismantleTime() == 1000) {
142 }
else if (getDismantleTime() > currentTick) {
145 }
else if (getDismantleTime() <= currentTick) {
154 public double getAvailableCapacity(
long currentTick,
Segment segment,
155 long numberOfSegments) {
156 if (isOperational(currentTick)) {
157 if (this.getTechnology().isIntermittent()) {
159 double factor = intermittentTechnologyNodeLoadFactor.getLoadFactorForSegment(segment);
163 if (segment != null) {
165 double segmentID = segment.getSegmentID();
166 if ((
int) segmentID != 1) {
168 double min = getTechnology()
169 .getPeakSegmentDependentAvailability();
170 double max = getTechnology()
171 .getBaseSegmentDependentAvailability();
172 double segmentPortion = (numberOfSegments - segmentID)
173 / (numberOfSegments - 1);
178 double range = max - min;
180 factor = max - segmentPortion * range;
183 factor = getTechnology()
184 .getPeakSegmentDependentAvailability();
194 public double getExpectedAvailableCapacity(
long futureTick,
195 Segment segment,
long numberOfSegments) {
196 if (isExpectedToBeOperational(futureTick)) {
197 if (this.getTechnology().isIntermittent()) {
198 double factor = getIntermittentTechnologyNodeLoadFactor().getLoadFactorForSegment(segment);
202 if (segment != null) {
204 double segmentID = segment.getSegmentID();
205 double min = getTechnology()
206 .getPeakSegmentDependentAvailability();
207 double max = getTechnology()
208 .getBaseSegmentDependentAvailability();
209 double segmentPortion = (numberOfSegments - segmentID)
210 / (numberOfSegments - 1);
215 double range = max - min;
217 factor = max - segmentPortion * range;
226 public double getAvailableCapacity(
long currentTick) {
227 if (isOperational(currentTick)) {
234 public long calculateActualLeadtime() {
236 actual = getActualLeadtime();
238 actual = getTechnology().getExpectedLeadtime();
243 public long calculateActualPermittime() {
245 actual = getActualPermittime();
247 actual = getTechnology().getExpectedPermittime();
252 public long calculateActualLifetime() {
254 actual = getActualLifetime();
256 actual = getTechnology().getExpectedLifetime();
270 long endOfTechnicalLifetime = getConstructionStartTime()
271 + calculateActualPermittime() + calculateActualLeadtime()
272 + calculateActualLifetime();
273 if (endOfTechnicalLifetime <= currentTick) {
283 public void setLocation(PowerGridNode location) {
284 this.location = location;
287 public PowerGeneratingTechnology getTechnology() {
291 public void setTechnology(PowerGeneratingTechnology technology) {
292 this.technology = technology;
295 public long getConstructionStartTime() {
296 return constructionStartTime;
299 public void setConstructionStartTime(
long constructionStartTime) {
300 this.constructionStartTime = constructionStartTime;
303 public EnergyProducer getOwner() {
307 public void setOwner(EnergyProducer owner) {
311 public void setActualLifetime(
long actualLifetime) {
312 this.actualLifetime = actualLifetime;
315 public long getActualLifetime() {
316 return actualLifetime;
319 public void setActualPermittime(
long actualPermittime) {
320 this.actualPermittime = actualPermittime;
323 public long getActualPermittime() {
324 return actualPermittime;
327 public void setActualLeadtime(
long actualLeadtime) {
328 this.actualLeadtime = actualLeadtime;
331 public long getActualLeadtime() {
332 return actualLeadtime;
335 public long getDismantleTime() {
336 return dismantleTime;
339 public void setDismantleTime(
long dismantleTime) {
340 this.dismantleTime = dismantleTime;
343 public String getName() {
347 public void setName(String label) {
352 public String getLabel() {
356 public void setLabel(String label) {
360 public double getActualInvestedCapital() {
361 return actualInvestedCapital;
364 public void setActualInvestedCapital(
double actualInvestedCapital) {
365 this.actualInvestedCapital = actualInvestedCapital;
368 public Set<SubstanceShareInFuelMix> getFuelMix() {
372 public void setFuelMix(Set<SubstanceShareInFuelMix> fuelMix) {
373 this.fuelMix = fuelMix;
376 public Loan getLoan() {
380 public void setLoan(Loan loan) {
384 public Loan getDownpayment() {
388 public void setDownpayment(Loan downpayment) {
389 this.downpayment = downpayment;
392 public double getActualEfficiency() {
393 return actualEfficiency;
396 public void setActualEfficiency(
double actualEfficiency) {
397 this.actualEfficiency = actualEfficiency;
401 public String toString() {
402 return this.getName() +
" power plant";
413 long timeOfPermitorBuildingStart) {
414 setActualInvestedCapital(this.getTechnology().getInvestmentCost(
415 timeOfPermitorBuildingStart + getActualLeadtime() + getActualPermittime())
419 public void calculateAndSetActualFixedOperatingCosts(
long timeOfPermitorBuildingStart) {
421 timeOfPermitorBuildingStart + getActualLeadtime() + getActualPermittime())
425 public void calculateAndSetActualEfficiency(
long timeOfPermitorBuildingStart) {
426 this.setActualEfficiency(this.getTechnology().getEfficiency(
427 timeOfPermitorBuildingStart + getActualLeadtime() + getActualPermittime()));
430 public double calculateEmissionIntensity() {
432 double emission = 0d;
433 for (SubstanceShareInFuelMix sub : this.getFuelMix()) {
434 Substance substance = sub.getSubstance();
435 double fuelAmount = sub.getShare();
436 double co2density = substance.getCo2Density()
437 * (1 - this.getTechnology().getCo2CaptureEffciency());
440 double emissionForThisFuel = fuelAmount * co2density;
441 emission += emissionForThisFuel;
447 public double calculateElectricityOutputAtTime(
long time,
boolean forecast) {
450 for (PowerPlantDispatchPlan plan : powerPlantDispatchPlanRepository
451 .findAllPowerPlantDispatchPlansForPowerPlantForTime(
this, time, forecast)) {
452 amount += plan.getSegment().getLengthInHours()
453 * (plan.getCapacityLongTermContract() + plan
454 .getAcceptedAmount());
459 public double calculateCO2EmissionsAtTime(
long time,
boolean forecast) {
460 return this.calculateEmissionIntensity()
461 * calculateElectricityOutputAtTime(time, forecast);
465 public void dismantlePowerPlant(
long time) {
466 this.setDismantleTime(time);
486 specifyNotPersist(time, energyProducer, location, technology);
490 public void specifyNotPersist(
long time,
EnergyProducer energyProducer,
492 String label = energyProducer.getName() +
" - " + technology.getName();
494 this.setTechnology(technology);
495 this.setOwner(energyProducer);
496 this.setLocation(location);
497 this.setConstructionStartTime(time);
498 this.setActualLeadtime(this.technology.getExpectedLeadtime());
499 this.setActualPermittime(this.technology.getExpectedPermittime());
500 this.calculateAndSetActualEfficiency(time);
501 this.setActualNominalCapacity(this.getTechnology().getCapacity() * location.getCapacityMultiplicationFactor());
502 assert this.getActualEfficiency() <= 1 : this.getActualEfficiency();
503 this.setDismantleTime(1000);
504 this.calculateAndSetActualInvestedCapital(time);
505 this.calculateAndSetActualFixedOperatingCosts(time);
506 this.setExpectedEndOfLife(time + getActualPermittime()
507 + getActualLeadtime() + getTechnology().getExpectedLifetime());
511 public void createOrUpdateLoan(Loan loan) {
516 public void createOrUpdateDownPayment(Loan downpayment) {
517 this.setDownpayment(downpayment);
520 public double getExpectedEndOfLife() {
521 return expectedEndOfLife;
524 public void setExpectedEndOfLife(
double expectedEndOfLife) {
525 this.expectedEndOfLife = expectedEndOfLife;
529 public void updateFuelMix(Set<SubstanceShareInFuelMix> fuelMix) {
530 this.setFuelMix(fuelMix);
537 return actualNominalCapacity;
545 if (actualNominalCapacity < 0)
546 throw new RuntimeException(
"ERROR: " + this.name +
" power plant is being set with a negative capacity!");
547 this.actualNominalCapacity = actualNominalCapacity;
554 return actualFixedOperatingCost;
562 this.actualFixedOperatingCost = actualFixedOperatingCost;
566 return intermittentTechnologyNodeLoadFactorRepository
567 .findIntermittentTechnologyNodeLoadFactorForNodeAndTechnology(this.getLocation(),
568 this.getTechnology());
boolean isWithinTechnicalLifetime(long currentTick)
void setActualNominalCapacity(double actualNominalCapacity)
void calculateAndSetActualInvestedCapital(long timeOfPermitorBuildingStart)
void setActualFixedOperatingCost(double actualFixedOperatingCost)
void specifyAndPersist(long time, EnergyProducer energyProducer, PowerGridNode location, PowerGeneratingTechnology technology)
double getActualNominalCapacity()
double getActualFixedOperatingCost()