Manipulate APDLMath vectors or dense matrices as NumPy Arrays#

This example demonstrates how to exchange data between MAPDL and Python via numpy arrays.

Note

This example requires Ansys 2021R2.

import numpy as np

from ansys.mapdl.core import launch_mapdl

# Start MAPDL as a service and disable all but error messages.
# Create an APDLMath object.
mapdl = launch_mapdl()
mm = mapdl.math

Convert an APDLMath Vector into an NumPy Array#

First, allocate a APDLMath vector with 10 doubles

apdl_vec = mm.ones(10)
print(apdl_vec)

Out:

GUNSOV :
 Size : 10
  1.000e+00   1.000e+00   1.000e+00   1.000e+00   1.000e+00      <       5
  1.000e+00   1.000e+00   1.000e+00   1.000e+00   1.000e+00      <       10

Then create an numpy array from this APDLMath vector.

Note that these are two separate objects: memory is duplicated. Modifying one object does not modify its clone.

pv = apdl_vec.asarray()
print(pv)

Out:

[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]

You can then manipulate this numpy array with all existing numpy features

pv = (pv + 1) ** 2
print(pv)

Out:

[4. 4. 4. 4. 4. 4. 4. 4. 4. 4.]

Alternatively, the APDLMath object can be operated on directly with numpy with the numpy methods.

print(np.max(apdl_vec))
print(np.linalg.norm(apdl_vec))

Out:

1.0
3.1622776601683795

Note that some methods have APDL corollaries, and these methods are more efficient if performed within MAPDL.

For example, the norm method can be performed within MAPDL

print(apdl_vec.norm(), np.linalg.norm(apdl_vec))

Out:

3.1622776601683795 3.1622776601683795

Copy a NumPy Array to an APDLMath vector#

You can push back any numpy vector or 2D array to MAPDL. This creates a new APDLMath, which in this case is named 'NewVec'.

mm.set_vec(pv, "NewVec")

# verify this vector exists
print(mm)

Out:

APDLMATH PARAMETER STATUS-  (      2 PARAMETERS DEFINED)

  Name                   Type            Mem. (MB)       Dims            Workspace

   GUNSOV                VEC             0.000           10              1
   NEWVEC                VEC             0.000           10              1

Create a Python handle to this vector by specifying its name

v2 = mm.vec(name="NewVec")
print(v2)

Out:

NEWVEC :
 Size : 10
  4.000e+00   4.000e+00   4.000e+00   4.000e+00   4.000e+00      <       5
  4.000e+00   4.000e+00   4.000e+00   4.000e+00   4.000e+00      <       10

Dense Numpy Arrays#

The same features apply to dense APDL matrices and numpy arrays.

Allow allocate an APDLMath Dense Matrix and convert it to a numpy array

apdl_mat = mm.rand(3, 3)
np_arr = apdl_mat.asarray()

assert np.allclose(apdl_mat, np_arr)
print(apdl_mat)
print(np_arr)

Out:

GUAJOG:
 [1,1]: 4.170e-01 [1,2]: 9.326e-01 [1,3]: 3.023e-01
 [2,1]: 9.972e-01 [2,2]: 1.144e-04 [2,3]: 9.990e-01
 [3,1]: 7.203e-01 [3,2]: 1.281e-01 [3,3]: 1.468e-01
[[4.17021999e-01 9.32557361e-01 3.02332568e-01]
 [9.97184808e-01 1.14381197e-04 9.99040516e-01]
 [7.20324489e-01 1.28124448e-01 1.46755893e-01]]

You can load numpy array to APDL with the matrix method

np_rand = np.random.random((4, 4))
ans_mat = mm.matrix(np_rand)

# print the autogenerated name of the this matrix
print(ans_mat.id)

Out:

WIRIQQ

Load this matrix from APDL and verify it is identical

from_ans = ans_mat.asarray()
print(np.allclose(from_ans, np_rand))

Out:

True

stop mapdl

mapdl.exit()

Total running time of the script: ( 0 minutes 0.189 seconds)

Gallery generated by Sphinx-Gallery