Source code for Tests.Plot.test_plots

from os.path import isfile
from os.path import join

import matplotlib.pyplot as plt
import pytest
from SciDataTool import DataTime, Data1D, DataLinspace, VectorField
from numpy import linspace, sin, squeeze

from Tests import TEST_DATA_DIR
from Tests import save_plot_path as save_path
from pyleecan.Classes.ImportMatlab import ImportMatlab
from pyleecan.Classes.InputFlux import InputFlux
from pyleecan.Classes.Output import Output
from pyleecan.Classes.Simu1 import Simu1
from pyleecan.Classes.InputCurrent import InputCurrent
from pyleecan.Functions.load import load
from pyleecan.Functions.Plot import dict_2D, dict_3D
from pyleecan.definitions import DATA_DIR


[docs]@pytest.fixture(scope="module") def import_data(): SCIM_006 = load(join(DATA_DIR, "Machine", "SCIM_006.json")) simu = Simu1(name="test_plots", machine=SCIM_006) mat_file_Br = join(TEST_DATA_DIR, "Plots/default_proj_Br.mat") mat_file_time = join(TEST_DATA_DIR, "Plots/default_proj_time.mat") mat_file_angle = join(TEST_DATA_DIR, "Plots/default_proj_angle.mat") mat_file_Br_cfft2 = join(TEST_DATA_DIR, "Plots/default_proj_Br_cfft2.mat") mat_file_Brfreqs = join(TEST_DATA_DIR, "Plots/default_proj_Brfreqs.mat") mat_file_Brwavenumber = join(TEST_DATA_DIR, "Plots/default_proj_Brwavenumber.mat") if not isfile(mat_file_Br): import urllib.request url = "https://www.pyleecan.org/Data/default_proj_Br.mat" urllib.request.urlretrieve(url, mat_file_Br) if not isfile(mat_file_Br_cfft2): import urllib.request url = "https://www.pyleecan.org/Data/default_proj_Br_cfft2.mat" urllib.request.urlretrieve(url, mat_file_Br_cfft2) data = {} data["SCIM_006"] = SCIM_006 data["simu"] = simu # Read input files from Manatee data["flux"] = ImportMatlab(mat_file_Br, var_name="XBr") data["time"] = ImportMatlab(mat_file_time, var_name="timec") data["angle"] = ImportMatlab(mat_file_angle, var_name="alpha_radc") data["flux_FT"] = ImportMatlab(mat_file_Br_cfft2, var_name="Fwr") data["freqs"] = ImportMatlab(mat_file_Brfreqs, var_name="freqs") data["wavenumber"] = ImportMatlab(mat_file_Brwavenumber, var_name="orders") data["OP"] = InputCurrent(N0=2000, Id_ref=10, Iq_ref=-10) # Plot parameters data["freq_max"] = 2000 data["r_max"] = 78 return data
[docs]class Test_plots(object):
[docs] @pytest.mark.long_5s @pytest.mark.SingleOP @pytest.mark.SCIM def test_default_proj_Br_time_space(self, import_data): SCIM_006 = import_data["SCIM_006"] simu = import_data["simu"] time = import_data["time"] angle = import_data["angle"] flux = import_data["flux"] flux_FT = import_data["flux_FT"] freqs = import_data["freqs"] wavenumber = import_data["wavenumber"] freq_max = import_data["freq_max"] r_max = import_data["r_max"] OP = import_data["OP"] time_arr = squeeze(time.get_data()) angle_arr = squeeze(angle.get_data()) flux_arr = flux.get_data() norm_angle = {"space_order": 3} simu = Simu1(name="test_default_proj_Br_time_space", machine=SCIM_006) simu.mag = None simu.force = None simu.struct = None simu.input = InputFlux(B_dict={"Br": flux}, time=time, angle=angle, OP=OP) out = Output(simu=simu) simu.run() out2 = Output(simu=simu) # Reduce to 1/3 period Br_reduced = flux_arr[0:672, 0:672] time_reduced = time_arr[0:672] angle_reduced = angle_arr[0:672] # Build the data objects Time2 = Data1D( name="time", unit="s", symmetries={"period": 3}, values=time_reduced, ) Angle2 = Data1D( name="angle", unit="rad", symmetries={"period": 3}, values=angle_reduced, normalizations=norm_angle, ) Br2 = DataTime( symbol="B_r", name="Airgap radial flux density", unit="T", axes=[Time2, Angle2], values=Br_reduced, ) out2.mag.B = VectorField( name="Airgap flux density", symbol="B", components={"radial": Br2} ) # Plot the result by comparing the two simulation (sym / no sym) plt.close("all") out.mag.B.plot_2D_Data( "time", "angle[0]{°}", data_list=[out2.mag.B], is_auto_ticks=False, legend_list=["Reference", "Periodic"], save_path=join(save_path, "test_default_proj_Br_dataobj_period.png"), is_show_fig=False, **dict_2D, ) out.mag.B.plot_2D_Data( "freqs=[0," + str(freq_max) + "]", data_list=[out2.mag.B], legend_list=["Reference", "Periodic"], is_auto_ticks=False, save_path=join(save_path, "test_default_proj_Br_dataobj_period_fft.png"), is_show_fig=False, **dict_2D, ) out3 = Output(simu=simu) # Get linspace data t0 = time_arr[0] tf = time_arr[-1] deltat = time_arr[1] - time_arr[0] a0 = angle_arr[0] deltaa = angle_arr[1] - angle_arr[0] Na = len(angle_arr) # Build the data objects Time3 = DataLinspace( name="time", unit="s", initial=t0, final=tf + deltat, step=deltat, include_endpoint=False, ) Angle3 = DataLinspace( name="angle", unit="rad", normalizations=norm_angle, initial=a0, step=deltaa, number=Na, include_endpoint=False, ) Br3 = DataTime( symbol="B_r", name="Airgap radial flux density", unit="T", axes=[Time3, Angle3], values=flux_arr, ) out3.mag.B = VectorField( name="Airgap flux density", symbol="B", components={"radial": Br3} ) # Plot the result by comparing the two simulation (Data1D / DataLinspace) plt.close("all") out.mag.B.plot_2D_Data( "angle{°}", data_list=[out3.mag.B], legend_list=["Reference", "Linspace"], is_auto_ticks=False, save_path=join(save_path, "test_default_proj_Br_dataobj_linspace.png"), is_show_fig=False, **dict_2D, ) out.mag.B.components["radial"].axes[1].normalizations["space_order"] = 3 out.mag.B.plot_2D_Data( "wavenumber->space_order=[0,100]", data_list=[out3.mag.B], legend_list=["Reference", "Linspace"], is_auto_ticks=False, save_path=join(save_path, "test_default_proj_Br_dataobj_linspace_fft.png"), is_show_fig=False, **dict_2D, ) simu4 = Simu1(name="test_default_proj_Br_time_space_ift", machine=SCIM_006) simu4.mag = None simu4.force = None simu4.struct = None simu4.input = InputFlux(B_dict={"Br": flux}, time=time, angle=angle, OP=OP) out4 = Output(simu=simu4) simu4.run() out4.post.legend_name = "Inverse FT" # Plot the result by comparing the two simulation (direct / ifft) plt.close("all") out.mag.B.plot_2D_Data( "angle{°}", data_list=[out4.mag.B], legend_list=["Reference", "Inverse FFT"], is_auto_ticks=False, save_path=join(save_path, "test_default_proj_Br_dataobj_ift.png"), is_show_fig=False, **dict_2D, ) out.mag.B.plot_2D_Data( "wavenumber=[0,100]", data_list=[out4.mag.B], legend_list=["Reference", "Inverse FFT"], is_auto_ticks=False, save_path=join(save_path, "test_default_proj_Br_dataobj_ift_fft.png"), is_show_fig=False, **dict_2D, ) out5 = Output(simu=simu) # Get linspace data t0 = 0.01 tf = 0.04 Nt = 3000 time5 = linspace(0.01, 0.04, 3000, endpoint=True) # Compute sine function Br5 = 0.2 * sin(375 * time5 - 1.5) # Build the data objects Time5 = DataLinspace( name="time", unit="s", initial=t0, final=tf, number=Nt, include_endpoint=True, ) flux5 = DataTime( symbol="B_r", name="Airgap radial flux density", unit="T", axes=[Time5], values=Br5, ) out5.mag.B = VectorField( name="Airgap flux density", symbol="B", components={"radial": flux5} ) # Plot the result by comparing the two simulation (sym / no sym) plt.close("all") out.mag.B.plot_2D_Data( "time", "angle[0]{°}", data_list=[out5.mag.B], legend_list=["Br", "0.2sin(375t-1.5)"], save_path=join(save_path, "test_default_proj_Br_compare.png"), is_auto_ticks=False, is_show_fig=False, **dict_2D, )
[docs] @pytest.mark.SingleOP @pytest.mark.SCIM def test_default_proj_Br_cfft2(self, import_data): SCIM_006 = import_data["SCIM_006"] simu = import_data["simu"] time = import_data["time"] angle = import_data["angle"] flux = import_data["flux"] flux_FT = import_data["flux_FT"] freqs = import_data["freqs"] wavenumber = import_data["wavenumber"] freq_max = import_data["freq_max"] r_max = import_data["r_max"] OP = import_data["OP"] N_stem = 100 simu = Simu1(name="test_default_proj_Br_cfft2", machine=SCIM_006) simu.input = InputFlux(B_dict={"Br": flux}, time=time, angle=angle, OP=OP) simu.mag = None simu.force = None simu.struct = None out = Output(simu=simu) simu.run() # Plot the 2D FFT of flux density as stem plot plt.close("all") out.mag.B.plot_3D_Data( "freqs=[0," + str(freq_max) + "]", "wavenumber=[-" + str(r_max) + "," + str(r_max) + "]", N_stem=N_stem, is_auto_ticks=False, save_path=join(save_path, "test_default_proj_Br_dataobj_cfft2.png"), is_show_fig=False, **dict_3D, )
[docs] @pytest.mark.SingleOP @pytest.mark.SCIM def test_default_proj_surf(self, import_data): SCIM_006 = import_data["SCIM_006"] simu = import_data["simu"] time = import_data["time"] angle = import_data["angle"] flux = import_data["flux"] flux_FT = import_data["flux_FT"] freqs = import_data["freqs"] wavenumber = import_data["wavenumber"] freq_max = import_data["freq_max"] r_max = import_data["r_max"] OP = import_data["OP"] simu = Simu1(name="test_default_proj_surf", machine=SCIM_006) simu.mag = None simu.force = None simu.struct = None simu.input = InputFlux(B_dict={"Br": flux}, time=time, angle=angle, OP=OP) out = Output(simu=simu) simu.run() # Plot the result by comparing the two simulation (sym / no sym) plt.close("all") out.mag.B.plot_3D_Data( "time=[0,0.06]", "angle{°}", component_list=["radial"], save_path=join(save_path, "test_default_proj_Br_surf_dataobj.png"), is_2D_view=False, is_show_fig=False, **dict_3D, )
[docs] @pytest.mark.SingleOP @pytest.mark.SCIM def test_default_proj_fft2(self, import_data): SCIM_006 = import_data["SCIM_006"] simu = import_data["simu"] time = import_data["time"] angle = import_data["angle"] flux = import_data["flux"] flux_FT = import_data["flux_FT"] freqs = import_data["freqs"] wavenumber = import_data["wavenumber"] freq_max = import_data["freq_max"] r_max = import_data["r_max"] OP = import_data["OP"] simu = Simu1(name="test_default_proj_fft2", machine=SCIM_006) simu.mag = None simu.force = None simu.struct = None simu.input = InputFlux(B_dict={"Br": flux}, time=time, angle=angle, OP=OP) out = Output(simu=simu) simu.run() # Plot the 2D FFT of flux density as 2D scatter plot with colormap plt.close("all") freq_max = 500 r_max = 20 out.mag.B.plot_3D_Data( "freqs=[0," + str(freq_max) + "]", "wavenumber=[-" + str(r_max) + "," + str(r_max) + "]", is_2D_view=True, is_auto_ticks=False, save_path=join(save_path, "test_default_proj_Br_fft2_dataobj.png"), is_show_fig=False, **dict_3D, )
[docs] @pytest.mark.SingleOP @pytest.mark.SCIM def test_default_proj_time_space(self, import_data): SCIM_006 = import_data["SCIM_006"] simu = import_data["simu"] time = import_data["time"] angle = import_data["angle"] flux = import_data["flux"] flux_FT = import_data["flux_FT"] freqs = import_data["freqs"] wavenumber = import_data["wavenumber"] freq_max = import_data["freq_max"] r_max = import_data["r_max"] OP = import_data["OP"] simu = Simu1(name="test_default_proj_time_space", machine=SCIM_006) simu.mag = None simu.force = None simu.struct = None simu.input = InputFlux(B_dict={"Br": flux}, time=time, angle=angle, OP=OP) out = Output(simu=simu) simu.run() # Plot the result by comparing the two simulation (sym / no sym) plt.close("all") out.mag.B.plot_3D_Data( "time", "angle{°}", is_2D_view=True, save_path=join(save_path, "test_default_proj_Br_time_space_dataobj.png"), is_show_fig=False, **dict_3D, )