V1_0.java [src/java/m/oms/ages] Revision: 5106f5176352222ea4542c86bcd117dad5b1d4e9 Date: Fri Jul 28 10:09:15 MDT 2023
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package m.oms.ages;
import csip.Config;
import csip.ModelDataService;
import csip.annotations.*;
import static csip.annotations.ResourceType.*;
import csip.cosu.ObjFunc;
import java.io.File;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.ws.rs.Path;
import static m.oms.ages.V1_0.*;
import oms.utils.Utils;
/**
* Ages service.
*
* @author od
*/
@Name("AGES model execution")
@Description("OMS based AGES model service")
@VersionInfo("1.0")
@Path("m/ages/1.0.0")
@Polling(first = 5000, next = 4500)
@Resource(file = "/bin/ages_1_0/ages.jar", type = JAR, id = Utils.ID_AGES_JAR)
@Resource(file = "/bin/ages_1_0/ages-lib.zip", type = ARCHIVE)
@Resource(file = "/bin/ages_1_0/ages-static.zip", type = ARCHIVE)
@Resource(file = "java-*-std*.txt output/csip_run/out/*.csv", type = OUTPUT)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages.sim", type = REFERENCE, id = KEY_SCRIPT)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPL.sim", type = REFERENCE, id = KEY_SCRIPT_NP)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLSFIR3.sim", type = REFERENCE, id = KEY_SCRIPT_NP3)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLSFIR30.sim", type = REFERENCE, id = KEY_SCRIPT_NP30)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLSFIR300.sim", type = REFERENCE, id = KEY_SCRIPT_NP300)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLSFIR3000.sim", type = REFERENCE, id = KEY_SCRIPT_NP3000)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLBDCW.sim", type = REFERENCE, id = KEY_SCRIPT_NPBDCW)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLEAGLE.sim", type = REFERENCE, id = KEY_SCRIPT_NPEAGLE)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLDRAKE58.sim", type = REFERENCE, id = KEY_SCRIPT_NPDRAKE58)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLDRAKE51.sim", type = REFERENCE, id = KEY_SCRIPT_NPDRAKE51)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLDRAKE27.sim", type = REFERENCE, id = KEY_SCRIPT_NPDRAKE27)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLDRAKE27s1.sim", type = REFERENCE, id = KEY_SCRIPT_NPDRAKE27s1)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLDRAKE27s4.sim", type = REFERENCE, id = KEY_SCRIPT_NPDRAKE27s4)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLDRAKE27s5.sim", type = REFERENCE, id = KEY_SCRIPT_NPDRAKE27s5)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLDRAKE58s1.sim", type = REFERENCE, id = KEY_SCRIPT_NPDRAKE58s1)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLDRAKE58s5.sim", type = REFERENCE, id = KEY_SCRIPT_NPDRAKE58s5)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLGOODWATER.sim", type = REFERENCE, id = KEY_SCRIPT_NPGOODWATER)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLFM_GR.sim", type = REFERENCE, id = KEY_SCRIPT_NPFM_GR)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLFM_ST.sim", type = REFERENCE, id = KEY_SCRIPT_NPFM_ST)
public class V1_0 extends ModelDataService {
public static final String KEY_SCRIPT = "ages.sim";
public static final String KEY_SCRIPT_NP = "ages_noPL.sim"; // no payload script
public static final String KEY_SCRIPT_NP3 = "ages_noPLSFIR3.sim"; // no payload script
public static final String KEY_SCRIPT_NP30 = "ages_noPLSFIR30.sim"; // no payload script
public static final String KEY_SCRIPT_NP300 = "ages_noPLSFIR300.sim"; // no payload script
public static final String KEY_SCRIPT_NP3000 = "ages_noPLSFIR3000.sim"; // no payload script
public static final String KEY_SCRIPT_NPBDCW = "ages_noPLBDCW.sim"; // no payload script
public static final String KEY_SCRIPT_NPEAGLE = "ages_noPLEAGLE.sim"; // no payload script
public static final String KEY_SCRIPT_NPDRAKE58 = "ages_noPLDRAKE58.sim"; // no payload script
public static final String KEY_SCRIPT_NPDRAKE51 = "ages_noPLDRAKE51.sim"; // no payload script
public static final String KEY_SCRIPT_NPDRAKE27 = "ages_noPLDRAKE27.sim"; // no payload script
public static final String KEY_SCRIPT_NPDRAKE27s1 = "ages_noPLDRAKE27s1.sim"; // no payload script
public static final String KEY_SCRIPT_NPDRAKE27s4 = "ages_noPLDRAKE27s4.sim"; // no payload script
public static final String KEY_SCRIPT_NPDRAKE27s5 = "ages_noPLDRAKE27s5.sim"; // no payload script
public static final String KEY_SCRIPT_NPDRAKE58s1 = "ages_noPLDRAKE58s1.sim"; // no payload script
public static final String KEY_SCRIPT_NPDRAKE58s5 = "ages_noPLDRAKE58s5.sim"; // no payload script
public static final String KEY_SCRIPT_NPGOODWATER = "ages_noPLGOODWATER.sim"; // no payload script
public static final String KEY_SCRIPT_NPFM_GR = "ages_noPLFM_GR.sim"; // no payload script
public static final String KEY_SCRIPT_NPFM_ST = "ages_noPLFM_ST.sim"; // no payload script
public static final String RUN_INC = "run.inc";
public static final String PAR_STARTTIME = "startTime";
public static final String PAR_ENDTIME = "endTime";
public static final String CAL_STARTTIME = "cal_startTime";
public static final String CAL_ENDTIME = "cal_endTime";
public static final String PAYLOAD = "payload";
public static final String PROJECT = "project";
public String data_folder = "";
boolean payLoad = false;
// required parameter
String[] reqParams = {
PAR_STARTTIME,
PAR_ENDTIME
};
// optional parameter
String[] optParams = {
"ACAdaptation",
"baseDepth",
"BetaW",
"Beta_min",
"Beta_rsd",
"DCAdaptation",
"FCAdaptation",
"Ksink",
"LExCoef",
"N_delay_RG1",
"N_delay_RG2",
"a_rain",
"a_snow",
"angstrom_a",
"angstrom_b",
"baseTemp",
"calib_clat_fact",
"ccf_factor",
"cn_froz",
"icn",
"r2adj",
"fcimp",
"meanCNFactor",
"meanKfFactor",
"defaultCO2",
"denitfac",
"delayNitrification",
"denitrificationRateCoefficient",
"denitrificationSoilSaturationThreshold",
"depdr",
"deposition_factor",
"drrad",
"drspac",
"f1",
"f12",
"f13",
"f14",
"f15",
"f16",
"f17",
"f18",
"f19",
"f2",
"f3",
"f4",
"f5",
"f6",
"f7",
"f8",
"flowRouteTA",
"fmt_date",
"fmt_double",
"g_factor",
"geoMaxPerc",
"gwCapRise",
"gwRG1Fact",
"gwRG1RG2dist",
"gwRG2Fact",
"halflife_RG1",
"halflife_RG2",
"infil_conc_factor",
"initLPS",
"initMPS",
"initN_concRG1",
"initN_concRG2",
"initRG1",
"initRG2",
"kdiff_layer",
"kf_calib",
"kf_fact",
"lagSurfaceRunoff",
"lagInterflow",
"locGrw",
"longTZ",
"nitri_delay",
"nitrificationSoilTemperatureThreshold",
"nitrificationSurfaceTemperatureThreshold",
"opti",
"piadin",
"r_factor",
"rootfactor",
"sceno",
"skipRegression",
"snowCritDens",
"snowDensConst",
"snowFactorA",
"snowFactorB",
"snowFactorC",
"snow_trans",
"snow_trs",
"soilDiffMPSLPS",
"soilDistMPSLPS",
"soilImpGT80",
"soilImpLT80",
"soilLatVertLPS",
"soilLinRed",
"soilMaxDPS",
"soilMaxInfSnow",
"soilMaxInfSummer",
"soilMaxInfWinter",
"soilMaxPerc",
"soilOutLPS",
"soilPolRed",
"t_factor",
"tempRes",
"temp_lag"
};
// simulation flags
String[] flags = {
"flagParallel",
"flagRegionalization",
"flagHRURouting",
"flagReachRouting",
"flagSort",
"flagSplit",
"flagInfiltration",
"flagTillage",
"flagTileDrain",
"flagUPGM",
"parallelismFactor",
"parallelismThreads",
"flagSaveState",
"flagLoadState",
"flagWB",
"loadStateFilePath",
"dataStartTime",
"dataEndTime"
};
@Override
public void doProcess() throws Exception {
LOG.info("===> Running AgES ");
payLoad = parameter().getBoolean(PAYLOAD, false);
String project = parameter().getString(PROJECT, "SFIR3");
String dsl = parameter().getString(KEY_SCRIPT, resources().getFile(KEY_SCRIPT).toString());
if (!payLoad) {
dsl = parameter().getString(KEY_SCRIPT_NP, resources().getFile(KEY_SCRIPT_NP).toString());
if (!project.isEmpty()) {
if (project.equals("SFIR3")) {
dsl = parameter().getString(KEY_SCRIPT_NP3, resources().getFile(KEY_SCRIPT_NP3).toString());
}
if (project.equals("SFIR30")) {
dsl = parameter().getString(KEY_SCRIPT_NP30, resources().getFile(KEY_SCRIPT_NP30).toString());
}
if (project.equals("SFIR300")) {
dsl = parameter().getString(KEY_SCRIPT_NP300, resources().getFile(KEY_SCRIPT_NP300).toString());
}
if (project.equals("SFIR3000")) {
dsl = parameter().getString(KEY_SCRIPT_NP3000, resources().getFile(KEY_SCRIPT_NP3000).toString());
}
if (project.equals("BDCW")) {
dsl = parameter().getString(KEY_SCRIPT_NPBDCW, resources().getFile(KEY_SCRIPT_NPBDCW).toString());
}
if (project.equals("EAGLE")) {
dsl = parameter().getString(KEY_SCRIPT_NPEAGLE, resources().getFile(KEY_SCRIPT_NPEAGLE).toString());
}
if (project.equals("DRAKE58")) {
dsl = parameter().getString(KEY_SCRIPT_NPDRAKE58, resources().getFile(KEY_SCRIPT_NPDRAKE58).toString());
}
if (project.equals("DRAKE51")) {
dsl = parameter().getString(KEY_SCRIPT_NPDRAKE51, resources().getFile(KEY_SCRIPT_NPDRAKE51).toString());
}
if (project.equals("DRAKE27")) {
dsl = parameter().getString(KEY_SCRIPT_NPDRAKE27, resources().getFile(KEY_SCRIPT_NPDRAKE27).toString());
}
if (project.equals("DRAKE27s1")) {
project = "DRAKE27";
dsl = parameter().getString(KEY_SCRIPT_NPDRAKE27s1, resources().getFile(KEY_SCRIPT_NPDRAKE27s1).toString());
}
if (project.equals("DRAKE27s4")) {
project = "DRAKE27";
dsl = parameter().getString(KEY_SCRIPT_NPDRAKE27s4, resources().getFile(KEY_SCRIPT_NPDRAKE27s4).toString());
}
if (project.equals("DRAKE27s5")) {
project = "DRAKE27";
dsl = parameter().getString(KEY_SCRIPT_NPDRAKE27s5, resources().getFile(KEY_SCRIPT_NPDRAKE27s5).toString());
}
if (project.equals("DRAKE58s1")) {
project = "DRAKE58";
dsl = parameter().getString(KEY_SCRIPT_NPDRAKE58s1, resources().getFile(KEY_SCRIPT_NPDRAKE58s1).toString());
}
if (project.equals("DRAKE58s5")) {
project = "DRAKE58";
dsl = parameter().getString(KEY_SCRIPT_NPDRAKE58s5, resources().getFile(KEY_SCRIPT_NPDRAKE58s5).toString());
}
if (project.equals("GOODWATER")) {
project = "GOODWATER";
dsl = parameter().getString(KEY_SCRIPT_NPGOODWATER, resources().getFile(KEY_SCRIPT_NPGOODWATER).toString());
}
if (project.equals("FM_GR")) {
project = "FOURMILECREEK_GR";
dsl = parameter().getString(KEY_SCRIPT_NPFM_GR, resources().getFile(KEY_SCRIPT_NPFM_GR).toString());
}
if (project.equals("FM_ST")) {
project = "FOURMILECREEK_ST";
dsl = parameter().getString(KEY_SCRIPT_NPFM_ST, resources().getFile(KEY_SCRIPT_NPFM_ST).toString());
}
}
}
data_folder = project;
// pass request param to model runtime parameter -> run.inc
Map<String, String> agesParam = new LinkedHashMap<>();
Utils.passReqQuotedParam(agesParam, parameter(), reqParams);
// scalar parameter
Utils.passOptParam(agesParam, parameter(), optParams);
// optional flags
Utils.passOptQuotedParam(agesParam, parameter(), flags);
// data file parameters
File dataFolder = !payLoad ? new File(Config.getString(Config.CSIP_BIN_DIR) + "/ages_1_0/data/" + data_folder) : workspace().getDir();
Utils.processFileParameters(parameter(), dataFolder, workspace().getDir(), agesParam);
// create parameter include file
Utils.createParamInclude(agesParam, workspace().getFile(RUN_INC));
String start = parameter().getString(PAR_STARTTIME);
String end = parameter().getString(PAR_ENDTIME);
// optional parameter
String cal_start = parameter().getString(CAL_STARTTIME, start);
String cal_end = parameter().getString(CAL_ENDTIME, end);
File d = new File(dsl);
if (!(d.isAbsolute() && d.exists())) {
d = workspace().getFile(dsl);
}
workspace().getFile("output").mkdirs();
workspace().getFile("logs").mkdirs();
Utils.runAges(d, workspace().getDir(), parameter(), resources(), LOG);
if (!cosu().isRequested()) {
return;
}
for (String name : cosu().getNames()) {
String[] data = cosu().getData(name);
ObjFunc of = cosu().getObjFunc(name);
double[] obsData = Utils.getData(data[0],
dataFolder, cal_start, cal_end);
// e.g. output/csip_run/out/Outlet.csv/output/catchmentSimRunoff
double[] simData = Utils.getData(data[1], workspace().getDir(), cal_start, cal_end);
double result = of.eval(obsData, simData, parameter().getDouble("missing", -9999d));
result = Double.isNaN(result) ? -999.0 : result;
cosu().setValue(name, result);
}
}
}