.. _mathematica:
===========
Mathematica
===========
.. contents:: In this section:
:local:
:depth: 2
Description
===========
According to the `page of Mathematica `_, Mathematica defines the state of the art in technical computing, providing the leading computation environment for millions of innovators, educators, and students worldwide.
Available Versions
==================
* mathematica/9.0
* mathematica/10.4 (default)
Serial Job Submission
=====================
.. code-block:: bash
:caption: submit_mathematica_serial.sh
#!/bin/bash
#SBATCH -J mathematica_serial
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 05:00:00
#SBATCH --mem=8G
export INPUT="script.m"
export OUTPUT="script.out"
module load mathematica
job-nanny math -script script.m > script.out
Job Submission with MathKernel
==============================
.. code-block:: bash
:caption: submit_mathematica_kernel.sh
#!/bin/bash
#SBATCH -J mathematica_kernel
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 12:00:00
#SBATCH --mem=16G
export INPUT="calculation.m"
export OUTPUT="calculation.out"
module load mathematica
# Start kernel and execute
job-nanny math -noprompt -run "< calculation.out
Job Submission with Parallelism
===============================
.. code-block:: bash
:caption: submit_mathematica_parallel.sh
#!/bin/bash
#SBATCH -J mathematica_parallel
#SBATCH -N 1
#SBATCH -c 8
#SBATCH -t 24:00:00
#SBATCH --mem=32G
export INPUT="parallel.m"
export OUTPUT="parallel.out"
module load mathematica
# Create script with parallel configuration
cat > run_parallel.m << EOF
LaunchKernels[$SLURM_CPUS_PER_TASK]
Get["parallel.m"]
CloseKernels[]
EOF
job-nanny math -noprompt -run "< parallel.out
Mathematica Script Example
==========================
.. code-block:: mathematica
:caption: calculation.m
(* Intensive numerical calculation *)
n = 1000;
matrix = RandomReal[{0,1}, {n, n}];
eigenvalues = Eigenvalues[matrix];
Print["Largest eigenvalue: ", Max[eigenvalues]];
Print["Smallest eigenvalue: ", Min[eigenvalues]];
(* Numerical integration *)
f[x_] := Sin[x]^2 * Exp[-x/10];
integral = NIntegrate[f[x], {x, 0, 100}];
Print["Integral: ", integral];
(* Curve fitting *)
data = Table[{x, 2*Sin[x] + RandomReal[{-0.1,0.1}]}, {x, 0, 2Pi, 0.1}];
fit = NonlinearModelFit[data, a*Sin[b*x + c], {a, b, c}, x];
Print["Fit parameters: ", fit["BestFitParameters"]];
Export["results.txt", {eigenvalues[[1;;10]], integral, fit["BestFit"]}];
Job Array for Multiple Parameters
=================================
.. code-block:: bash
:caption: submit_mathematica_array.sh
#!/bin/bash
#SBATCH -J mathematica_array
#SBATCH --array=1-10
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 12:00:00
#SBATCH --mem=8G
PARAM=$SLURM_ARRAY_TASK_ID
export INPUT="template.m"
export OUTPUT="run_${PARAM}/"
module load mathematica
mkdir -p run_${PARAM}
cd run_${PARAM}
# Create script with specific parameter
cat > run.m << EOF
parameter = $PARAM;
Print["Running with parameter = ", parameter];
(* Parameter-dependent calculation *)
result = NIntegrate[Sin[parameter*x]^2, {x, 0, 10}];
Print["Result: ", result];
Export["result_${PARAM}.txt", {parameter, result}];
EOF
job-nanny math -noprompt -run "< output_${PARAM}.log
Batch Data Processing
=====================
.. code-block:: bash
:caption: submit_mathematica_batch.sh
#!/bin/bash
#SBATCH -J mathematica_batch
#SBATCH -N 1
#SBATCH -c 4
#SBATCH -t 24:00:00
#SBATCH --mem=16G
export INPUT="data_*.csv"
export OUTPUT="analysis/"
module load mathematica
mkdir -p analysis
# Create script to process all files
cat > batch_process.m << EOF
files = FileNames["data_*.csv"];
results = {};
Do[
Print["Processing ", file];
data = Import[file, "CSV"];
(* Analysis *)
means = Mean[data];
stds = StandardDeviation[data];
AppendTo[results, {file, means, stds}];
(* Save individual results *)
Export["analysis/" <> FileBaseName[file] <> "_stats.txt",
{means, stds}, "Table"],
{file, files}];
(* General summary *)
Export["analysis/summary.txt", results, "Table"];
EOF
job-nanny math -noprompt -run "< plot.m << EOF
data = Import["data.txt", "Table"];
(* 2D plot *)
plot1 = ListPlot[data, PlotStyle -> PointSize[0.015],
AxesLabel -> {"X", "Y"},
PlotLabel -> "Experimental data"];
(* Histogram *)
plot2 = Histogram[Flatten[data], 30,
AxesLabel -> {"Value", "Frequency"}];
(* Export *)
Export["plot.pdf", GraphicsGrid[{{plot1}, {plot2}}]];
EOF
job-nanny math -noprompt -run "<