From 6e88fe9bc737624d016857d5a698d9272b8fbc37 Mon Sep 17 00:00:00 2001
From: Peter Alexander <>
Date: Tue, 18 Jan 2022 14:44:57 +0000
Subject: [PATCH] Allow saving of checkpoint status in normal runs not just
 calibration runs

---
 src/ac/ed/lurg/ModelConfig.java |  2 ++
 src/ac/ed/lurg/ModelMain.java   | 28 +++++++++++++++++++++++++---
 2 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/src/ac/ed/lurg/ModelConfig.java b/src/ac/ed/lurg/ModelConfig.java
index 19f7e301..97d12c66 100755
--- a/src/ac/ed/lurg/ModelConfig.java
+++ b/src/ac/ed/lurg/ModelConfig.java
@@ -387,6 +387,8 @@ public class ModelConfig {
 	public static final int NUM_YIELD_CLUSTERS = getIntProperty("NUM_YIELD_CLUSTERS", 8000);
 	public static final long RANDOM_SEED = getIntProperty("RANDOM_SEED", 1974329);  // any number will do
 
+	public static final String CHECKPOINT_YEARS = getProperty("CHECKPOINT_YEARS", null); // 2020,2050
+
 	// Protected areas forcing parameters
 	public static final boolean FORCE_PROTECTED_AREAS = IS_CALIBRATION_RUN ? false : getBooleanProperty("FORCE_PROTECTED_AREAS", false);
 	public static final int FORCE_PROTECTED_AREAS_START_YEAR  = getIntProperty("FORCE_PROTECTED_AREAS_START_YEAR", 2020);
diff --git a/src/ac/ed/lurg/ModelMain.java b/src/ac/ed/lurg/ModelMain.java
index 5d41efae..f863419d 100644
--- a/src/ac/ed/lurg/ModelMain.java
+++ b/src/ac/ed/lurg/ModelMain.java
@@ -143,6 +143,24 @@ public class ModelMain {
 		
 		// output results
 		outputTimestepResults(timestep, globalLandUseRaster);
+		
+		checkAndSaveCheckpoint(timestep);
+	}
+
+	private void checkAndSaveCheckpoint(Timestep timestep) {
+		if (ModelConfig.CHECKPOINT_YEARS != null) {
+			LogWriter.println("Looking to see if checkpoint year reached " + ModelConfig.CHECKPOINT_YEARS);
+
+			String[] yearStr = ModelConfig.CHECKPOINT_YEARS.split(",");
+			for(int i=0; i<yearStr.length; i++) {
+				LogWriter.println("Got a checkpoint yearStr " + yearStr[i]);
+				int year = Integer.parseInt(yearStr[i]);
+				if (timestep.getYear() == year) {
+					LogWriter.println("Saving checkpoint");
+					serializeCheckpoint(globalLandUseRaster);
+				}
+			}
+		}
 	}
 
 	private void writeLandCoverFile(Timestep timestep, RasterSet<LandUseItem> landUseRaster) {
@@ -424,9 +442,7 @@ public class ModelMain {
 		}
 
 		if (ModelConfig.IS_CALIBRATION_RUN) {
-			serializeLandUse(landUseRaster);
-			countryAgents.serializeCropUsageForAll();
-			internationalMarket.serializeGlobalPrices();
+			serializeCheckpoint(landUseRaster);
 		}
 
 		if (timestep.isInitialTimestep() && ModelConfig.GENERATE_NEW_YIELD_CLUSTERS)
@@ -629,4 +645,10 @@ public class ModelMain {
 			currentIrrigationData.updateIrrigConstraints(timestep);
 		}
 	}	
+	
+	private void serializeCheckpoint(RasterSet<LandUseItem> landUseRaster) {
+		serializeLandUse(landUseRaster);
+		countryAgents.serializeCropUsageForAll();
+		internationalMarket.serializeGlobalPrices();
+	}
 }
-- 
GitLab