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;
 }
  private void CompleteReaction(CReaction reaction, int numSubst, int numProd) {
    reaction.setReversible(false);
    // we need to get the function from the function database
    CFunctionDB funcDB = CCopasiRootContainer.getFunctionList();
    // it should be in the list of suitable functions
    // lets get all suitable functions for an irreversible reaction with  numSubst substrates and
    // numProd products
    CFunctionStdVector suitableFunctions =
        funcDB.suitableFunctions(numSubst, numProd, COPASI.TriFalse);
    int i;
    int iMax = (int) suitableFunctions.size();
    for (i = 0; i < iMax; ++i) {
      // we just assume that the only suitable function with Constant in
      // it's name is the one we want
      // if (suitableFunctions.get(i).getObjectName().indexOf("Constant") != -1) {
      if (suitableFunctions
          .get(i)
          .getObjectName()
          .contains("Mass action (irreversible)")) { // "Mass action (irreversible)"  //
        // "Michaelis-Menten"
        break;
      }
    }
    System.out.println("      Function: " + i + "/" + iMax);
    if (i < iMax) {
      // we set the function.
      // => the method should be smart enough to associate the reaction entities with the correct
      // function parameters
      reaction.setFunction(suitableFunctions.get(i));

      // TaskVectorN taskVector = dataModel.getTaskList();
      // dataModel.getTask(0).getProblem();
      CCopasiParameterGroup parameterGroup = reaction.getParameters();
      CCopasiParameter parameter;
      //  "Mass action (irreversible)" function has only one parameter k1
      parameter = parameterGroup.getParameter("k1");
      parameter.setDblValue(0.1);

      // michaelis-Menten
      /*
      parameter= parameterGroup.getParameter("V"); //  Michaelis-Menten has 2 parameters: V and Km
      parameter.setDblValue(20);
      parameter= parameterGroup.getParameter("Km"); //  "Mass action (irreversible)" function has only one parameter k1
      parameter.setDblValue(10);
      */
      //                    for (i = 0; i < parameterGroup.size(); i++) {
      //
      // //System.out.println(parameterGroup.getParameter(i).getObjectName());
      //                        parameterGroup.removeParameter(i);
      //                    }
      //                    String paramName;
      //                    i=0;
      //                    //for (i = 0; i < numSubst; i++) {
      //                        paramName = "k"+(i+1); //metabolite_"+i+"_K";
      //                        parameterGroup.addParameter(paramName, CCopasiParameter.DOUBLE);
      //                        CCopasiParameter parameter=parameterGroup.getParameter(paramName);
      //                        parameter.setDblValue(0.1);
      //                        changedObjects.add(parameter.getValueReference());
      //                    //}
    } else {
      System.err.println("Error. Could not find suitable function.");
      System.exit(1);
    }
  }