public static void main(final String[] args) { log.info( "Starting the matsim run from the urbansim interface. This looks a little rough initially since 'normal' matsim"); log.info("is not entered until later (after 'DONE with demand generation from urbansim')."); int year = 0; double samplingRate = 0.01; for (int ii = 1; ii < args.length; ii++) { // args[0] is the config file log.info(" ii: " + ii + " args[ii]: " + args[ii]); String[] parts = args[ii].split("="); if (parts[0].equals("--year")) { year = Integer.parseInt(parts[1]); } else if (parts[0].equals("--samplingRate")) { samplingRate = Double.parseDouble(parts[1]); } } log.info("year: " + year + " samplingRate: " + samplingRate); for (int ii = args.length - 1; ii >= 1; ii--) { args[ii] = ""; } // parse the config arguments so we have a config. generate scenario data from this Config config = ConfigUtils.loadConfig(args[0]); MatsimRandom.reset(config.global().getRandomSeed()); Scenario scenario = ScenarioUtils.createScenario(config); ScenarioUtils.loadScenario(scenario); // get the network. Always cleaning it seems a good idea since someone may have modified the // input files manually in // order to implement policy measures. Get network early so readXXX can check if links still // exist. Network network = scenario.getNetwork(); log.info(""); log.info("cleaning network ..."); NetworkCleaner nwCleaner = new NetworkCleaner(); nwCleaner.run(network); log.info("... finished cleaning network."); log.info(""); ReadFromUrbansimParcelModel readFromUrbansim = new ReadFromUrbansimParcelModel(year); // read urbansim facilities (these are simply those entities that have the coordinates!) ActivityFacilitiesImpl facilities = new ActivityFacilitiesImpl("urbansim locations (gridcells _or_ parcels _or_ ...)"); ActivityFacilitiesImpl zones = new ActivityFacilitiesImpl("urbansim zones"); readFromUrbansim.readFacilities(facilities, zones); new FacilitiesWriter(facilities).write(PATH_TO_OPUS_MATSIM + "tmp/locations.xml.gz"); Population oldPop; if (config.plans().getInputFile() != null) { log.info( "Population specified in matsim config file; assuming WARM start with pre-existing pop file."); log.info( "Persons not found in pre-existing pop file are added; persons no longer in urbansim persons file are removed."); oldPop = scenario.getPopulation(); log.info( "Note that the `continuation of iterations' will only work if you set this up via different config files for"); log.info(" every year and know what you are doing."); } else { log.warn("No population specified in matsim config file; assuming COLD start."); log.info("(I.e. generate new pop from urbansim files.)"); oldPop = null; } Population newPop = ((MutableScenario) ScenarioUtils.createScenario(ConfigUtils.createConfig())) .getPopulation(); // read urbansim persons. Generates hwh acts as side effect readFromUrbansim.readPersons(oldPop, newPop, facilities, network, samplingRate); oldPop = null; System.gc(); new PopulationWriter(newPop, network).write(PATH_TO_OPUS_MATSIM + "tmp/pop.xml.gz"); log.info("### DONE with demand generation from urbansim ###"); ((MutableScenario) scenario).setPopulation(newPop); Controler controler = new Controler(scenario); controler .getConfig() .controler() .setOverwriteFileSetting( true ? OutputDirectoryHierarchy.OverwriteFileSetting.overwriteExistingFiles : OutputDirectoryHierarchy.OverwriteFileSetting.failIfDirectoryExists); // The following lines register what should be done _after_ the iterations were run: MyControlerListener myControlerListener = new MyControlerListener(zones); controler.addControlerListener(myControlerListener); // run the iterations, including the post-processing: controler.run(); }