Skip to main content

kernel - Evaluator option for Mathematica Scripts


I have mathematica with many additional kernels besides Local ( e.g., core1, core2, core3, core4 ... ) added through Kernel Configuration Options. I have been running multiple copies of a simulation (mycalculation.nb) in these different cores. The kernel for each notebook was set using this function:


SetOptions[EvaluationNotebook[], Evaluator -> "corei"];

where corei is core1, core 2, .. etc. So all kernels run in parallel without interfering with each other. Now I am trying to automate this and use Mathematica Scripts to run each kernel with my code converted into Input Form (mycalculation.m). When I do that, the above line gives this error message since the "Evaluator" seems to be defined for front end and notebook interface only:


FrontEndObject::notavail: A front end is not available; certain operations require a front end.

Note that my code in "mathematica scripts" form works fine when I skip the "Evaluator" definition. Is there a corresponding option that I can put in the file (mycalculation.m) or in the command line, which is;


 MathKernel -noprompt -run "<

so that I can tell MathKernel to execute the rest of the code not in the local kernel but in some other kernel. I could not find it myself.



Answer



You can obtain kernel IDs with either, Kernels[] or ParallelEvaluate[$KernelID].


ids=ParallelEvaluate[$KernelID]


{1, 2, 3, 4}



kobjs=Kernels[]



{KernelObject[1, "local"], KernelObject[2, "local"], KernelObject[3, "local"], KernelObject[4, "local"]}



These can then be used with ParallelEvaluate to specify which kernel you wish to run your code on.


Set all the cells you want to evaluate in your .m file to be initialization cells.


Then you can run that .m file on whichever kernels you like from either a notebook file or another .m file:


ParallelEvaluate[Get["/mypath/myscriptfile.m"];,{1,3}]

or by list of required IDs:



ParallelEvaluate[Get["/mypath/myscriptfile.m"];,ids]

or by list of required kernel objects:


ParallelEvaluate[Get["/mypath/myscriptfile.m"];,kobjs[[1;;3]]]

If you have different custom script files you want to run on their own core:


ParallelEvaluate[Get["/mypath/myscriptfile1.m"];,1]
ParallelEvaluate[Get["/mypath/myscriptfile2.m"];,2]
ParallelEvaluate[Get["/mypath/myscriptfile4.m"];,4]

Comments

Popular posts from this blog

plotting - Filling between two spheres in SphericalPlot3D

Manipulate[ SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, Mesh -> None, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], {n, 0, 1}] I cant' seem to be able to make a filling between two spheres. I've already tried the obvious Filling -> {1 -> {2}} but Mathematica doesn't seem to like that option. Is there any easy way around this or ... Answer There is no built-in filling in SphericalPlot3D . One option is to use ParametricPlot3D to draw the surfaces between the two shells: Manipulate[ Show[SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], ParametricPlot3D[{ r {Sin[t] Cos[1.5 Pi], Sin[t] Sin[1.5 Pi], Cos[t]}, r {Sin[t] Cos[0 Pi], Sin[t] Sin[0 Pi], Cos[t]}}, {r, 1, 2 - n}, {t, 0, Pi}, PlotStyle -> Yellow, Mesh -> {2, 15}]], {n, 0, 1}]

plotting - Plot 4D data with color as 4th dimension

I have a list of 4D data (x position, y position, amplitude, wavelength). I want to plot x, y, and amplitude on a 3D plot and have the color of the points correspond to the wavelength. I have seen many examples using functions to define color but my wavelength cannot be expressed by an analytic function. Is there a simple way to do this? Answer Here a another possible way to visualize 4D data: data = Flatten[Table[{x, y, x^2 + y^2, Sin[x - y]}, {x, -Pi, Pi,Pi/10}, {y,-Pi,Pi, Pi/10}], 1]; You can use the function Point along with VertexColors . Now the points are places using the first three elements and the color is determined by the fourth. In this case I used Hue, but you can use whatever you prefer. Graphics3D[ Point[data[[All, 1 ;; 3]], VertexColors -> Hue /@ data[[All, 4]]], Axes -> True, BoxRatios -> {1, 1, 1/GoldenRatio}]

plotting - Adding a thick curve to a regionplot

Suppose we have the following simple RegionPlot: f[x_] := 1 - x^2 g[x_] := 1 - 0.5 x^2 RegionPlot[{y < f[x], f[x] < y < g[x], y > g[x]}, {x, 0, 2}, {y, 0, 2}] Now I'm trying to change the curve defined by $y=g[x]$ into a thick black curve, while leaving all other boundaries in the plot unchanged. I've tried adding the region $y=g[x]$ and playing with the plotstyle, which didn't work, and I've tried BoundaryStyle, which changed all the boundaries in the plot. Now I'm kinda out of ideas... Any help would be appreciated! Answer With f[x_] := 1 - x^2 g[x_] := 1 - 0.5 x^2 You can use Epilog to add the thick line: RegionPlot[{y < f[x], f[x] < y < g[x], y > g[x]}, {x, 0, 2}, {y, 0, 2}, PlotPoints -> 50, Epilog -> (Plot[g[x], {x, 0, 2}, PlotStyle -> {Black, Thick}][[1]]), PlotStyle -> {Directive[Yellow, Opacity[0.4]], Directive[Pink, Opacity[0.4]],