V1_0.java [src/java/m/rhem/rhem07_editparfile] Revision: 9a23dfba952949a285cc97dd874ed0c12c960109  Date: Mon Jul 20 17:26:41 MDT 2020
/*
 * $Id$
 *
 * This file is part of the Cloud Services Integration Platform (CSIP),
 * a Model-as-a-Service framework, API, and application suite.
 *
 * 2012-2020, OMSLab, Colorado State University.
 *
 * OMSLab licenses this file to you under the MIT license.
 * See the LICENSE file in the project root for more information.
 */
package m.rhem.rhem07_editparfile;

import csip.Config;
import csip.Executable;
import csip.ModelDataService;
import csip.ServiceException;
import csip.annotations.Polling;
import csip.annotations.Resource;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.ws.rs.Path;
import m.rhem.model.Parameter;
import m.rhem.model.RhemModel;
import csip.annotations.Description;
import csip.annotations.Name;
import rhem.utils.DBResources;
import rhem.utils.RhemResources;
import static rhem.utils.RhemResources.RHEM4_EXE;

/**
 * RHEM-07: Run model with edited parameter file
 *
 * @version 1.0
 * @author Rumpal Sidhu
 */
@Name("RHEM-07: Run model with edited parameter file")
@Description("Run the RHEM model with parameter file as input.")
@Path("m/rhem/editparfile/1.0")
@Polling(first = 5000, next = 2000)
@Resource(from = DBResources.class)
@Resource(from = RhemResources.class)
public class V1_0 extends ModelDataService {

  private String cligen_db = Config.getString("rhem.cligen_db", "file:/Users/rumpal/Documents/Work/csipDocuments/RHEM/cligen");

  private String parameterFileName;
  private String stormFileName;
  private String summaryFileName;
  private String runFileName;
  private String detailedOutputFileName;
  private Parameter parameter;

  private int aoaId;
  private int rhemSiteId;
  private String scenarioName;
  private String stateId;
  private String climatestationId;


  @Override
  public void preProcess() throws ServiceException {
    aoaId = parameter().getInt("AoAID", 0);
    rhemSiteId = parameter().getInt("rhem_site_id", 0);
    scenarioName = parameter().getString("scenarioname");
    stateId = parameter().getString("stateid");
    climatestationId = parameter().getString("climatestationid");

    String diams = parameter().getString("DIAMS");
    String density = parameter().getString("DENSITY");

    String len = parameter().getString("LEN");
    String chezy = parameter().getString("CHEZY");
    String rchezy = parameter().getString("RCHEZY");
    String sl = parameter().getString("SL");
    String sx = parameter().getString("SX");
    String cv = parameter().getString("CV");
    String sat = parameter().getString("SAT");
    String kss = parameter().getString("KSS");
    String komega = parameter().getString("KOMEGA");
    String kcm = parameter().getString("KCM");
    String ke = parameter().getString("KE");
    String adf = parameter().getString("ADF");
    String alf = parameter().getString("ALF");
    String bare = parameter().getString("BARE");

    String g = parameter().getString("G");
    String dist = parameter().getString("DIST");
    String por = parameter().getString("POR");
    String fract = parameter().getString("FRACT");

    parameter = new Parameter(diams, density, len, chezy, rchezy,
        sl, sx, cv, sat, kss, komega, kcm, ke, adf, alf, bare, g,
        dist, por, fract);
  }


  @Override
  public void doProcess() throws Exception {

    SimpleDateFormat sdf = new SimpleDateFormat("MMMM dd, YYYY, hh:mm a");
    Date now = new Date();
    String today = sdf.format(now);

    String fileName = scenarioName;
    if (scenarioName.length() > 15) {
      fileName = scenarioName.substring(0, 15);
    }
    parameterFileName = "scenario_input_" + fileName + ".par";
    stormFileName = "storm_input_" + fileName + ".pre";
    summaryFileName = "scenario_output_summary_" + fileName + ".sum";
    detailedOutputFileName = "scenario_output_summary_" + fileName + ".out";
    runFileName = fileName + ".run";

    RhemModel rhemModel = new RhemModel(stateId, climatestationId,
        scenarioName, today, getWorkspaceDir(), parameterFileName,
        stormFileName, runFileName, summaryFileName);

    rhemModel.generateParamFile(parameter);
    rhemModel.generateStormFile(cligen_db, Double.parseDouble(parameter.getKe()));
    rhemModel.generateRunFile();
    try {
      runModel();
    } catch (IOException ex) {
      throw new ServiceException(ex);
    }

    //If the run is successful then edit the summary file.
    double avgYearlyPrecip = 0;
    try (Connection connection = resources().getJDBC(DBResources.CRDB);
        Statement statement = connection.createStatement();) {
      try (ResultSet rs = statement.executeQuery(DBResources.RHEM07Query01(climatestationId))) {
        while (rs.next()) {
          avgYearlyPrecip = rs.getDouble("avg_yearly_precip_mm");
        }
      }
    } catch (SQLException e) {
      throw new ServiceException(e);
    }
    rhemModel.appendToSumFile(avgYearlyPrecip);
  }


  private void runModel() throws ServiceException, IOException {
    Executable rh = resources().getExe(RHEM4_EXE);
    rh.setArguments("-b", getWorkspaceFile(runFileName).toPath());
    int run = rh.exec();
    if (run != 0) {
      throw new ServiceException("Problem in running the model.");
    }
  }


  @Override
  public void postProcess() {
    results().put("AoAID", aoaId, "Area of Analysis Identifier");
    results().put("rhem_site_id", rhemSiteId, "RHEM Evaluation Site Identifier");
    results().put("CLEN", parameter.getClen());
    results().put("UNITS", "metric");
    results().put("DIAMS", parameter.getDiams());
    results().put("DENSITY", parameter.getDensity());
    results().put("LEN", parameter.getLen());
    results().put("CHEZY", parameter.getChezy());
    results().put("RCHEZY", parameter.getRchezy());
    results().put("SL", parameter.getSl());
    results().put("SX", parameter.getSx());
    results().put("CV", parameter.getCv());
    results().put("SAT", parameter.getSat());
    results().put("KSS", parameter.getKss());
    results().put("KOMEGA", parameter.getKomega());
    results().put("KCM", parameter.getKcm());
    results().put("KE", parameter.getKe());
    results().put("G", parameter.getG());
    results().put("DIST", parameter.getDist());
    results().put("POR", parameter.getPor());
    results().put("ADF", parameter.getAdf());
    results().put("ALF", parameter.getAlf());
    results().put("BARE", parameter.getBare());
    results().put("FRACT", parameter.getFract());
    results().put(new File(getWorkspaceDir(), parameterFileName), "Parameter input file");
    results().put(new File(getWorkspaceDir(), stormFileName), "Storm input file");
    results().put(new File(getWorkspaceDir(), summaryFileName), "Summary file");
    results().put(new File(getWorkspaceDir(), detailedOutputFileName), "Detailed");
  }
}