Integrated Tinker Monte and gaussian applications with airavata
Project: http://git-wip-us.apache.org/repos/asf/airavata/repo Commit: http://git-wip-us.apache.org/repos/asf/airavata/commit/04054a7b Tree: http://git-wip-us.apache.org/repos/asf/airavata/tree/04054a7b Diff: http://git-wip-us.apache.org/repos/asf/airavata/diff/04054a7b Branch: refs/heads/master Commit: 04054a7b80855a2ff42309614f0832548b5ed206 Parents: 4269997 Author: shamrath <[email protected]> Authored: Tue Dec 23 14:19:25 2014 -0500 Committer: shamrath <[email protected]> Committed: Tue Dec 23 14:19:25 2014 -0500 ---------------------------------------------------------------------- .../client/samples/CreateLaunchExperiment.java | 4 +- .../client/samples/RegisterSampleData.java | 104 +++++++++++++++++++ .../tools/RegisterSampleApplications.java | 28 ++--- .../server/src/main/resources/PBSTemplate.xslt | 8 +- .../src/main/resources/SLURMTemplate.xslt | 4 + .../gfac/gsissh/util/GFACGSISSHUtils.java | 14 ++- .../src/test/resources/PBSTemplate.xslt | 5 + .../src/test/resources/SLURMTemplate.xslt | 3 + .../src/main/resources/SLURMTemplate.xslt | 4 + 9 files changed, 158 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/airavata/blob/04054a7b/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/samples/CreateLaunchExperiment.java ---------------------------------------------------------------------- diff --git a/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/samples/CreateLaunchExperiment.java b/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/samples/CreateLaunchExperiment.java index b2c5469..69e7b3c 100644 --- a/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/samples/CreateLaunchExperiment.java +++ b/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/samples/CreateLaunchExperiment.java @@ -82,8 +82,8 @@ public class CreateLaunchExperiment { public static void main(String[] args) throws Exception { airavataClient = AiravataClientFactory.createAiravataClient(THRIFT_SERVER_HOST, THRIFT_SERVER_PORT); System.out.println("API version is " + airavataClient.getAPIVersion()); -// registerApplications(); // run this only the first time - createAndLaunchExp(); + registerApplications(); // run this only the first time +// createAndLaunchExp(); } private static String fsdResourceId; http://git-wip-us.apache.org/repos/asf/airavata/blob/04054a7b/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/samples/RegisterSampleData.java ---------------------------------------------------------------------- diff --git a/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/samples/RegisterSampleData.java b/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/samples/RegisterSampleData.java index b00797c..df64095 100644 --- a/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/samples/RegisterSampleData.java +++ b/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/samples/RegisterSampleData.java @@ -25,9 +25,11 @@ import org.apache.airavata.api.Airavata; import org.apache.airavata.api.client.AiravataClientFactory; import org.apache.airavata.client.tools.RegisterSampleApplicationsUtils; import org.apache.airavata.model.appcatalog.appdeployment.ApplicationParallelismType; +import org.apache.airavata.model.appcatalog.appinterface.CommandLineType; import org.apache.airavata.model.appcatalog.appinterface.DataType; import org.apache.airavata.model.appcatalog.appinterface.InputDataObjectType; import org.apache.airavata.model.appcatalog.appinterface.OutputDataObjectType; +import org.apache.airavata.model.appcatalog.appinterface.ValidityType; import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription; import org.apache.airavata.model.appcatalog.computeresource.LOCALSubmission; import org.apache.airavata.model.appcatalog.computeresource.ResourceJobManager; @@ -55,6 +57,8 @@ public class RegisterSampleData { private String multiplyModuleId; private String subtractModuleId; private String sampleScriptDir; + private String monteXModuleId; + private String gaussianModuleId; public static void main(String[] args) throws AiravataClientConnectException, TException { RegisterSampleData registerSampleData = new RegisterSampleData(); @@ -118,6 +122,85 @@ public class RegisterSampleData { registerSubtractApplicationInterface(); registerMultiplyApplicationInterface(); registerEchoInterface(); + registerTinkerMonteInterface(); + registerGaussianInterface(); + } + + private void registerGaussianInterface() { + try { + System.out.println("#### Registering Gaussian Application Interface ####"); + + List<String> appModules = new ArrayList<String>(); + appModules.add(gaussianModuleId); + + InputDataObjectType input1 = RegisterSampleApplicationsUtils.createAppInput("MainInputFile", null, + DataType.URI, null, 1,null, null, false, "Gaussian main input file", null); + + List<InputDataObjectType> applicationInputs = new ArrayList<InputDataObjectType>(); + applicationInputs.add(input1); + + OutputDataObjectType output1 = RegisterSampleApplicationsUtils.createAppOutput("gaussian.out", + "", DataType.URI, null, null); + + List<OutputDataObjectType> applicationOutputs = new ArrayList<OutputDataObjectType>(); + applicationOutputs.add(output1); + + String addApplicationInterfaceId = airavataClient.registerApplicationInterface( + RegisterSampleApplicationsUtils.createApplicationInterfaceDescription("Gaussian", "Gaussian application", + appModules, applicationInputs, applicationOutputs)); + System.out.println("Gaussian Application Interface Id " + addApplicationInterfaceId); + + } catch (TException e) { + e.printStackTrace(); + } + } + + private void registerTinkerMonteInterface() { + try { + System.out.println("#### Registering Tinker Monte Application Interface ####"); + + List<String> appModules = new ArrayList<String>(); + appModules.add(monteXModuleId); + + InputDataObjectType input1 = RegisterSampleApplicationsUtils.createAppInput("xyzf", "O16.xyz", + DataType.STRING, null, 1, null, null, false, "Tinker monte input_1", null); + InputDataObjectType input2 = RegisterSampleApplicationsUtils.createAppInput("keyf", "O16.key", + DataType.STRING, "-k", 2, null, null, false, "Tinker monte input_2", null); + InputDataObjectType input3 = RegisterSampleApplicationsUtils.createAppInput("stps", "20000", + DataType.STRING, null, 3, null, null, false, "Tinker monte input_3", null); + InputDataObjectType input4 = RegisterSampleApplicationsUtils.createAppInput("Ctc", "C", + DataType.STRING, null, 4, null, null, false, "Tinker monte input_4", null); + InputDataObjectType input5 = RegisterSampleApplicationsUtils.createAppInput("stpsZ", "3.0", + DataType.STRING, null, 5, null, null, false, "Tinker monte input_5", null); + InputDataObjectType input6 = RegisterSampleApplicationsUtils.createAppInput("temp", "298", + DataType.STRING, null, 6, null, null, false, "Tinker monte input_6", null); + InputDataObjectType input7 = RegisterSampleApplicationsUtils.createAppInput("Rconv", "0.01", + DataType.STRING, null, 7, null, null, false, "Tinker monte input_7", null); + + + List<InputDataObjectType> applicationInputs = new ArrayList<InputDataObjectType>(); + applicationInputs.add(input1); + applicationInputs.add(input2); + applicationInputs.add(input3); + applicationInputs.add(input4); + applicationInputs.add(input5); + applicationInputs.add(input6); + applicationInputs.add(input7); + + OutputDataObjectType output1 = RegisterSampleApplicationsUtils.createAppOutput("Diskoutputfile_with_dir", + "", DataType.URI, null, null); + + List<OutputDataObjectType> applicationOutputs = new ArrayList<OutputDataObjectType>(); + applicationOutputs.add(output1); + + String addApplicationInterfaceId = airavataClient.registerApplicationInterface( + RegisterSampleApplicationsUtils.createApplicationInterfaceDescription("Tinker_Monte", "Monte application", + appModules, applicationInputs, applicationOutputs)); + System.out.println("Monte Application Interface Id " + addApplicationInterfaceId); + + } catch (TException e) { + e.printStackTrace(); + } } private void registerApplicationDeployments() throws TException { @@ -145,6 +228,18 @@ public class RegisterSampleData { RegisterSampleApplicationsUtils.createApplicationDeployment(subtractModuleId, localhostId, sampleScriptDir + "/subtract.sh", ApplicationParallelismType.SERIAL, "Subtract application description ", null)); System.out.println("Successfully registered Subtract application on localhost, application Id = " + subtractAppDeployId); + + //Register Tinker monte application + String tinkerMonteAppDeployId = airavataClient.registerApplicationDeployment( + RegisterSampleApplicationsUtils.createApplicationDeployment(monteXModuleId, localhostId, + sampleScriptDir + "/monte.x", ApplicationParallelismType.SERIAL, "Grid chem tinker monte application description ", null)); + System.out.println("Successfully registered tinker monte application on localhost, application Id = " + tinkerMonteAppDeployId); + + //Register Tinker monte application + String gaussianAppDeployId = airavataClient.registerApplicationDeployment( + RegisterSampleApplicationsUtils.createApplicationDeployment(gaussianModuleId, localhostId, + sampleScriptDir + "/gaussian.sh", ApplicationParallelismType.SERIAL, "Grid chem Gaussian application description ", null)); + System.out.println("Successfully registered Gaussian application on localhost, application Id = " + gaussianAppDeployId); } private void registerApplicationModules() throws TException { @@ -164,6 +259,15 @@ public class RegisterSampleData { subtractModuleId = airavataClient.registerApplicationModule( RegisterSampleApplicationsUtils.createApplicationModule( "Subtract", "1.0", "Subtract application description")); + //Register Monte + monteXModuleId = airavataClient.registerApplicationModule( + RegisterSampleApplicationsUtils.createApplicationModule( + "Tinker Monte", "1.0", "Grid chem tinker monte application description")); + + // Register gaussian application + gaussianModuleId = airavataClient.registerApplicationModule( + RegisterSampleApplicationsUtils.createApplicationModule( + "Gaussian", "1.0", "Grid Chem Gaussian application description")); } http://git-wip-us.apache.org/repos/asf/airavata/blob/04054a7b/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/tools/RegisterSampleApplications.java ---------------------------------------------------------------------- diff --git a/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/tools/RegisterSampleApplications.java b/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/tools/RegisterSampleApplications.java index 3bd9f29..19d0bfe 100644 --- a/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/tools/RegisterSampleApplications.java +++ b/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/tools/RegisterSampleApplications.java @@ -371,7 +371,7 @@ public class RegisterSampleApplications { //Registering Lammps registerLammpsInterface(); //Registrting Gamess - registerGamessInterface(); +// registerGamessInterface(); //Registering NWChem registerNWChemInterface(); @@ -868,7 +868,7 @@ public class RegisterSampleApplications { appModules.add(gaussianModuleId); InputDataObjectType input1 = RegisterSampleApplicationsUtils.createAppInput("MainInputFile", null, - DataType.URI, null, 1,null, null, false, "Gaussian main input file", null); + DataType.URI, null, 1, ValidityType.REQUIRED, CommandLineType.INCLUSIVE, false, "Gaussian main input file", null); List<InputDataObjectType> applicationInputs = new ArrayList<InputDataObjectType>(); applicationInputs.add(input1); @@ -897,20 +897,19 @@ public class RegisterSampleApplications { appModules.add(monteXModuleId); InputDataObjectType input1 = RegisterSampleApplicationsUtils.createAppInput("xyzf", "O16.xyz", - DataType.STRING, null, 1, null, null, false, "Tinker monte input_1", null); + DataType.URI, null, 1, ValidityType.REQUIRED, CommandLineType.INCLUSIVE, false, "Tinker monte input_1", null); InputDataObjectType input2 = RegisterSampleApplicationsUtils.createAppInput("keyf", "O16.key", - DataType.STRING, "-k", 2, null, null, false, "Tinker monte input_2", null); + DataType.URI, "-k", 2, ValidityType.REQUIRED, CommandLineType.INCLUSIVE, false, "Tinker monte input_2", null); InputDataObjectType input3 = RegisterSampleApplicationsUtils.createAppInput("stps", "20000", - DataType.STRING, null, 3, null, null,false, "Tinker monte input_3", null); + DataType.STRING, null, 3, ValidityType.REQUIRED, CommandLineType.INCLUSIVE, false, "Tinker monte input_3", null); InputDataObjectType input4 = RegisterSampleApplicationsUtils.createAppInput("Ctc", "C", - DataType.STRING, null, 4,null, null, false, "Tinker monte input_4", null); + DataType.STRING, null, 4, ValidityType.REQUIRED, CommandLineType.INCLUSIVE, false, "Tinker monte input_4", null); InputDataObjectType input5 = RegisterSampleApplicationsUtils.createAppInput("stpsZ", "3.0", - DataType.STRING, null, 5,null, null, false, "Tinker monte input_5", null); + DataType.STRING, null, 5, ValidityType.REQUIRED, CommandLineType.INCLUSIVE, false, "Tinker monte input_5", null); InputDataObjectType input6 = RegisterSampleApplicationsUtils.createAppInput("temp", "298", - DataType.STRING, null, 6,null, null, false, "Tinker monte input_6", null); + DataType.STRING, null, 6, ValidityType.REQUIRED, CommandLineType.INCLUSIVE, false, "Tinker monte input_6", null); InputDataObjectType input7 = RegisterSampleApplicationsUtils.createAppInput("Rconv", "0.01", - DataType.STRING, null, 7,null, null, false, "Tinker monte input_7", null); - + DataType.STRING, null, 7, ValidityType.REQUIRED, CommandLineType.INCLUSIVE, false, "Tinker monte input_7", null); List<InputDataObjectType> applicationInputs = new ArrayList<InputDataObjectType>(); applicationInputs.add(input1); @@ -998,9 +997,14 @@ public class RegisterSampleApplications { System.out.println("WRF on stampede deployment Id " + wrfAppDeployId); + List<String> monteXModuleCmds = new ArrayList<String>(); +// monteXModuleCmds.add("module load globus"); +// monteXModuleCmds.add("module load uberftp"); + monteXModuleCmds.add("module load fftw3"); + String monteXAppDeployId = airavataClient.registerApplicationDeployment( RegisterSampleApplicationsUtils.createApplicationDeployment(monteXModuleId, stampedeResourceId, - "/home1/00421/ccguser/apps/tinker/tinker/bin/monte.x", ApplicationParallelismType.OPENMP, monteXDescription, null)); + "/home1/00421/ccguser/apps/tinker/tinker/bin/monte.x", ApplicationParallelismType.OPENMP, monteXDescription, monteXModuleCmds)); System.out.println("Tinker Monte on trestles deployment Id " + monteXAppDeployId); } catch (TException e) { e.printStackTrace(); @@ -1052,7 +1056,7 @@ public class RegisterSampleApplications { gaussianMouldes.add("module load gaussian"); String gaussianAppDeployId = airavataClient.registerApplicationDeployment( RegisterSampleApplicationsUtils.createApplicationDeployment(gaussianModuleId, trestlesResourceId, - "g09", ApplicationParallelismType.OPENMP, gaussianDescription, null)); + "g09", ApplicationParallelismType.OPENMP, gaussianDescription, gaussianMouldes)); System.out.println("Gaussian on trestles deployment Id " + gaussianAppDeployId); } catch (TException e) { http://git-wip-us.apache.org/repos/asf/airavata/blob/04054a7b/modules/configuration/server/src/main/resources/PBSTemplate.xslt ---------------------------------------------------------------------- diff --git a/modules/configuration/server/src/main/resources/PBSTemplate.xslt b/modules/configuration/server/src/main/resources/PBSTemplate.xslt index ca02d79..2ed5d20 100644 --- a/modules/configuration/server/src/main/resources/PBSTemplate.xslt +++ b/modules/configuration/server/src/main/resources/PBSTemplate.xslt @@ -51,6 +51,11 @@ </xsl:when> </xsl:choose> <xsl:choose> + <xsl:when test="ns:usedMem"> + #PBS -l mem=<xsl:value-of select="ns:usedMem"/> + </xsl:when> + </xsl:choose> + <xsl:choose> <xsl:when test="(ns:nodes) and (ns:processesPerNode)"> #PBS -l nodes=<xsl:value-of select="ns:nodes"/>:ppn=<xsl:value-of select="ns:processesPerNode"/> <xsl:text>
</xsl:text> @@ -62,7 +67,8 @@ export<xsl:text> </xsl:text><xsl:value-of select="."/> <xsl:text>
</xsl:text> </xsl:for-each> <xsl:for-each select="ns:preJobCommands/ns:command"> - <xsl:value-of select="."/><xsl:text> </xsl:text> + <xsl:text>
</xsl:text> + <xsl:value-of select="."/><xsl:text> </xsl:text> </xsl:for-each> cd <xsl:text> </xsl:text><xsl:value-of select="ns:workingDirectory"/><xsl:text>
</xsl:text> <xsl:choose><xsl:when test="ns:jobSubmitterCommand != ''"> http://git-wip-us.apache.org/repos/asf/airavata/blob/04054a7b/modules/configuration/server/src/main/resources/SLURMTemplate.xslt ---------------------------------------------------------------------- diff --git a/modules/configuration/server/src/main/resources/SLURMTemplate.xslt b/modules/configuration/server/src/main/resources/SLURMTemplate.xslt index b494cc0..9acdfd6 100644 --- a/modules/configuration/server/src/main/resources/SLURMTemplate.xslt +++ b/modules/configuration/server/src/main/resources/SLURMTemplate.xslt @@ -64,6 +64,10 @@ #SBATCH -e <xsl:value-of select="ns:standardErrorFile"/> </xsl:when> </xsl:choose> + <xsl:for-each select="ns:preJobCommands/ns:command"> + <xsl:text>
</xsl:text> + <xsl:value-of select="."/><xsl:text> </xsl:text> + </xsl:for-each> cd <xsl:text> </xsl:text><xsl:value-of select="ns:workingDirectory"/><xsl:text>
</xsl:text> <xsl:choose><xsl:when test="ns:jobSubmitterCommand"> <xsl:value-of select="ns:jobSubmitterCommand"/><xsl:text> </xsl:text></xsl:when></xsl:choose><xsl:value-of select="ns:executablePath"/><xsl:text> </xsl:text> http://git-wip-us.apache.org/repos/asf/airavata/blob/04054a7b/modules/gfac/gfac-gsissh/src/main/java/org/apache/airavata/gfac/gsissh/util/GFACGSISSHUtils.java ---------------------------------------------------------------------- diff --git a/modules/gfac/gfac-gsissh/src/main/java/org/apache/airavata/gfac/gsissh/util/GFACGSISSHUtils.java b/modules/gfac/gfac-gsissh/src/main/java/org/apache/airavata/gfac/gsissh/util/GFACGSISSHUtils.java index e471c77..68e0072 100644 --- a/modules/gfac/gfac-gsissh/src/main/java/org/apache/airavata/gfac/gsissh/util/GFACGSISSHUtils.java +++ b/modules/gfac/gfac-gsissh/src/main/java/org/apache/airavata/gfac/gsissh/util/GFACGSISSHUtils.java @@ -41,6 +41,7 @@ import org.apache.airavata.gsi.ssh.impl.GSISSHAbstractCluster; import org.apache.airavata.gsi.ssh.impl.PBSCluster; import org.apache.airavata.gsi.ssh.util.CommonUtils; import org.apache.airavata.model.appcatalog.appdeployment.ApplicationDeploymentDescription; +import org.apache.airavata.model.appcatalog.appinterface.CommandLineType; import org.apache.airavata.model.appcatalog.appinterface.InputDataObjectType; import org.apache.airavata.model.appcatalog.computeresource.*; import org.apache.airavata.model.appcatalog.gatewayprofile.ComputeResourcePreference; @@ -213,9 +214,13 @@ public class GFACGSISSHUtils { } } for (InputDataObjectType inputDataObjectType : sortedInputSet) { + if (inputDataObjectType.getAddedToCommandLine() != null + && inputDataObjectType.getAddedToCommandLine() == CommandLineType.EXCLUSIVE) { + continue; + } if (inputDataObjectType.getApplicationArgument() != null && !inputDataObjectType.getApplicationArgument().equals("")) { - inputValues.add(inputDataObjectType.getApplicationArgument()); + inputValues.add(inputDataObjectType.getApplicationArgument()); } if (inputDataObjectType.getValue() != null @@ -269,7 +274,14 @@ public class GFACGSISSHUtils { logger.error("Task scheduling cannot be null at this point.."); } + ApplicationDeploymentDescription appDepDescription = jobExecutionContext.getApplicationContext().getApplicationDeploymentDescription(); + List<String> moduleCmds = appDepDescription.getModuleLoadCmds(); + if (moduleCmds != null) { + for (String moduleCmd : moduleCmds) { + jobDescriptor.addPreJobCommand(moduleCmd); + } + } return jobDescriptor; } } http://git-wip-us.apache.org/repos/asf/airavata/blob/04054a7b/modules/gfac/gfac-gsissh/src/test/resources/PBSTemplate.xslt ---------------------------------------------------------------------- diff --git a/modules/gfac/gfac-gsissh/src/test/resources/PBSTemplate.xslt b/modules/gfac/gfac-gsissh/src/test/resources/PBSTemplate.xslt index e749e9c..4c49bd8 100644 --- a/modules/gfac/gfac-gsissh/src/test/resources/PBSTemplate.xslt +++ b/modules/gfac/gfac-gsissh/src/test/resources/PBSTemplate.xslt @@ -45,6 +45,11 @@ </xsl:when> </xsl:choose> <xsl:choose> + <xsl:when test="ns:usedMem"> +#PBS -l mem=<xsl:value-of select="ns:usedMem"/> + </xsl:when> + </xsl:choose> + <xsl:choose> <xsl:when test="(ns:nodes) and (ns:processesPerNode)"> #PBS -l nodes=<xsl:value-of select="ns:nodes"/>:ppn=<xsl:value-of select="ns:processesPerNode"/> <xsl:text>
</xsl:text> http://git-wip-us.apache.org/repos/asf/airavata/blob/04054a7b/modules/integration-tests/src/test/resources/SLURMTemplate.xslt ---------------------------------------------------------------------- diff --git a/modules/integration-tests/src/test/resources/SLURMTemplate.xslt b/modules/integration-tests/src/test/resources/SLURMTemplate.xslt index 169dbbf..31d34de 100644 --- a/modules/integration-tests/src/test/resources/SLURMTemplate.xslt +++ b/modules/integration-tests/src/test/resources/SLURMTemplate.xslt @@ -58,6 +58,9 @@ #SBATCH -e <xsl:value-of select="ns:standardErrorFile"/> </xsl:when> </xsl:choose> + <xsl:for-each select="ns:preJobCommands/ns:command"> + <xsl:value-of select="."/><xsl:text> </xsl:text> + </xsl:for-each> cd <xsl:text> </xsl:text><xsl:value-of select="ns:workingDirectory"/><xsl:text>
</xsl:text> <xsl:choose><xsl:when test="ns:jobSubmitterCommand"> <xsl:value-of select="ns:jobSubmitterCommand"/><xsl:text> </xsl:text></xsl:when></xsl:choose><xsl:value-of select="ns:executablePath"/><xsl:text> </xsl:text> http://git-wip-us.apache.org/repos/asf/airavata/blob/04054a7b/tools/gsissh/src/main/resources/SLURMTemplate.xslt ---------------------------------------------------------------------- diff --git a/tools/gsissh/src/main/resources/SLURMTemplate.xslt b/tools/gsissh/src/main/resources/SLURMTemplate.xslt index a752608..4a62722 100644 --- a/tools/gsissh/src/main/resources/SLURMTemplate.xslt +++ b/tools/gsissh/src/main/resources/SLURMTemplate.xslt @@ -63,6 +63,10 @@ #SBATCH -e <xsl:value-of select="ns:standardErrorFile"/> </xsl:when> </xsl:choose> + <xsl:for-each select="ns:preJobCommands/ns:command"> + <xsl:text>
</xsl:text> + <xsl:value-of select="."/><xsl:text> </xsl:text> + </xsl:for-each> cd <xsl:text> </xsl:text><xsl:value-of select="ns:workingDirectory"/><xsl:text>
</xsl:text> <xsl:choose><xsl:when test="ns:jobSubmitterCommand"> <xsl:value-of select="ns:jobSubmitterCommand"/><xsl:text> </xsl:text></xsl:when></xsl:choose><xsl:value-of select="ns:executablePath"/><xsl:text> </xsl:text>
