Beispiel #1
0
void Simulator::run() {
    boost::posix_time::ptime time_runStart, time_cycleStart;
    time_runStart = boost::posix_time::microsec_clock::local_time();
    
    while(!currTime.isLaterThan(finishTime)) {
        time_cycleStart = boost::posix_time::microsec_clock::local_time();
        
        std::cout << "-------------------------------------------" << std::endl;        
        currTime.display();
        std::cout << std::endl;

        // Update electricity spot price
        // spotPrice.update(currTime);
        
        // Update traffic model
        trafficModel.update(currTime, gridModel.vehicles);
        
        // Update vehicles' battery SOC based on distance driven / charging
        gridModel.updateVehicleBatteries();

        // Determine EV charging rates
        charger->setChargeRates(currTime, gridModel);

        // Update grid model - generate household loads & apply charge rates
        gridModel.generateLoads(currTime, householdDemand);
                
   
        // Show some results
        if(showDebug) {
            //spotPrice.display();
            trafficModel.displaySummary(gridModel.vehicles);
            gridModel.displayVehicleSummary();
            gridModel.displayLoadSummary();
        }

        // Provide quick update on timing to output
        timingUpdate();

        // Run load flow (typically the bottleneck)
        gridModel.runLoadFlow(currTime);
        
        // Log data
        log.update(currTime, gridModel, charger, spotPrice);
        
        // Add optional user specified delay into cycle
        // while(utility::timediff(boost::posix_time::microsec_clock::local_time(), time_cycleStart) < delay);
        
        // Estimate timing
        lastIteration = long(utility::timeElapsed(time_cycleStart));
        std::cout << "Cycle complete" << std::endl; //, took: " << utility::timeDisplay(lastIteration) << std::endl;

        currTime.increment(simInterval);
        
    }
    
    std::cout << "-------------------------------------------" << std::endl; 
    std::cout << "Simulation complete, took " << utility::timeDisplay(utility::timeElapsed(time_runStart)) << std::endl;
    std::cout << "Generating report ..." << std::endl; 
    
    if(generateReport)
        loadflow->generateReport(log.getDir(), currTime.month, currTime.isWeekday(), simInterval);
    
    std::cout << "Report written to " << log.getDir() << std::endl; 
    std::cout << "-------------------------------------------" << std::endl; 
}
Beispiel #2
0
// Run simulation
void Simulator::run() {
    // Several variables to keep track of how long cycle / full simulation took
    boost::posix_time::ptime timerRun, timerCycle;
    boost::posix_time::time_duration lastCycleLength;
    utility::startTimer(timerRun);
    utility::startTimer(timerCycle);
        
    std::cout << "Starting Simulation ... " << std::endl;
    
    // Outer simulation loop
    while(!currTime.isLaterThan(finishTime)) {
        std::cout << "-------------------------------------------" << std::endl;        
        currTime.display();
        std::cout << std::endl;

        // Update electricity spot price
        spotPrice.update(currTime);
        
        // Update traffic model
        trafficModel.update(currTime, gridModel.vehicles);
        
        // Update vehicles' battery SOC based on distance driven / charging
        gridModel.updateVehicleBatteries();

        // Update grid model - generate household loads & reset vehicle loads
        gridModel.generateAllHouseholdLoads(currTime);
        gridModel.resetVehicleLoads();

        // Depending on charge update model, apply charge rate updates and run load flow
        if(chargeRateOrder == "random")
            std::random_shuffle(vehicleIDs.begin(), vehicleIDs.end());
        
        // Determine EV charging rates
        if(chargeRateUpdate == "batch") {
            charger->setAllChargeRates(currTime, gridModel);
            gridModel.generateAllVehicleLoads();
            gridModel.runLoadFlow(currTime);
        }
        
        else if(chargeRateUpdate == "individual") {
            gridModel.runLoadFlow(currTime);
            for(int i=0; i<vehicleIDs.size(); i++) {
                charger->setOneChargeRate(currTime, gridModel, vehicleIDs.at(i));
                gridModel.generateOneVehicleLoad(vehicleIDs.at(i));
                gridModel.runLoadFlow(currTime);
            }
        }
        
        else {  // "grouped"
            gridModel.runLoadFlow(currTime);
            for(int i=0; i<vehicleIDs.size(); i+=chargeRateGroupSize) {
                for(int j=i; j<std::min((int)gridModel.vehicles.size(), (int)(i+chargeRateGroupSize)); j++) {
                    charger->setOneChargeRate(currTime, gridModel, vehicleIDs.at(i));
                    gridModel.generateOneVehicleLoad(vehicleIDs.at(i));
                }
                gridModel.runLoadFlow(currTime);
            }
        }

        // If desired, show some results
        if(showDebug) {
            spotPrice.display();
            trafficModel.displaySummary(gridModel.vehicles);
            gridModel.displayVehicleSummary();
            gridModel.displayLoadSummary(currTime);
        }

        // Provide quick update on timing to output
        timingUpdate(lastCycleLength);

        // Log data
        log.update(currTime, gridModel, charger, spotPrice);
        
        // Add optional user specified delay into cycle
        // while(utility::timediff(boost::posix_time::microsec_clock::local_time(), time_cycleStart) < config->getInt("intervaldelay"));
        
        // Estimate timing
        lastCycleLength = boost::posix_time::microsec_clock::local_time() - timerCycle;
        std::cout << "Cycle complete, took: " << utility::updateTimer(timerCycle) << std::endl;

        currTime.increment(config->getInt("simulationinterval"));
    }
    
    // Simulation complete, provide some output, generate report.
    std::cout << "-------------------------------------------" << std::endl
              << "Simulation complete, took " << utility::endTimer(timerRun) << std::endl;
    if(config->getBool("generatereport")) {
        std::cout << "Generating report ..." << std::endl; 
        loadflow->generateReport(log.getDir(), currTime.month, currTime.isWeekday(), config->getInt("simulationinterval"));
        std::cout << "Report written to " << log.getDir() << std::endl; 
    }
    std::cout << "-------------------------------------------" << std::endl; 
}