Eomys/pyleecan

Issues with Datakeeper object in Tutorials

Opened this issue · 22 comments

Hello,
I encounter some errors while trying to understand the tutorials for operating point and Optimization. Initialization of the DataKeeper object fails. Can you spot the issue?

In tuto_Operating_point.ipynb as well as in tuto_Optimization.ipynb

TypeError                                 Traceback (most recent call last)
Cell In[4], line 12
      8     # Return the first torque harmonic
      9     return harm_list[1] 
     11 my_obj = [
---> 12     OptiObjective(
     13         name="Maximization of the average torque",
     14         symbol="Tem_av",
     15         unit="N.m",
     16         keeper="lambda output: -abs(output.mag.Tem_av)",  # keeper can be saved
     17     ),

TypeError: 'property' object is not callable

TypeError                                 Traceback (most recent call last)
Cell In[21], line 41
     38 varload.is_reuse_femm_file=True  
     40 # Add I0/Phi0 to the data available at the end of the simulation
---> 41 I0_dk = DataKeeper(
     42     name="Stator current rms amplitude",
     43     symbol="I0",
     44     unit="Arms",
     45     keeper="lambda output: output.elec.OP.get_I0_Phi0()['I0']",
     46 )

TypeError: 'property' object is not callable

Hello,
The code looks right to me but we have recently merged a modification on the DataKeeper/Optimization so maybe we missed something. Which version of pyleecan are you using ? Are you running the latest version of the tutorial notebook without modifications ?
Best regards,
Pierre

I pulled the commit bda513c on the master branch
Python 3.10.9
Pyleecan version:1.4.2
SciDataTool version:2.5.0

I did not modify tuto_Optimizaton.ipynb but I did modify tuto_Operating_point.ipynb
-varload.set_OP_matrix(OP_matrix, "N0", "I0", "Phi0", "Tem")
+varload.set_OP_array(OP_matrix, "N0", "I0", "Phi0", "Tem")

Is the problem solved? I have the same problem,I am running the latest version of the tutorial notebook without modifications.
Python version 3.8.10
Pyleecan version:1.4.2
SciDataTool version:2.5.0

hello,
when I run a code in the tutorial I got an error in Datakeeper class and I don't know why?
this is my code and the error

`from pyleecan.Classes.VarLoadCurrent import VarLoadCurrent
from pyleecan.Classes.DataKeeper import DataKeeper
from numpy import zeros, ones, linspace, array, sqrt, arange
# Create new Variable speed simulation
simu_vop = simu_op.copy()
simu_vop.mag.import_file = None
varload = VarLoadCurrent()
simu_vop.var_simu = varload

# Creating the Operating point matrix
OP_matrix = zeros((N_simu,4))

# Set N0 = 1000 [rpm] for all simulation
OP_matrix[:,0] = 1000 * ones((N_simu))

# Set I0 = 250 / sqrt(2) [A] (RMS) for all simulation
OP_matrix[:,1] = I0_rms * ones((N_simu))

# Set Phi0 from 60° to 180°
OP_matrix[:,2] = Phi0_ref

# Set reference torque from Yang et al, 2013
OP_matrix[:,3] = Tem_av_ref
print("Operating Point matrix:")
print(OP_matrix)
print("Original Operating point:")
print(simu_vop.input.OP.get_I0_Phi0())


# Column name are given in the order of OP_matrix
varload.set_OP_array(OP_matrix, "N0", "I0", "Phi0", "Tem")

# The operating point of the simulation is automatically set as
# the first one from the OP_matrix (to speed-up computation due to how pyleecan works)
print("Updated Operating point:")
print(simu_vop.input.OP.get_I0_Phi0())

# All the simulation use the same machine
# No need to draw the machine for all OP
varload.is_reuse_femm_file=True

# Add I0/Phi0 to the data available at the end of the simulation
I0_dk = DataKeeper(
    name="Stator current rms amplitude",
    symbol="I0",
    unit="Arms",
    keeper="lambda output: output.elec.OP.get_I0_Phi0()['I0']",
)
Phi0_dk = DataKeeper(
    name="Stator current phase",
    symbol="Phi0",
    unit="rad",
    keeper="lambda output: output.elec.OP.get_I0_Phi0()['Phi0']",
)
varload.datakeeper_list= [I0_dk, Phi0_dk]



`TypeError                                 Traceback (most recent call last)
Cell In [35], line 43
     40 varload.is_reuse_femm_file=True
     42 # Add I0/Phi0 to the data available at the end of the simulation
---> 43 I0_dk = DataKeeper(
     44     name="Stator current rms amplitude",
     45     symbol="I0",
     46     unit="Arms",
     47     keeper="lambda output: output.elec.OP.get_I0_Phi0()['I0']",
     48 )
     49 Phi0_dk = DataKeeper(
     50     name="Stator current phase",
     51     symbol="Phi0",
     52     unit="rad",
     53     keeper="lambda output: output.elec.OP.get_I0_Phi0()['Phi0']",
     54 )
     55 varload.datakeeper_list= [I0_dk, Phi0_dk]

File ~\AppData\Local\Programs\Python\Python39\lib\site-packages\pyleecan\Classes\DataKeeper.py:106, in DataKeeper.__init__(self, name, symbol, unit, keeper, error_keeper, result, result_ref, physic, init_dict, init_str)
    104 self.symbol = symbol
    105 self.unit = unit
--> 106 self.keeper = keeper
    107 self.error_keeper = error_keeper
    108 self.result = result

File ~\AppData\Local\Programs\Python\Python39\lib\site-packages\pyleecan\Classes\_frozen.py:35, in FrozenClass.__setattr__(self, key, value)
     31 if self.__isfrozen and not hasattr(self, key):
     32     raise FrozenError(
     33         self.__class__.__name__ + ' class has no "' + key + '" ' "property"
     34     )
---> 35 object.__setattr__(self, key, value)

TypeError: 'property' object is not callable
``

Hello,

Normally this bug is corrected on the master branch of the project. I will try to merge #616 and create a new release this week to solve this issue.

Best regards,
Pierre

hello,
thank you for your reply.
I got confused is there available any code and datakeeper class that this bug was solved or I should wait for the new release?
if yes it's possible to guide me to access them

best regards,
faraz

Hello,

You can get the code from Github using method 3: https://pyleecan.org/get.pyleecan.html
You can then use the code that is not released yet and change it if needed.
If you are not familiar with python or git, then you can wait for the release and you will just need to run pip install again.

Best regards,
Pierre

Hello,

I just release pyleecan1.5.0 and updated all the tutorials on the website (there is a new loss tutorial).
Do you need further help or can we close this issue ?

Best regards,
Pierre

Hello,
Thank you for your help in advance,
I used pip install pyleccan and now I have version 1.4.2 but I have the same problem before and I don't know how to fix it
if is it possible for you please help me?

Best regards,
Faraz

I still wonder what python version you are using, some package are quite old. I tried installing pyleecan 1.50 in a new environement and I have error with matplotlib and CedMrnl fork of swat-em (btw, what are the difference with the pip version of swat-em?)

     copying lib\matplotlib\mpl-data\fonts\afm\cmr10.afm -> build\lib.win-amd64-cpython-310\matplotlib\mpl-data\fonts\afm
      UPDATING build\lib.win-amd64-cpython-310\matplotlib\_version.py
      set build\lib.win-amd64-cpython-310\matplotlib\_version.py to '3.3.4'
      running build_ext
      error: Failed to download FreeType. Please download one of ['https://downloads.sourceforge.net/project/freetype/freetype2/2.6.1/freetype-2.6.1.tar.gz', 'https://download.savannah.gnu.org/releases/freetype/freetype-2.6.1.tar.gz'] and extract it into build\freetype-2.6.1 at the top-level of the source repository.
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.

  ERROR: Failed building wheel for matplotlib

Failed to build matplotlib
Cloning https://gitlab.com/CedMrnl/swat-em.git to c:\users\david.buehlmann\appdata\local\temp\pip-req-build-434ia23a
  Running command git clone --filter=blob:none --quiet https://gitlab.com/CedMrnl/swat-em.git 'C:\Users\david.buehlmann\AppData\Local\Temp\pip-req-build-434ia23a'
  fatal: unable to access 'https://gitlab.com/CedMrnl/swat-em.git/': SSL certificate problem: unable to get local issuer certificate

Hello,

As discussed in other issues, pyleecan is not (yet) compatible with Python 3.11 so I have added this limitation in pip.
The issue is that as 1.5.0 is flagged as not available for Python 3.11, while using pip it revert back to the previous version which is 1.4.2 (which is not flagged as incompatible with 3.11)
Regarding the modification for swat-em, we have an opened PR on the project that changes PyQt5 import to qtpy import since we are using PySide2.

Best regards,
Pierre

By the way I'm personally working on Python 3.8.10

Hello,
I downgrade my python to 3.8.10 and now I have pyleecan 1.5 but now there is a strange error. i used pip install pyleecan more than one but there is this error

`%matplotlib inline

# Load the machine
from os.path import join
from pyleecan.Functions.load import load
from pyleecan.definitions import DATA_DIR

IPMSM_A = load(join(DATA_DIR, "Machine", "Toyota_Prius.json"))
# In Jupyter notebook, we set is_show_fig=False to skip call to fig.show() to avoid a warning message
# All plot methods return the corresponding matplotlib figure and axis to further edit the resulting plot
fig, ax = IPMSM_A.plot(is_show_fig=False)  
`ModuleNotFoundError                       Traceback (most recent call last)
Cell In[3], line 5
      3 # Load the machine
      4 from os.path import join
----> 5 from pyleecan.Functions.load import load
      6 from pyleecan.definitions import DATA_DIR
      8 IPMSM_A = load(join(DATA_DIR, "Machine", "Toyota_Prius.json"))

File ~\AppData\Local\Programs\Python\Python38\Lib\site-packages\shiboken2\files.dir\shibokensupport\__feature__.py:142, in _import(name, *args, **kwargs)
    140     flag = -1
    141 pyside_feature_dict[importing_module] = flag
--> 142 return original_import(name, *args, **kwargs)

File c:\users\faraz\appdata\local\programs\python\python38\lib\site-packages\pyleecan\Functions\load.py:8
      6 from .Load.import_class import import_class
      7 from .Load.load_hdf5 import load_hdf5
----> 8 from .Load.load_json import load_json
      9 from .Load.load_pkl import load_pkl
     10 from .Load.retrocompatibility import convert_init_dict

File ~\AppData\Local\Programs\Python\Python38\Lib\site-packages\shiboken2\files.dir\shibokensupport\__feature__.py:142, in _import(name, *args, **kwargs)
    140     flag = -1
    141 pyside_feature_dict[importing_module] = flag
--> 142 return original_import(name, *args, **kwargs)

File c:\users\faraz\appdata\local\programs\python\python38\lib\site-packages\pyleecan\Functions\Load\load_json.py:4
      2 from json import load as jload
      3 from os.path import isdir, isfile, splitext
----> 4 from ...Generator import PYTHON_DEFAULT_ENCODING
      7 def load_json(file_path):
      8     """Load a json file
      9 
     10     Parameters
   (...)
     20         data of the json file
     21     """

File ~\AppData\Local\Programs\Python\Python38\Lib\site-packages\shiboken2\files.dir\shibokensupport\__feature__.py:142, in _import(name, *args, **kwargs)
    140     flag = -1
    141 pyside_feature_dict[importing_module] = flag
--> 142 return original_import(name, *args, **kwargs)

ModuleNotFoundError: No module named `'pyleecan.Generator'``

Hello,

I seems that a file is missing in the pip release. I will check this afternoon and if needed I will release 1.5.1.

Best regards,
Pierre

Hello,

Indeed a file was missing so I has uploaded release 1.5.1
I installed pyleecan v1.5.1 with pip and I managed to run the FEMM simulation tutorial.

Thank you for spotting this.
Best regards,
Pierre

hello,
thank you for your help,
I have another error in vtkExtractEdges
could you please help me ?
Best regards,
Faraz

`All_core = out2.loss["stator core"] + out2.loss["rotor core"]
All_core.parent = out2.loss  # Needed to plot
All_core.plot_mesh(group_names=["stator core", "rotor core"])` 
ImportError                               Traceback (most recent call last)
Cell In[50], line 3
      1 All_core = out2.loss["stator core"] + out2.loss["rotor core"]
      2 All_core.parent = out2.loss  # Needed to plot
----> 3 All_core.plot_mesh(group_names=["stator core", "rotor core"])

File c:\users\faraz\appdata\local\programs\python\python38\lib\site-packages\pyleecan\Methods\Output\OutLossModel\plot_mesh.py:13, in plot_mesh(self, group_names)
      1 def plot_mesh(self, group_names=None):
      2     """Plot the losses on the mesh solution
      3 
      4     Parameters
   (...)
     10 
     11     """
---> 13     self.get_mesh_solution().plot_contour(
     14         "freqs=sum",
     15         label=self.name + " loss density [W/m^3]",
     16         group_names=group_names,
     17     )

File c:\users\faraz\appdata\local\programs\python\python38\lib\site-packages\pyleecan\Classes\MeshSolution.py:159, in MeshSolution.<lambda>(x)
    156 # cf Methods.Mesh.MeshSolution.plot_contour
    157 if isinstance(plot_contour, ImportError):
    158     plot_contour = property(
--> 159         fget=lambda x: raise_(
    160             ImportError(
    161                 "Can't use MeshSolution method plot_contour: " + str(plot_contour)
    162             )
    163         )
    164     )
    165 else:
    166     plot_contour = plot_contour

File c:\users\faraz\appdata\local\programs\python\python38\lib\site-packages\pyleecan\Classes\_check.py:347, in raise_(ex)
    345 def raise_(ex):
    346     """Function to raise an exeption for the method import lambda"""
--> 347     raise ex

ImportError: Can't use MeshSolution method plot_contour: cannot import name 'vtkExtractEdges' from 'vtkmodules.vtkFiltersExtraction' (c:\users\faraz\appdata\local\programs\python\python38\lib\site-packages\vtkmodules\vtkFiltersExtraction.cp38-win_amd64.pyd)

Hello,

Which version of VTK are you using ?
On my side I have:
vtk 9.0.3
pyvista 0.31.3
pyvistaqt 0.5.0
meshio 4.4.6

Best regards,
Pierre

hello
thank you for your response
i set all my libraries as you but I get new error related to numpy

AttributeError                            Traceback (most recent call last)
Cell In[14], line 1
----> 1 out.loss.loss_dict["overall"].plot_mesh()  # overall on full mesh

File c:\users\faraz\appdata\local\programs\python\python38\lib\site-packages\pyleecan\Methods\Output\OutLossModel\plot_mesh.py:13, in plot_mesh(self, group_names)
      1 def plot_mesh(self, group_names=None):
      2     """Plot the losses on the mesh solution
      3 
      4     Parameters
   (...)
     10 
     11     """
---> 13     self.get_mesh_solution().plot_contour(
     14         "freqs=sum",
     15         label=self.name + " loss density [W/m^3]",
     16         group_names=group_names,
     17     )

File c:\users\faraz\appdata\local\programs\python\python38\lib\site-packages\pyleecan\Methods\Mesh\MeshSolution\plot_contour.py:164, in plot_contour(self, label, index, indices, is_surf, is_radial, is_center, clim, field_name, group_names, save_path, itimefreq, is_show_fig, win_title, factor, is_animated, title, p, colormap, *args)
    161         clim[0] = -abs(clim[1])
    162         clim[1] = abs(clim[1])
--> 164 plot_mesh_field(
    165     p,
    166     sargs,
    167     field_name,
    168     clim=clim,
    169     mesh_pv=mesh_pv,
    170     field=field,
    171     colormap=colormap,
    172 )
    174 ###########
    175 # Internal animation (cannot be combined with other plots)
    176 if is_animated:

File c:\users\faraz\appdata\local\programs\python\python38\lib\site-packages\pyleecan\Functions\Plot\Pyvista\plot_mesh_field.py:24, in plot_mesh_field(p, sargs, field_name, clim, mesh_pv, field, phase, colormap)
     13 def plot_mesh_field(
     14     p,
     15     sargs,
   (...)
     21     colormap=COLOR_MAP,
     22 ):
---> 24     mesh_pv[field_name] = real(field * phase)
     25     mesh_field = mesh_pv
     27     p.add_mesh(
     28         mesh_field,
     29         scalars=field_name,
   (...)
     33         scalar_bar_args=sargs,
     34     )

File c:\users\faraz\appdata\local\programs\python\python38\lib\site-packages\pyvista\core\dataset.py:654, in DataSet.__setitem__(self, name, scalars)
    652     self.point_arrays[name] = scalars
    653 elif scalars.shape[0] == self.n_cells:
--> 654     self.cell_arrays[name] = scalars
    655 else:
    656     # Field data must be set explicitly as it could be a point of
    657     # confusion for new users
    658     raise_not_matching(scalars, self)

File c:\users\faraz\appdata\local\programs\python\python38\lib\site-packages\pyvista\core\datasetattributes.py:57, in DataSetAttributes.__setitem__(self, key, value)
     55 def __setitem__(self, key: str, value: np.ndarray):
     56     """Implement setting with the [] operator."""
---> 57     self.append(narray=value, name=key)

File c:\users\faraz\appdata\local\programs\python\python38\lib\site-packages\pyvista\core\datasetattributes.py:247, in DataSetAttributes.append(self, narray, name, deep_copy, active_vectors, active_scalars)
    242 # this handles the case when an input array is directly appended on the
    243 # output. We want to make sure that the array added to the output is not
    244 # referring to the input dataset.
    245 copy = pyvista_ndarray(narray)
--> 247 vtk_arr = helpers.convert_array(copy, name, deep=deep_copy)
    248 self.VTKObject.AddArray(vtk_arr)
    249 try:

File c:\users\faraz\appdata\local\programs\python\python38\lib\site-packages\pyvista\utilities\helpers.py:116, in convert_array(arr, name, deep, array_type)
    113 else:
    114     # This will handle numerical data
    115     arr = np.ascontiguousarray(arr)
--> 116     vtk_data = _vtk.numpy_to_vtk(num_array=arr, deep=deep,
    117                                  array_type=array_type)
    118 if isinstance(name, str):
    119     vtk_data.SetName(name)

File c:\users\faraz\appdata\local\programs\python\python38\lib\site-packages\vtkmodules\util\numpy_support.py:164, in numpy_to_vtk(num_array, deep, array_type)
    161 result_array.SetNumberOfTuples(shape[0])
    163 # Ravel the array appropriately.
--> 164 arr_dtype = get_numpy_array_type(vtk_typecode)
    165 if numpy.issubdtype(z.dtype, arr_dtype) or \
    166    z.dtype == numpy.dtype(arr_dtype):
    167     z_flat = numpy.ravel(z)

File c:\users\faraz\appdata\local\programs\python\python38\lib\site-packages\vtkmodules\util\numpy_support.py:94, in get_numpy_array_type(vtk_array_type)
     92 def get_numpy_array_type(vtk_array_type):
     93     """Returns a numpy array typecode given a VTK array type."""
---> 94     return get_vtk_to_numpy_typemap()[vtk_array_type]

File c:\users\faraz\appdata\local\programs\python\python38\lib\site-packages\vtkmodules\util\numpy_support.py:74, in get_vtk_to_numpy_typemap()
     72 def get_vtk_to_numpy_typemap():
     73     """Returns the VTK array type to numpy array type mapping."""
---> 74     _vtk_np = {vtkConstants.VTK_BIT:numpy.bool,
     75                 vtkConstants.VTK_CHAR:numpy.int8,
     76                 vtkConstants.VTK_SIGNED_CHAR:numpy.int8,
     77                 vtkConstants.VTK_UNSIGNED_CHAR:numpy.uint8,
     78                 vtkConstants.VTK_SHORT:numpy.int16,
     79                 vtkConstants.VTK_UNSIGNED_SHORT:numpy.uint16,
     80                 vtkConstants.VTK_INT:numpy.int32,
     81                 vtkConstants.VTK_UNSIGNED_INT:numpy.uint32,
     82                 vtkConstants.VTK_LONG:LONG_TYPE_CODE,
     83                 vtkConstants.VTK_LONG_LONG:numpy.int64,
     84                 vtkConstants.VTK_UNSIGNED_LONG:ULONG_TYPE_CODE,
     85                 vtkConstants.VTK_UNSIGNED_LONG_LONG:numpy.uint64,
     86                 vtkConstants.VTK_ID_TYPE:ID_TYPE_CODE,
     87                 vtkConstants.VTK_FLOAT:numpy.float32,
     88                 vtkConstants.VTK_DOUBLE:numpy.float64}
     89     return _vtk_np

File c:\users\faraz\appdata\local\programs\python\python38\lib\site-packages\numpy\__init__.py:305, in __getattr__(attr)
    300     warnings.warn(
    301         f"In the future `np.{attr}` will be defined as the "
    302         "corresponding NumPy scalar.", FutureWarning, stacklevel=2)
    304 if attr in __former_attrs__:
--> 305     raise AttributeError(__former_attrs__[attr])
    307 # Importing Tester requires importing all of UnitTest which is not a
    308 # cheap import Since it is mainly used in test suits, we lazy import it
    309 # here to save on the order of 10 ms of import time for most users
    310 #
    311 # The previous way Tester was imported also had a side effect of adding
    312 # the full `numpy.testing` namespace
    313 if attr == 'testing':

AttributeError: module 'numpy' has no attribute 'bool'.
`np.bool` was a deprecated alias for the builtin `bool`. To avoid this error in existing code, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.
The aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:
    https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations

I think with issue comes from Pyvista. I had a similar issue and I had to change the import in Lib/site-packages/pyvista/_vtk.py, vtkExtractEdges is in vtkmodules.vtkFiltersCore now.
In get_cell.py I had also to change the import -> collections.abc import Iterable

Hello,

Thank you for the answer. I'm not sure if understand perfectly your answer. Should we change some import within pyleecan or is it modifications to do in the site_package of VTK ? In the first case do you have the time to create a PR ? I can release 1.5.2 afterwards if needed.
By the way, I'm using numpy 1.23.1

Best regards,
Pierre

The issue is within pyvista I think. To solve it I changed the site_package of pyvista. A better option should be to upgrade pyvista to a newer version. If it is possible with the other requirements of pyleecan.
pyvista/pyvista#2585.

\pyleecan\Methods\Mesh\MeshMat\get_cell.py had a issue of import of the collections module but I think it is fixed in 1.50
I am running the unit test with the latesta pyvista to see it create new issue

hello,
thank you for your answer I change the versions of the numpy and matplotlib and now work correctly
Best regards,
Faraz Mirali