16 package emlab.gen.domain.factory;
18 import java.io.IOException;
19 import java.util.List;
21 import org.codehaus.groovy.syntax.ReadException;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24 import org.springframework.beans.factory.annotation.Autowired;
26 import com.googlecode.jcsv.reader.CSVEntryParser;
61 private final List<EnergyProducer> producers;
63 private final List<PowerGeneratingTechnology> technologies;
65 private final List<PowerGridNode> powerGridNodes;
70 public PowerPlantEntryParser(List<EnergyProducer> producers, List<PowerGeneratingTechnology> technologies,
71 List<PowerGridNode> powerGridNodes) {
72 this.producers = producers;
73 this.technologies = technologies;
74 this.powerGridNodes = powerGridNodes;
81 static final Logger logger = LoggerFactory.getLogger(PowerPlantEntryParser.class);
85 String name = data[0];
86 String technologyName = data[1];
87 String locationName = data[2];
88 int age = Integer.parseInt(data[3]);
89 String ownerName =
"";
94 if (data.length > 4 && !data[5].isEmpty())
95 capacity = Double.parseDouble(data[5]);
96 double efficiency = 0;
97 if (data.length > 5 && !data[6].isEmpty()) {
98 efficiency = Double.parseDouble(data[6]);
102 if (!ownerName.isEmpty()) {
104 if (producer.getName().equals(ownerName)) {
105 energyProducer = producer;
110 energyProducer = getRandomProducer(producers);
113 if (!technologyName.isEmpty()) {
115 if (ppTechnology.getName().equals(technologyName)) {
122 pgt = technologies.get(0);
125 if (!locationName.isEmpty()) {
127 if (node.getName().equals(locationName)) {
128 powerGridNode = node;
135 throw new ReadException(
"Location fields is not allowed to be empty!",
new IOException());
136 }
catch (ReadException e) {
141 return createPowerPlant(name, pgt, energyProducer, powerGridNode, age, capacity, efficiency);
142 }
catch (NullPointerException e) {
143 logger.warn(
"ERROR: Name: \"" + name +
"\",Pgt: " + pgt +
", EnergyProducer" + energyProducer +
", Node:"
145 +
", Age:" + age +
", Capacity: " + capacity +
", Efficiency:" + efficiency);
152 PowerGridNode location,
int age,
double capacity,
double efficiency) {
155 plant.setTechnology(technology);
156 plant.setOwner(energyProducer);
157 plant.setLocation(location);
158 plant.setConstructionStartTime(-(technology.getExpectedLeadtime() + technology.getExpectedPermittime() + age));
159 plant.setActualLeadtime(plant.getTechnology().getExpectedLeadtime());
160 plant.setActualPermittime(plant.getTechnology().getExpectedPermittime());
161 plant.setExpectedEndOfLife(plant.getConstructionStartTime() + plant.getActualPermittime()
162 + plant.getActualLeadtime() + plant.getTechnology().getExpectedLifetime());
164 plant.setActualNominalCapacity(technology.getCapacity() * location.getCapacityMultiplicationFactor());
166 plant.setActualNominalCapacity(capacity);
169 plant.calculateAndSetActualInvestedCapital(plant.getConstructionStartTime());
170 if (efficiency == 0) {
171 plant.calculateAndSetActualEfficiency(plant.getConstructionStartTime());
173 plant.setActualEfficiency(efficiency);
175 plant.calculateAndSetActualFixedOperatingCosts(plant.getConstructionStartTime());
176 plant.setDismantleTime(1000);
180 loan.setFrom(energyProducer);
182 double amountPerPayment = determineLoanAnnuities(
183 plant.getActualInvestedCapital() * energyProducer.getDebtRatioOfInvestments(), plant.getTechnology()
184 .getDepreciationTime(), energyProducer.getLoanInterestRate());
185 loan.setAmountPerPayment(amountPerPayment);
186 loan.setTotalNumberOfPayments(plant.getTechnology().getDepreciationTime());
187 loan.setLoanStartTime(plant.getConstructionStartTime());
188 loan.setNumberOfPaymentsDone(-plant.getConstructionStartTime());
194 loan.setRegardingPowerPlant(plant);
198 private EnergyProducer getRandomProducer(List<EnergyProducer> producers) {
199 if (producers.size() > 0) {
200 int size = producers.size();
201 int index = getRandomIndexFromList(size);
202 return producers.get(index);
207 private int getRandomIndexFromList(
int size) {
208 return (
int) Math.min(Math.floor(Math.random() * size), size - 1);
211 public double determineLoanAnnuities(
double totalLoan,
double payBackTime,
double interestRate) {
213 double q = 1 + interestRate;
214 double annuity = totalLoan * (Math.pow(q, payBackTime) * (q - 1)) / (Math.pow(q, payBackTime) - 1);