BwUniCluster2.0/Software/Mathematica: Difference between revisions

From bwHPC Wiki
Jump to navigation Jump to search
mNo edit summary
No edit summary
Line 7: Line 7:
|-
|-
| Availability
| Availability
| [[bwUniCluster]]
| [[bwUniCluster]] | [[bwForCluster_MLS&WISO_Production]]
|-
|-
| License
| License
Line 138: Line 138:
The helper functions kernel1 and kernel2 get started in different threads and then they execute f and g. The output of these functions is redirected to different files so the results can clearly be distinguished and examined as soon as one function is done.
The helper functions kernel1 and kernel2 get started in different threads and then they execute f and g. The output of these functions is redirected to different files so the results can clearly be distinguished and examined as soon as one function is done.


[[Category:Mathematics software]] [[Category:bwUniCluster]]
[[Category:Mathematics software]] [[Category:bwUniCluster]] [[Category:bwForCluster_MLS&WISO_Production]]

Revision as of 15:38, 8 April 2016

Description Content
module load math/mathematica
Availability bwUniCluster | bwForCluster_MLS&WISO_Production
License Commercial. See Mathematica Pricing.
Citing n/a
Links Homepage | Documentation
Graphical Interface Yes (See VNC)
Comments Mathematica might not be available on all locations and clusters.

Description

Mathematica is a software from Wolfram for symbolic and numerical computation with many features such as powerful visualization and application specific functions.

Versions and Availability

A list of versions currently available on all bwHPC-C5-Clusters can be obtained from the
Cluster Information System CIS {{#widget:Iframe |url=https://cis-hpc.uni-konstanz.de/prod.cis/bwUniCluster/math/mathematica |width=90% |height=200 |border=0 }}

Loading

To check if Mathematica is available execute

$ module avail math/mathematica

If Mathematica is available you can load a specific version or you can load the default version with

$ module load math/mathematica

General Usage

Mathematica can be used interactively on the command line or with a graphical front-end. Alternatively Mathematica can run a script in batch mode which is useful when submitting batch jobs to the cluster. After loading Mathematica the different modes can be used as follows.

  • Interactive with command line:
    $ math
  • Non-Interactive. Looks like interactive with command line but input is taken from script.m:
    $ math < script.m
  • Non-Interactive. You have to explicitly specify what you want to print
    $ math -script script.m
    However, the output is done in InputForm which is suitable for input in other Mathematica calculations but if you want pretty output you have to change the output format to OutputForm like this
    SetOptions[$Output, FormatType -> OutputForm]

For an introduction to Mathematica we refer to the online documentation (Mathematica Documentation Center). Specific information on the use in a compute cluster is in the next section.

Parallel Computation

Obviously parallel computation can be useful to speed up time-consuming computations, but it should also be used for multiple computations with different input data files (e.g. for parametric studies). The reason for this is the license model from Wolfram. There are two types of licenses.

  • Each time an instance of Mathematica starts, a so called MathKernel license is used up.
  • Each time Mathematica spawns a subprocess, a license called SubMathKernel is used up.

Because usually there are much more SubMathKernel licenses than MathKernel licenses it is recommended to start multiple subprocesses instead of submitting multiple jobs.

Remember to request the correct amount of processors in your Batch Jobs script but note that Mathematica will not automatically use these processors. In general you have to adjust your code to benefit from more cores. To do this you first have to start a number of kernels which are then used by ParallelTable to run the computations in parallel. This basic example computes the first eight square numbers in parallel.

LaunchKernels[8]
f[i_] := i^2
DistributeDefinitions[f]
ParallelTable[f[i], {i,0,7}]
CloseKernels[]

Note that the use of DistributeDefinitions is necessary for f is a user defined function and the definition of this function must be available to all kernels.

The next example is the computation of a numerical solution for the following initial value problem

x'(t) = x(t)^2 - x(t)^3
x(0) = d

It is difficult to solve this equation with high accuracy at the point 1/d. We decrease the step size of the algorithm to see how the execution time and the relative error at the point 1/d change.

d = 0.00001

y[t_] := 1/(ProductLog[(1/d-1)*Exp[1/d-1-t]]+1)	(* analytical solution *)
relerr[t_, s_] := Abs[(y[t] - x[t]/.s)/y[t]]			(* relative error of solution s at time t *)
g[v_] := {v[[1]], v[[2]][[1]], relerr[1/d, v[[2]][[2]][[1]]]}	(* helper function *)

(* compute numerical solutions for 6 different step sizes *)
LaunchKernels[6]
tbl = ParallelTable[{step, Timing[NDSolve[{x'[t] == x[t]^2 - x[t]^3, x[0] == d}, x, {t, 0, 2/d}, MaxStepSize->step, MaxSteps->10000000]]}, {step,5,3,-0.4}]
CloseKernels[]

SetOptions[$Output, FormatType -> OutputForm]    (* better output when called with -script *)
Print[ Grid[Join[{{"Stepsize", "Time", "Error at 1/d"}}, Map[g, tbl]]] ]    (* print the result *)

Mathematica features some further functions similar to ParallelTable which are documented on the Mathematica parallel computing webpage from Wolfram. One such function is ParallelSubmit which can be used to start two (or more) completely unrelated functions in parallel. But bear in mind that the functions should have similar running times because the scheduler reserves the requested resources for the runtime of the whole job. The following code shows how to pack two 1-core jobs into one 2-core job.

f[r_] := (
    d = 0.000001;
    {time, sol} = Timing[NDSolve[{x'[t] == r*x[t]^2 - x[t]^3, x[0] == d}, x, {t, 0, 2/d}, MaxStepSize->3, MaxSteps->10000000]];
    {time, x[1/d]/.sol[[1]]}
)

g[r_] := (
    {time, sol} = Timing[NDSolve[{y''[t] + (r+1)*y'[t] + r*y[t] == 0, y[0] == 1, y'[0] == 0},  y, {t, 0, 30}, MaxStepSize->0.000002, MaxSteps->10000000000]];
    {time, y[30]/.sol[[1]]}
)

kernel1 := (
    file = OpenWrite["out1.txt", FormatType -> OutputForm];
    $Output = {file};
    Print[f[1.2]];
    Close[file];
)

kernel2 := (
    file = OpenWrite["out2.txt", FormatType -> OutputForm];
    $Output = {file};
    Print[g[1000]];
    Close[file];
)

LaunchKernels[2]
DistributeDefinitions[kernel1, kernel2]
e = {ParallelSubmit[kernel1], ParallelSubmit[kernel2]}
WaitAll[e]

The helper functions kernel1 and kernel2 get started in different threads and then they execute f and g. The output of these functions is redirected to different files so the results can clearly be distinguished and examined as soon as one function is done.