Julia and PyMAPDL#

If you like to work with Julia, you can use Python libraries as if they were Julia packages.

Install Julia#

To install Julia, go to their website and follow the instructions given in the Download section.

Set the Julia environment#

To have access to Python libraries within Julia, you must install the PyCall Julia package. To install it, run Julia and switch to the package manager by pressing the "]" key.

If you need to work with different package versions or applications, it is beneficial to create a virtual environment in Julia. To create a virtual environment, use the activate command with the name of the new environment that you want to create or activate.

pkg> activate julia_test
  Activating project at `C:/Users/USER/julia_test`

A message should appear, indicating that the new package (julia_test) has been activated. This environment name now precedes the command line.

(julia_test) pkg>

Next install the PyCall package by typing:

(julia_test) pkg> add PyCall

To use PyCall, press the backspace key to go to the Julia command line. The command line is then preceded by the name Julia.

julia>

Next use the PyCall package with:

julia> using PyCall

This should be enough to use packages included in a basic Python distribution.

For example:

julia> math = pyimport("math")
math.sin(math.pi/4) # returns ≈ 1/√2 = 0.70710678..

Install PyMAPDL in Julia#

PyCall includes a lightweight Python environment that uses Conda to manage and access Python packages. This environment, currently based on Python 3.9.7, includes the standard basic Python libraries. However, because it is a fully working Python environment, you can still use it from outside the Julia command line and install Python packages using pip.

To install PyMAPDL, first locate the Python executable with:

julia> PyCall.python
"C:\\Users\\USER\\.julia\\conda\\3\\python.exe"

In Linux, the preceding code prints the following, where python3 is the default Python3 installation for the operating system.

julia> PyCall.python
"python3"

Note

In Linux, there are no specific installation steps. You only need to add the Julia executable to the path. Hence, Julia’s Python installation path can differ from user to user. For example, if you uncompress the source files in /home/USER/Julia, Julia’s path is /home/USER/Julia/julia-1.7.2/bin.

You would use this Python executable to install PyMAPDL:

C:\Users\USER\.julia\conda\3\python.exe -m pip install ansys-mapdl-core

In Linux:, you would install with:

python3 -m pip install ansys-mapdl-core

Finally, after restarting Julia, you can import PyMAPDL using the same procedure as described earlier:

julia> using PyCall
julia> pymapdl = pyimport("ansys.mapdl.core")
PyObject <module 'ansys.mapdl.core' from 'C:\\Users\\USER\\.julia\\conda\\3\\lib\\site-packages\\ansys\\mapdl\\core\\__init__.py'>
julia> mapdl = pymapdl.launch_mapdl()
julia> print(mapdl.__str__())
Product:             Ansys Mechanical Enterprise
MAPDL Version:       24.1
ansys.mapdl Version: 0.68.0

Note

If you experience errors when using PyCall, you can try to rebuild the package by pressing "]" to go to the package manager and typing:

pkg> build PyCall

Use PyMAPDL in Julia#

Here is a simple example of how you use PyMAPDL in Julia:

using PyCall
pymapdl = pyimport("ansys.mapdl.core")
mapdl = pymapdl.launch_mapdl()
np = pyimport("numpy")
# define cylinder and mesh parameters
torque = 100
radius = 2
h_tip = 2
height = 20
elemsize = 0.5
pi = np.arccos(-1)
force = 100/radius
pressure = force/(h_tip*2*np.pi*radius)
# Define higher-order SOLID186
# Define surface effect elements SURF154 to apply torque
# as a tangential pressure
mapdl.prep7()
mapdl.et(1, 186)
mapdl.et(2, 154)
mapdl.r(1)
mapdl.r(2)
# Aluminum properties (or something)
mapdl.mp("ex", 1, 10e6)
mapdl.mp("nuxy", 1, 0.3)
mapdl.mp("dens", 1, 0.1/386.1)
mapdl.mp("dens", 2, 0)
# Simple cylinder
for i in 1:5
    mapdl.cylind(radius, "", "", height, 90*(i-1), 90*i)
end
mapdl.nummrg("kp")
# interactive volume plot (optional)
mapdl.vplot()
# mesh cylinder
mapdl.lsel("s", "loc", "x", 0)
mapdl.lsel("r", "loc", "y", 0)
mapdl.lsel("r", "loc", "z", 0, height - h_tip)
mapdl.lesize("all", elemsize*2)
mapdl.mshape(0)
mapdl.mshkey(1)
mapdl.esize(elemsize)
mapdl.allsel("all")
mapdl.vsweep("ALL")
mapdl.csys(1)
mapdl.asel("s", "loc", "z", "", height - h_tip + 0.0001)
mapdl.asel("r", "loc", "x", radius)
mapdl.local(11, 1)
mapdl.csys(0)
mapdl.aatt(2, 2, 2, 11)
mapdl.amesh("all")
mapdl.finish()
# plot elements
mapdl.eplot()

Note

Notice the changes in the strings and the loops. Only "" strings are allowed.