public CModel createModel(CCopasiDataModel dataModel) {
   try {
     dataModel.newModel();
   } catch (Exception e) {
     return null;
   }
   CModel model = dataModel.getModel();
   model.setVolumeUnit(CModel.fl);
   model.setTimeUnit(CModel.s);
   model.setQuantityUnit(CModel.fMol);
   CCompartment comp = model.createCompartment("CompartmentA");
   CMetab A = model.createMetabolite("A", comp.getObjectName());
   A.setInitialConcentration(2.0e-4);
   CMetab B = model.createMetabolite("B", comp.getObjectName());
   B.setInitialConcentration(0.0);
   CReaction react = model.createReaction("Decay_1");
   react.addSubstrate(A.getKey());
   react.addProduct(B.getKey());
   react.setReversible(false);
   react.setFunction("Mass action (irreversible)");
   react.setParameterValue("k1", 0.5);
   StringStdVector mapping = new StringStdVector();
   mapping.add(react.getChemEq().getSubstrate(0).getMetabolite().getKey());
   react.setParameterMappingVector(
       react.getFunction().getVariables().getParameter(1).getObjectName(), mapping);
   ;
   model.compileIfNecessary();
   ObjectStdVector changedObjects = new ObjectStdVector();
   changedObjects.add(comp.getObject(new CCopasiObjectName("Reference=InitialVolume")));
   changedObjects.add(A.getObject(new CCopasiObjectName("Reference=InitialConcentration")));
   changedObjects.add(B.getObject(new CCopasiObjectName("Reference=InitialConcentration")));
   changedObjects.add(
       react.getParameters().getParameter(0).getObject(new CCopasiObjectName("Reference=Value")));
   model.updateInitialValues(changedObjects);
   return model;
 }
 public static CSteadyStateTask runSteadyStateCalculation(
     CCopasiDataModel dataModel,
     HashMap<String, Object> problemParameters,
     HashMap<String, Object> methodParameters) {
   CSteadyStateTask steadyStateTask =
       (CSteadyStateTask) dataModel.addTask(CCopasiTask.steadyState);
   if (steadyStateTask == null) return null;
   CSteadyStateProblem steadyStateProblem = (CSteadyStateProblem) steadyStateTask.getProblem();
   if (steadyStateProblem == null) return null;
   Set<String> keySet = problemParameters.keySet();
   for (Iterator<String> it = keySet.iterator(); it.hasNext(); ) {
     String key = (String) it.next();
     CCopasiParameter param = steadyStateProblem.getParameter(key);
     if (param == null) {
       return null;
     }
     Object o = problemParameters.get(key);
     if (o instanceof Double) {
       param.setDblValue(((Double) o).doubleValue());
     } else if (o instanceof Integer) {
       param.setIntValue(((Integer) o).intValue());
     } else if (o instanceof Boolean) {
       param.setBoolValue(((Boolean) o).booleanValue());
     } else if (o instanceof String) {
       param.setStringValue(((String) o));
     } else {
       System.err.println("Error. Unknown parameter type.");
     }
   }
   CNewtonMethod newtonMethod = (CNewtonMethod) steadyStateTask.getMethod();
   if (newtonMethod == null) {
     return null;
   }
   keySet = methodParameters.keySet();
   for (Iterator<String> it = keySet.iterator(); it.hasNext(); ) {
     String key = (String) it.next();
     CCopasiParameter param = newtonMethod.getParameter(key);
     if (param == null) {
       return null;
     }
     Object o = methodParameters.get(key);
     if (o instanceof Double) {
       param.setDblValue(((Double) o).doubleValue());
     } else if (o instanceof Integer) {
       param.setIntValue(((Integer) o).intValue());
     } else if (o instanceof Boolean) {
       param.setBoolValue(((Boolean) o).booleanValue());
     } else if (o instanceof String) {
       param.setStringValue(((String) o));
     } else {
       System.err.println("Error. Unknown parameter type.");
     }
   }
   boolean result = false;
   try {
     result = steadyStateTask.process(true);
   } catch (Exception e) {
     System.err.println("ERROR: " + e.getMessage());
   }
   if (!result) {
     return null;
   }
   return steadyStateTask;
 }