.. _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 "<