docs: private void writeMultipleExp(String arg0, Map result) throws FileNotFoundException, IOException {
  
          arg0 = revisePath(arg0);
          ArrayList<HashMap> expArr = getObjectOr(result, "experiments", new ArrayList());
          ArrayList<HashMap> soilArr = getObjectOr(result, "soils", new ArrayList());
          ArrayList<HashMap> wthArr = getObjectOr(result, "weathers", new ArrayList());
  
          // Setup output file
          Calendar cal = Calendar.getInstance();
          if (!expArr.isEmpty() && soilArr.isEmpty() && wthArr.isEmpty()) {
              outputFile = new File(arg0 + "AGMIP_DSSAT_EXPERIMENTS_" + cal.getTimeInMillis() + ".zip");
          } else if (expArr.isEmpty() && !soilArr.isEmpty() && wthArr.isEmpty()) {
              outputFile = new File(arg0 + "AGMIP_DSSAT_SOILS_" + cal.getTimeInMillis() + ".zip");
          } else if (expArr.isEmpty() && soilArr.isEmpty() && !wthArr.isEmpty()) {
              outputFile = new File(arg0 + "AGMIP_DSSAT_WEATHERS_" + cal.getTimeInMillis() + ".zip");
          } else {
              outputFile = new File(arg0 + "AGMIP_DSSAT_" + cal.getTimeInMillis() + ".zip");
          }
  
          // Write files
          String soil_id;
          String wth_id;
          expArr = combineExps(expArr);
          for (HashMap expData : expArr) {
              ArrayList<HashMap> rootArr = getObjectOr(expData, "dssat_root", new ArrayList());
              if (rootArr.isEmpty()) {
                  soil_id = getObjectOr(expData, "soil_id", "");
                  wth_id = getObjectOr(expData, "wst_id", "");
                  expData.put("soil", getSectionDataWithNocopy(soilArr, "soil_id", soil_id));
                  expData.put("weather", getSectionDataWithNocopy(wthArr, "wst_id", wth_id));
                  recordSWData(expData, new DssatSoilOutput());
                  recordSWData(expData, new DssatWeatherOutput());
              } else {
                  ArrayList<HashMap> soilArrTmp = new ArrayList();
                  ArrayList<HashMap> wthArrTmp = new ArrayList();
                  for (HashMap rootData : rootArr) {
                      soil_id = getObjectOr(rootData, "soil_id", "");
                      wth_id = getObjectOr(rootData, "wst_id", "");
                      HashMap soilTmp = new HashMap();
                      HashMap wthTmp = new HashMap();
                      soilTmp.put("soil", getSectionDataWithNocopy(soilArr, "soil_id", soil_id));
                      soilTmp.put("soil_id", soil_id);
                      soilTmp.put("exname", rootData.get("exname"));
                      soilTmp.put("id", rootData.get("id"));
                      wthTmp.put("weather", getSectionDataWithNocopy(wthArr, "wst_id", wth_id));
                      wthTmp.put("wst_id", wth_id);
                      recordSWData(soilTmp, new DssatSoilOutput());
                      recordSWData(wthTmp, new DssatWeatherOutput());
                      soilArrTmp.add((HashMap) soilTmp.get("soil"));
                      wthArrTmp.add(wthTmp);
                      rootData.put("wst_id", getObjectOr(wthTmp, "wst_id", wth_id));
                      rootData.put("soil_id", getObjectOr(soilTmp, "soil_id", wth_id));
                  }
                  expData.put("soil", soilArrTmp);
                  expData.put("weather", wthArrTmp);
              }
              String exname = getValueOr(expData, "exname", "N/A");
              //            DssatCommonOutput[] outputs = {
  //                new DssatXFileOutput(),
  //                new DssatAFileOutput(),
  //                new DssatTFileOutput(),
  //                new DssatCulFileOutput(),};
              writeSingleExp(arg0, expData, new DssatXFileOutput(), exname + "_X");
              writeSingleExp(arg0, expData, new DssatAFileOutput(), exname + "_A");
              writeSingleExp(arg0, expData, new DssatTFileOutput(), exname + "_T");
              writeSingleExp(arg0, expData, new DssatCulFileOutput(), exname + "_Cul");
          }
  
          // If experiment data is included
          if (!expArr.isEmpty()) {
              // Write all batch files
              futFiles.put("DSSBatch.v45", executor.submit(new DssatTranslateRunner(new DssatBatchFileOutput(DssatVersion.DSSAT45), expArr, arg0)));
              futFiles.put("DSSBatch.v46", executor.submit(new DssatTranslateRunner(new DssatBatchFileOutput(DssatVersion.DSSAT46), expArr, arg0)));
              futFiles.put("Run45.bat", executor.submit(new DssatTranslateRunner(new DssatRunFileOutput(DssatVersion.DSSAT45), expArr, arg0)));
              futFiles.put("Run46.bat", executor.submit(new DssatTranslateRunner(new DssatRunFileOutput(DssatVersion.DSSAT46), expArr, arg0)));
          } // If only weather or soil data is included
          else {
              for (HashMap sData : soilArr) {
                  HashMap tmp = new HashMap();
                  tmp.put("soil", sData);
                  tmp.put("soil_id", getObjectOr(sData, "soil_id", ""));
                  recordSWData(tmp, new DssatSoilOutput());
              }
              for (HashMap wData : wthArr) {
                  HashMap tmp = new HashMap();
                  tmp.put("weather", wData);
                  tmp.put("wst_id", getObjectOr(wData, "wst_id", ""));
                  recordSWData(tmp, new DssatWeatherOutput());
              }
          }
  
          // Write soil and weather files
          writeWthFiles(arg0);
          writeSoilFiles(arg0);
  
          // compress all output files into one zip file
          //createZip();
      }