diff --git a/python/FIERRO-GUI/fierro_gui/DeveloperInputs.py b/python/FIERRO-GUI/fierro_gui/DeveloperInputs.py index 8966a27ee..76d16ad82 100644 --- a/python/FIERRO-GUI/fierro_gui/DeveloperInputs.py +++ b/python/FIERRO-GUI/fierro_gui/DeveloperInputs.py @@ -1,3 +1,4 @@ fierro_mesh_builder_exe = '/Users/shankins/Documents/FY24/Github/XcodeFierro/Fierro/build-fierro-serial/bin/fierro-mesh-builder' fierro_voxelizer_exe = '/Users/shankins/Documents/FY24/Github/XcodeFierro/Fierro/build-fierro-serial/bin/fierro-voxelizer' fierro_parallel_explicit_exe = '/Users/shankins/Documents/FY24/Github/XcodeFierro/Fierro/build-fierro-serial/bin/fierro-parallel-explicit' +fierro_evpfft_exe = '/Users/shankins/Documents/FY24/Github/XcodeFierro/Fierro/src/EVPFFT/evpfft_fftw_serial/evpfft' diff --git a/python/FIERRO-GUI/fierro_gui/EVPFFT_Lattice.py b/python/FIERRO-GUI/fierro_gui/EVPFFT_Lattice.py index 132c7c9a0..2c2dc3dec 100644 --- a/python/FIERRO-GUI/fierro_gui/EVPFFT_Lattice.py +++ b/python/FIERRO-GUI/fierro_gui/EVPFFT_Lattice.py @@ -3,7 +3,11 @@ import re import csv import numpy as np +import subprocess +#import paraview.simple as paraview.simple +from paraview.simple import * from EVPFFT_Lattice_WInput import * +from DeveloperInputs import * # ============================================== # ======= EVPFFT SOLVER LATTICE PIPELINE ======= @@ -41,15 +45,29 @@ def material_type(): def material_region(): if str(self.INRegion.currentText()) == 'Void': - pvsimple.Hide(self.threshold) - self.threshold = pvsimple.Threshold(Input = self.voxel_reader, Scalars = "density", ThresholdMethod = "Below Lower Threshold", UpperThreshold = 1, LowerThreshold = 0, AllScalars = 1, UseContinuousCellRange = 0, Invert = 0) - pvsimple.Show(self.threshold, self.render_view) + # Remove all objects from window view + SetActiveView(self.render_view) + renderer = self.render_view.GetRenderer() + renderer.RemoveAllViewProps() + self.render_view.Update() + self.render_view.StillRender() + + # Show void region only + self.threshold = paraview.simple.Threshold(Input = self.vtk_reader, Scalars = "density", ThresholdMethod = "Below Lower Threshold", UpperThreshold = 1, LowerThreshold = 0, AllScalars = 1, UseContinuousCellRange = 0, Invert = 0) + paraview.simple.Show(self.threshold, self.render_view) self.render_view.ResetCamera() self.render_view.StillRender() else: - pvsimple.Hide(self.threshold) - self.threshold = pvsimple.Threshold(Input = self.voxel_reader, Scalars = "density", ThresholdMethod = "Above Upper Threshold", UpperThreshold = 1, LowerThreshold = 0, AllScalars = 1, UseContinuousCellRange = 0, Invert = 0) - pvsimple.Show(self.threshold, self.render_view) + # Remove all objects from window view + SetActiveView(self.render_view) + renderer = self.render_view.GetRenderer() + renderer.RemoveAllViewProps() + self.render_view.Update() + self.render_view.StillRender() + + # Show material region only + self.threshold = paraview.simple.Threshold(Input = self.vtk_reader, Scalars = "density", ThresholdMethod = "Above Upper Threshold", UpperThreshold = 1, LowerThreshold = 0, AllScalars = 1, UseContinuousCellRange = 0, Invert = 0) + paraview.simple.Show(self.threshold, self.render_view) self.render_view.ResetCamera() self.render_view.StillRender() self.INRegion.currentIndexChanged.connect(material_region) @@ -553,14 +571,17 @@ def delete_bcs(): def single_EVPFFT(BC_index): if self.p == None: EVPFFT_Lattice_WInput(self,BC_index) + executable_path = fierro_evpfft_exe + arguments = ["-f", self.EVPFFT_INPUT, "-m", "2"] self.p = QProcess() self.p.readyReadStandardOutput.connect(handle_stdout) self.p.readyReadStandardError.connect(handle_stderr) self.p.stateChanged.connect(handle_state) self.p.finished.connect(process_finished) - self.p.start("evpfft",["-f", self.EVPFFT_INPUT, "-m", "2"]) + self.p.start(executable_path, arguments) self.progress_re = re.compile(" Current Time STEP = (\\d+)") - self.run_cnt += 1 + self.run_cnt += 1 + def simple_percent_parser(output): m = self.progress_re.search(output) if m: @@ -584,8 +605,8 @@ def handle_stderr(): def handle_state(state): states = { QProcess.NotRunning: 'Finished', - QProcess.Starting: 'Starting EVPFFT', - QProcess.Running: 'Running EVPFFT', + QProcess.Starting: 'Starting Fierro', + QProcess.Running: 'Running Fierro', } self.state_name = states[state] self.RunOutputWindow.appendPlainText(f"{self.state_name}") @@ -673,5 +694,113 @@ def homogenization_click(): self.THomogenization.setItem(10,0,QTableWidgetItem(str(self.HG13[0]))) self.THomogenization.setItem(11,0,QTableWidgetItem(str(self.HG23[0]))) self.BHomogenization.clicked.connect(homogenization_click) + + # Preview Results + def preview_results_click(): + # Remove all objects from window view + SetActiveView(self.render_view) + renderer = self.render_view.GetRenderer() + renderer.RemoveAllViewProps() + self.render_view.Update() + self.render_view.StillRender() + try: + self.display + except: + False + else: + self.display.SetScalarBarVisibility(self.render_view, False) + + # Display .xdmf data + self.results_reader = paraview.simple.XDMFReader(FileNames="micro_state_timestep_10.xdmf") + paraview.simple.SetDisplayProperties(Representation="Surface") + self.display = Show(self.results_reader, self.render_view) + + # Color by the selected variable + selected_variable = str(self.INPreviewResults.currentText()) + paraview.simple.ColorBy(self.display, ('CELLS', selected_variable)) + vmstressLUT = paraview.simple.GetColorTransferFunction(selected_variable) + self.display.SetScalarBarVisibility(self.render_view, True) + self.render_view.ResetCamera() + self.render_view.StillRender() + self.BPreviewResults.clicked.connect(preview_results_click) + self.BPreviewResults.clicked.connect(lambda: self.OutputWindows.setCurrentIndex(0)) + + # Open Paraview + def open_paraview_click(): + command = ["paraview", "micro_state_timestep_10.xdmf"] + subprocess.Popen(command) + self.BOpenParaview.clicked.connect(open_paraview_click) + +# # Stress vs Strain Plot +# def plot_ss_click(): +# # Get the stress-strain data +# try: +# self.Plot.figure +# except: +# with open("str_str.out", newline='') as f: +# reader = csv.reader(f) +# self.ss_data = list(reader) +# x = [0 for i in range(int(self.INNumberOfSteps.text()))] +# y = [0 for i in range(int(self.INNumberOfSteps.text()))] +# for i in range(int(self.INNumberOfSteps.text())): +# if str(self.INPlotSS.currentText()) == 'S11 vs E11': +# xcol = 0 +# ycol = 6 +# elif str(self.INPlotSS.currentText()) == 'S22 vs E22': +# xcol = 1 +# ycol = 7 +# elif str(self.INPlotSS.currentText()) == 'S33 vs E33': +# xcol = 2 +# ycol = 8 +# x[i] = float(self.ss_data[i+1][xcol]) +# y[i] = float(self.ss_data[i+1][ycol]) +# # Plot data +# self.Plot.figure = Figure() +# self.Plot.ax = self.Plot.figure.add_subplot() +# print("(",x[1],",",y[1],")") +# self.Plot.ax.plot(x,y) +# self.Plot.ax.set_xlabel('STRAIN') +# self.Plot.ax.set_ylabel('STRESS') +# self.Plot.figure.tight_layout() +# # Display plot and toolbar +# layout = QVBoxLayout() +# self.Plot.setLayout(layout) +# self.Plot.canvas = FigureCanvasQTAgg(self.Plot.figure) +# layout.addWidget(self.Plot.canvas) +# self.toolbar = NavigationToolbar2QT(self.Plot.canvas,self.Plot) +# layout.addWidget(self.toolbar) +# else: +# self.timer = QTimer() +# self.timer.setInterval(100) +# self.timer.timeout.connect(update_plot) +# self.timer.start() +# def update_plot(): +# if self.run_cnt > 1: +# with open("str_str.out", newline='') as f: +# reader = csv.reader(f) +# self.ss_data = list(reader) +# x = [0 for i in range(int(self.INNumberOfSteps.text()))] +# y = [0 for i in range(int(self.INNumberOfSteps.text()))] +# for i in range(int(self.INNumberOfSteps.text())): +# if str(self.INPlotSS.currentText()) == 'S11 vs E11': +# xcol = 0 +# ycol = 6 +# elif str(self.INPlotSS.currentText()) == 'S22 vs E22': +# xcol = 1 +# ycol = 7 +# elif str(self.INPlotSS.currentText()) == 'S33 vs E33': +# xcol = 2 +# ycol = 8 +# x[i] = float(self.ss_data[i+1][xcol]) +# y[i] = float(self.ss_data[i+1][ycol]) +# self.Plot.ax.cla() +# self.Plot.ax.plot(x,y) +# self.Plot.ax.set_xlabel('STRAIN') +# self.Plot.ax.set_ylabel('STRESS') +# self.Plot.figure.tight_layout() +# self.Plot.canvas.draw() +# self.timer.stop() +# self.BPlotSS.clicked.connect(plot_ss_click) +# self.BPlotSS.clicked.connect(lambda: self.OutputWindows.setCurrentIndex(1)) diff --git a/python/FIERRO-GUI/fierro_gui/EVPFFT_Lattice_WInput.py b/python/FIERRO-GUI/fierro_gui/EVPFFT_Lattice_WInput.py index 4c6f029da..19598fa40 100644 --- a/python/FIERRO-GUI/fierro_gui/EVPFFT_Lattice_WInput.py +++ b/python/FIERRO-GUI/fierro_gui/EVPFFT_Lattice_WInput.py @@ -21,10 +21,8 @@ def EVPFFT_Lattice_WInput(self, BC_index): for i in range(self.TMaterials.rowCount()): if self.TMaterials.item(i,2).text() == 'Isotropic' or 'Transversely Isotropic' in self.TMaterials.item(i,2).text() or self.TMaterials.item(i,2).text() == 'Orthotropic': if i == 0: - print("generating EP0") elastic_parameters = open(self.ELASTIC_PARAMETERS_0,"w") else: - print("generating EP1") elastic_parameters = open(self.ELASTIC_PARAMETERS_1,"w") iso = '0\n' elastic_parameters.write(iso) @@ -63,7 +61,8 @@ def EVPFFT_Lattice_WInput(self, BC_index): dz = float(self.TParts.item(0,6).text())/float(self.TParts.item(0,9).text()) nph_delt = '2 number of phases (nph)\n' + f'{dx:.4f} {dy:.4f} {dz:.4f} RVE dimensions (delt)\n' + '* name and path of microstructure file (filetext)\n' evpfft_lattice_input.write(nph_delt) - vtkfile = f'{self.VTK_OUTPUT}\n' + vtkfile = self.voxelizer_dir + '/VTK_Geometry_' + str(self.TParts.item(0,0).text()) + '.vtk\n' +# vtkfile = f'{self.VTK_OUTPUT}\n' evpfft_lattice_input.write(vtkfile) for i in range(2): if not self.TMaterials.item(i,2) or self.TMaterials.item(i,2).text() == 'Ideal Gas': diff --git a/python/FIERRO-GUI/fierro_gui/Explicit_SGH.py b/python/FIERRO-GUI/fierro_gui/Explicit_SGH.py index 0a912b895..1db58c12c 100644 --- a/python/FIERRO-GUI/fierro_gui/Explicit_SGH.py +++ b/python/FIERRO-GUI/fierro_gui/Explicit_SGH.py @@ -556,8 +556,8 @@ def handle_stderr(): def handle_state(state): states = { QProcess.NotRunning: 'Finished', - QProcess.Starting: 'Starting EVPFFT', - QProcess.Running: 'Running EVPFFT', + QProcess.Starting: 'Starting Fierro', + QProcess.Running: 'Running Fierro', } self.state_name = states[state] self.RunOutputWindow.appendPlainText(f"{self.state_name}") diff --git a/python/FIERRO-GUI/fierro_gui/FIERRO_GUI.py b/python/FIERRO-GUI/fierro_gui/FIERRO_GUI.py index 8cb2f588c..cdabcb3fa 100644 --- a/python/FIERRO-GUI/fierro_gui/FIERRO_GUI.py +++ b/python/FIERRO-GUI/fierro_gui/FIERRO_GUI.py @@ -114,14 +114,16 @@ def geometry_upload_click(): self.INLengthZ.setText(str(self.stlLz)) elif self.file_type == '.vt': - # Show the vtk part - self.vtk = pvsimple.LegacyVTKReader(FileNames = b3_filename) + # Paraview window + self.vtk_reader = pvsimple.LegacyVTKReader(FileNames = b3_filename) pvsimple.SetDisplayProperties(Representation = "Surface") - self.threshold = paraview.simple.Threshold(registrationName='input_threshold', Input = self.vtk, Scalars = "density", ThresholdMethod = "Above Upper Threshold", UpperThreshold = 1, LowerThreshold = 0, AllScalars = 1, UseContinuousCellRange = 0, Invert = 0) - pvsimple.Show(self.threshold, self.render_view) - pvsimple.Hide(self.vtk, self.render_view) + text = self.INPartName.text() + self.variable_name = f"part_{text}" + setattr(self, self.variable_name, pvsimple.Threshold(Input = self.vtk_reader, Scalars = "density", ThresholdMethod = "Above Upper Threshold", UpperThreshold = 1, LowerThreshold = 0, AllScalars = 1, UseContinuousCellRange = 0, Invert = 0)) + pvsimple.Show(getattr(self, self.variable_name), self.render_view) + pvsimple.Hide(self.vtk_reader) self.render_view.ResetCamera() - pvsimple.Render() + self.render_view.StillRender() # Turn off settings self.INNumberOfVoxelsX.setText(QCoreApplication.translate("MainWindow", u"32", None)) @@ -136,6 +138,30 @@ def geometry_upload_click(): self.INNumberOfVoxelsZ.setEnabled(False) self.BVoxelizeGeometry.setEnabled(False) + # Get the length of the vtk + self.vtk_reader.UpdatePipeline() + self.bounds = self.vtk_reader.GetDataInformation().GetBounds() + self.vtkLx = round(self.bounds[1] - self.bounds[0],4) + self.vtkLy = round(self.bounds[3] - self.bounds[2],4) + self.vtkLz = round(self.bounds[5] - self.bounds[4],4) + self.INLengthX.setText(str(self.vtkLx)) + self.INLengthY.setText(str(self.vtkLy)) + self.INLengthZ.setText(str(self.vtkLz)) + + # Get the voxels in the vtk + self.extents = self.vtk_reader.GetDataInformation().GetExtent() + self.vtkNx = int(self.extents[1] - self.extents[0]) + self.vtkNy = int(self.extents[3] - self.extents[2]) + self.vtkNz = int(self.extents[5] - self.extents[4]) + self.INNumberOfVoxelsX.setText(str(self.vtkNx)) + self.INNumberOfVoxelsY.setText(str(self.vtkNy)) + self.INNumberOfVoxelsZ.setText(str(self.vtkNz)) + + # Get the origin of the vtk + self.INOriginX.setText(str(self.bounds[0])) + self.INOriginY.setText(str(self.bounds[2])) + self.INOriginZ.setText(str(self.bounds[4])) + # Rename the file and save it to directory location new_file_path = self.voxelizer_dir + '/VTK_Geometry_' + str(self.INPartName.text()) + '.vtk' if b3_filename[0] != new_file_path: @@ -145,7 +171,25 @@ def geometry_upload_click(): row = self.TParts.rowCount() self.TParts.insertRow(row) self.TParts.setItem(row, 0, QTableWidgetItem(self.INPartName.text())) + self.TParts.setItem(row, 1, QTableWidgetItem(self.INOriginX.text())) + self.TParts.setItem(row, 2, QTableWidgetItem(self.INOriginY.text())) + self.TParts.setItem(row, 3, QTableWidgetItem(self.INOriginZ.text())) + self.TParts.setItem(row, 4, QTableWidgetItem(self.INLengthX.text())) + self.TParts.setItem(row, 5, QTableWidgetItem(self.INLengthY.text())) + self.TParts.setItem(row, 6, QTableWidgetItem(self.INLengthZ.text())) + self.TParts.setItem(row, 7, QTableWidgetItem(self.INNumberOfVoxelsX.text())) + self.TParts.setItem(row, 8, QTableWidgetItem(self.INNumberOfVoxelsY.text())) + self.TParts.setItem(row, 9, QTableWidgetItem(self.INNumberOfVoxelsZ.text())) self.INPartName.clear() + self.INOriginX.clear() + self.INOriginY.clear() + self.INOriginZ.clear() + self.INLengthX.clear() + self.INLengthY.clear() + self.INLengthZ.clear() + self.INNumberOfVoxelsX.clear() + self.INNumberOfVoxelsY.clear() + self.INNumberOfVoxelsZ.clear() # Add part as an option for material assignment self.INPartMaterial.clear() @@ -195,13 +239,13 @@ def voxelize_geometry_click(): # Paraview window pvsimple.Delete(self.stl) - self.voxel_reader = pvsimple.LegacyVTKReader(FileNames = vtk_location) + self.vtk_reader = pvsimple.LegacyVTKReader(FileNames = vtk_location) pvsimple.SetDisplayProperties(Representation = "Surface") text = self.INPartName.text() - self.variable_name = f"threshold_{text}" - setattr(self, self.variable_name, pvsimple.Threshold(Input = self.voxel_reader, Scalars = "density", ThresholdMethod = "Above Upper Threshold", UpperThreshold = 1, LowerThreshold = 0, AllScalars = 1, UseContinuousCellRange = 0, Invert = 0)) + self.variable_name = f"part_{text}" + setattr(self, self.variable_name, pvsimple.Threshold(Input = self.vtk_reader, Scalars = "density", ThresholdMethod = "Above Upper Threshold", UpperThreshold = 1, LowerThreshold = 0, AllScalars = 1, UseContinuousCellRange = 0, Invert = 0)) pvsimple.Show(getattr(self, self.variable_name), self.render_view) - pvsimple.Hide(self.voxel_reader) + pvsimple.Hide(self.vtk_reader) self.render_view.ResetCamera() self.render_view.StillRender() @@ -253,7 +297,7 @@ def delete_part(): QMessageBox.No ) if button == QMessageBox.StandardButton.Yes: - self.newvar = "threshold_" + self.TParts.item(current_row,0).text() + self.newvar = "part_" + self.TParts.item(current_row,0).text() pvsimple.Delete(getattr(self, self.newvar)) self.render_view.ResetCamera() self.render_view.StillRender() @@ -284,127 +328,6 @@ def mesh_class(): self.MeshInputs2.setCurrentIndex(3) self.INCoordinateSystem.currentIndexChanged.connect(mesh_class) self.INDimension.currentIndexChanged.connect(mesh_class) - - # Preview Results - def preview_results_click(): - # Delete previous views - try: - self.stl - except: - print('') - else: - pvsimple.Delete(self.stl) - try: - self.threshold - except: - print('') - else: - pvsimple.Delete(self.threshold) - try: - self.threshold2 - except: - print('') - else: - pvsimple.Delete(self.threshold2) - # Render new view - self.results_reader = pvsimple.XDMFReader(FileNames = "micro_state_timestep_10.xdmf") - pvsimple.SetDisplayProperties(Representation = "Surface") - self.threshold2 = pvsimple.Threshold(registrationName='results_threshold', Input = self.results_reader, Scalars = "phase_id", ThresholdMethod = "Above Upper Threshold", UpperThreshold = 2, LowerThreshold = 1, AllScalars = 1, UseContinuousCellRange = 0, Invert = 0) - display = pvsimple.Show(self.threshold2, self.render_view) - # Select what variable you want to display - pvsimple.GetAnimationScene().GoToLast() - pvsimple.ColorBy(display,('CELLS',str(self.INPreviewResults.currentText()))) - vmstressLUT = pvsimple.GetColorTransferFunction(str(self.INPreviewResults.currentText())) - r = self.results_reader.CellData.GetArray(str(self.INPreviewResults.currentText())).GetRange() - vmstressLUT.RescaleTransferFunction(r[0], r[1]/2) - display.SetScalarBarVisibility(self.render_view, True) - pvsimple.HideUnusedScalarBars(self.render_view) - # Add time filter - threshold1 = pvsimple.FindSource('results_threshold') - annotateTimeFilter1 = pvsimple.AnnotateTimeFilter(registrationName='AnnotateTimeFilter1', Input=threshold1) - annotateTimeFilter1Display = pvsimple.Show(annotateTimeFilter1, self.render_view, 'TextSourceRepresentation') - # Remove old view / reset cameras - pvsimple.Hide(self.results_reader) - self.render_view.ResetCamera() - self.render_view.StillRender() - self.BPreviewResults.clicked.connect(preview_results_click) - self.BPreviewResults.clicked.connect(lambda: self.OutputWindows.setCurrentIndex(0)) - - # Stress vs Strain Plot - def plot_ss_click(): - # Get the stress-strain data - try: - self.Plot.figure - except: - with open("str_str.out", newline='') as f: - reader = csv.reader(f) - self.ss_data = list(reader) - x = [0 for i in range(int(self.INNumberOfSteps.text()))] - y = [0 for i in range(int(self.INNumberOfSteps.text()))] - for i in range(int(self.INNumberOfSteps.text())): - if str(self.INPlotSS.currentText()) == 'S11 vs E11': - xcol = 0 - ycol = 6 - elif str(self.INPlotSS.currentText()) == 'S22 vs E22': - xcol = 1 - ycol = 7 - elif str(self.INPlotSS.currentText()) == 'S33 vs E33': - xcol = 2 - ycol = 8 - x[i] = float(self.ss_data[i+1][xcol]) - y[i] = float(self.ss_data[i+1][ycol]) - # Plot data - self.Plot.figure = Figure() - self.Plot.ax = self.Plot.figure.add_subplot() - self.Plot.ax.plot(x,y) - self.Plot.ax.set_xlabel('STRAIN') - self.Plot.ax.set_ylabel('STRESS') - self.Plot.figure.tight_layout() - # Display plot and toolbar - layout = QVBoxLayout() - self.Plot.setLayout(layout) - self.Plot.canvas = FigureCanvasQTAgg(self.Plot.figure) - layout.addWidget(self.Plot.canvas) - self.toolbar = NavigationToolbar2QT(self.Plot.canvas,self.Plot) - layout.addWidget(self.toolbar) - else: - self.timer = QTimer() - self.timer.setInterval(100) - self.timer.timeout.connect(update_plot) - self.timer.start() - def update_plot(): - if self.run_cnt > 1: - with open("str_str.out", newline='') as f: - reader = csv.reader(f) - self.ss_data = list(reader) - x = [0 for i in range(int(self.INNumberOfSteps.text()))] - y = [0 for i in range(int(self.INNumberOfSteps.text()))] - for i in range(int(self.INNumberOfSteps.text())): - if str(self.INPlotSS.currentText()) == 'S11 vs E11': - xcol = 0 - ycol = 6 - elif str(self.INPlotSS.currentText()) == 'S22 vs E22': - xcol = 1 - ycol = 7 - elif str(self.INPlotSS.currentText()) == 'S33 vs E33': - xcol = 2 - ycol = 8 - x[i] = float(self.ss_data[i+1][xcol]) - y[i] = float(self.ss_data[i+1][ycol]) - self.Plot.ax.cla() - self.Plot.ax.plot(x,y) - self.Plot.ax.set_xlabel('STRAIN') - self.Plot.ax.set_ylabel('STRESS') - self.Plot.figure.tight_layout() - self.Plot.canvas.draw() - self.timer.stop() - self.BPlotSS.clicked.connect(plot_ss_click) - self.BPlotSS.clicked.connect(lambda: self.OutputWindows.setCurrentIndex(1)) - - # Open Paraview - def open_paraview_click(): - os.system("open " + "micro_state_timestep_10.xdmf") - self.BOpenParaview.clicked.connect(open_paraview_click) # Write input file for mesh builder def global_mesh_click(): diff --git a/python/FIERRO-GUI/fierro_gui/FIERRO_GUI.ui b/python/FIERRO-GUI/fierro_gui/FIERRO_GUI.ui index 57f5fbb4c..c175d5a31 100644 --- a/python/FIERRO-GUI/fierro_gui/FIERRO_GUI.ui +++ b/python/FIERRO-GUI/fierro_gui/FIERRO_GUI.ui @@ -1922,7 +1922,7 @@ li.checked::marker { content: "\2612"; } QFrame::NoFrame - 9 + 7 @@ -5171,32 +5171,6 @@ li.checked::marker { content: "\2612"; } - - - - Plot Stress vs Strain - - - - - - - - S11 vs E11 - - - - - S22 vs E22 - - - - - S33 vs E33 - - - - diff --git a/python/FIERRO-GUI/fierro_gui/FIERRO_Setup.py b/python/FIERRO-GUI/fierro_gui/FIERRO_Setup.py index 02e46102a..79161c2b2 100644 --- a/python/FIERRO-GUI/fierro_gui/FIERRO_Setup.py +++ b/python/FIERRO-GUI/fierro_gui/FIERRO_Setup.py @@ -27,14 +27,17 @@ def __init__(self, main_window, parent=None): self.INFierroMeshBuilder.setText(f"{fierro_mesh_builder_exe}") self.INFierroVoxelizer.setText(f"{fierro_voxelizer_exe}") self.INFierroParallelExplicit.setText(f"{fierro_parallel_explicit_exe}") + self.INFierroEvpfft.setText(f"{fierro_evpfft_exe}") self.INFierroMeshBuilder.setStyleSheet("color: blue") self.INFierroVoxelizer.setStyleSheet("color: blue") self.INFierroParallelExplicit.setStyleSheet("color: blue") + self.INFierroEvpfft.setStyleSheet("color: blue") # Select build executables self.BFierroMeshBuilder.clicked.connect(lambda: self.developer_executable("fierro-mesh-builder", self.INFierroMeshBuilder)) self.BFierroVoxelizer.clicked.connect(lambda: self.developer_executable("fierro-voxelizer", self.INFierroVoxelizer)) self.BFierroParallelExplicit.clicked.connect(lambda: self.developer_executable("fierro-parallel-explicit", self.INFierroParallelExplicit)) + self.BFierroEvpfft.clicked.connect(lambda: self.developer_executable("evpfft", self.INFierroEvpfft)) def create_temp_directory(self): temp_dir = os.path.join(tempfile.gettempdir(), "fierro_temp_directory") @@ -61,13 +64,12 @@ def confirm(self): # Check that all executables have been defined if "fierro-mesh-builder" not in self.INFierroMeshBuilder.text(): self.warning_message("ERROR: invalid link to fierro-mesh-builder executable") - return if "fierro-voxelizer" not in self.INFierroVoxelizer.text(): self.warning_message("ERROR: invalid link to fierro-voxelizer executable") - return if "fierro-parallel-explicit" not in self.INFierroParallelExplicit.text(): self.warning_message("ERROR: invalid link to fierro-parallel-explicit executable") - return + if "evpfft" not in self.INFierroEvpfft.text(): + self.warning_message("ERROR: invalid link to evpfft executable") # Write executable locations to file for future use current_dir = os.path.dirname(os.path.abspath(__file__)) @@ -76,6 +78,7 @@ def confirm(self): file.write(f"fierro_mesh_builder_exe = '{self.INFierroMeshBuilder.text()}'\n") file.write(f"fierro_voxelizer_exe = '{self.INFierroVoxelizer.text()}'\n") file.write(f"fierro_parallel_explicit_exe = '{self.INFierroParallelExplicit.text()}'\n") + file.write(f"fierro_evpfft_exe = '{self.INFierroEvpfft.text()}'\n") # Re-enable the main window if hasattr(self, 'MainWindow') and hasattr(self.MainWindow, 'setEnabled'): diff --git a/python/FIERRO-GUI/fierro_gui/FIERRO_Setup.ui b/python/FIERRO-GUI/fierro_gui/FIERRO_Setup.ui index 5e9d47c3d..7cce7f14a 100644 --- a/python/FIERRO-GUI/fierro_gui/FIERRO_Setup.ui +++ b/python/FIERRO-GUI/fierro_gui/FIERRO_Setup.ui @@ -7,13 +7,13 @@ 0 0 627 - 400 + 450 0 - 400 + 450 @@ -322,17 +322,25 @@ 0 - - - - <html><head/><body><p>fierro-parallel-explicit:</p></body></html> + + + + + 0 + 0 + + + + + 252 + 0 + - - - - - <html><head/><body><p align="center"><span style=" font-style:italic;">Specifiy the path to the build executables:</span></p></body></html> + <html><head/><body><p><span style=" color:#0433ff;">/</span></p></body></html> + + + true @@ -343,6 +351,23 @@ + + + + Select + + + false + + + + + + + <html><head/><body><p align="center"><span style=" font-style:italic;">Specifiy the path to the build executables:</span></p></body></html> + + + @@ -365,6 +390,16 @@ + + + + Select + + + false + + + @@ -387,25 +422,20 @@ - - - - - 0 - 0 - + + + + Select - - - 252 - 0 - + + false + + + + - <html><head/><body><p><span style=" color:#0433ff;">/</span></p></body></html> - - - true + <html><head/><body><p>fierro-parallel-explicit:</p></body></html> @@ -416,33 +446,39 @@ - - + + - Select - - - false + evpfft: - - + + Select - - false - - - + + + + + 0 + 0 + + + + + 252 + 0 + + - Select + <html><head/><body><p><span style=" color:#0433ff;">/</span></p></body></html> - - false + + true diff --git a/python/FIERRO-GUI/fierro_gui/ui_FIERRO_GUI.py b/python/FIERRO-GUI/fierro_gui/ui_FIERRO_GUI.py index f50a315e1..8de986ff9 100644 --- a/python/FIERRO-GUI/fierro_gui/ui_FIERRO_GUI.py +++ b/python/FIERRO-GUI/fierro_gui/ui_FIERRO_GUI.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- ################################################################################ -## Form generated from reading UI file 'FIERRO_GUIjJlJQr.ui' +## Form generated from reading UI file 'FIERRO_GUIHQzYlF.ui' ## ## Created by: Qt User Interface Compiler version 6.5.2 ## @@ -2748,19 +2748,6 @@ def setupUi(self, MainWindow): self.formLayout_5.setWidget(0, QFormLayout.FieldRole, self.BPreviewResults) - self.BPlotSS = QPushButton(self.PreviewResults) - self.BPlotSS.setObjectName(u"BPlotSS") - - self.formLayout_5.setWidget(1, QFormLayout.FieldRole, self.BPlotSS) - - self.INPlotSS = QComboBox(self.PreviewResults) - self.INPlotSS.addItem("") - self.INPlotSS.addItem("") - self.INPlotSS.addItem("") - self.INPlotSS.setObjectName(u"INPlotSS") - - self.formLayout_5.setWidget(1, QFormLayout.LabelRole, self.INPlotSS) - self.verticalLayout_18.addWidget(self.PreviewResults) @@ -3654,7 +3641,7 @@ def setupUi(self, MainWindow): def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"Fierro", None)) self.actionManual.setText(QCoreApplication.translate("MainWindow", u"Manual", None)) - self.actionChange_Working_Directory.setText(QCoreApplication.translate("MainWindow", u"Change Working Directory", None)) + self.actionChange_Working_Directory.setText(QCoreApplication.translate("MainWindow", u"Change Fierro Setup", None)) self.label_2.setText(QCoreApplication.translate("MainWindow", u"


", None)) self.SolverTypeMenu.setTabText(self.SolverTypeMenu.indexOf(self.ChooseSolver), "") self.BGlobalMesh.setText("") @@ -4051,11 +4038,6 @@ def retranslateUi(self, MainWindow): self.INPreviewResults.setItemText(1, QCoreApplication.translate("MainWindow", u"vm-strain", None)) self.BPreviewResults.setText(QCoreApplication.translate("MainWindow", u"Preview Results", None)) - self.BPlotSS.setText(QCoreApplication.translate("MainWindow", u"Plot Stress vs Strain", None)) - self.INPlotSS.setItemText(0, QCoreApplication.translate("MainWindow", u"S11 vs E11", None)) - self.INPlotSS.setItemText(1, QCoreApplication.translate("MainWindow", u"S22 vs E22", None)) - self.INPlotSS.setItemText(2, QCoreApplication.translate("MainWindow", u"S33 vs E33", None)) - self.BOpenParaview.setText(QCoreApplication.translate("MainWindow", u"Open Paraview", None)) ___qtablewidgetitem49 = self.THomogenization.horizontalHeaderItem(0) ___qtablewidgetitem49.setText(QCoreApplication.translate("MainWindow", u"Homogenized Elastic Constants", None)); diff --git a/python/FIERRO-GUI/fierro_gui/ui_FIERRO_Setup.py b/python/FIERRO-GUI/fierro_gui/ui_FIERRO_Setup.py index 4672cdc7b..eed36409d 100644 --- a/python/FIERRO-GUI/fierro_gui/ui_FIERRO_Setup.py +++ b/python/FIERRO-GUI/fierro_gui/ui_FIERRO_Setup.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- ################################################################################ -## Form generated from reading UI file 'FIERRO_SetupKwDGvF.ui' +## Form generated from reading UI file 'FIERRO_SetupmYwMLz.ui' ## ## Created by: Qt User Interface Compiler version 6.5.2 ## @@ -24,8 +24,8 @@ class Ui_Dialog(object): def setupUi(self, Dialog): if not Dialog.objectName(): Dialog.setObjectName(u"Dialog") - Dialog.resize(627, 400) - Dialog.setMinimumSize(QSize(0, 400)) + Dialog.resize(627, 450) + Dialog.setMinimumSize(QSize(0, 450)) self.verticalLayout = QVBoxLayout(Dialog) self.verticalLayout.setObjectName(u"verticalLayout") self.frame_3 = QFrame(Dialog) @@ -164,21 +164,31 @@ def setupUi(self, Dialog): self.gridLayout_3 = QGridLayout(self.frame_7) self.gridLayout_3.setObjectName(u"gridLayout_3") self.gridLayout_3.setContentsMargins(0, 0, -1, 0) - self.LFierroParallelExplicit = QLabel(self.frame_7) - self.LFierroParallelExplicit.setObjectName(u"LFierroParallelExplicit") - - self.gridLayout_3.addWidget(self.LFierroParallelExplicit, 3, 0, 1, 1) - - self.LExecutables = QLabel(self.frame_7) - self.LExecutables.setObjectName(u"LExecutables") + self.INFierroMeshBuilder = QLabel(self.frame_7) + self.INFierroMeshBuilder.setObjectName(u"INFierroMeshBuilder") + sizePolicy.setHeightForWidth(self.INFierroMeshBuilder.sizePolicy().hasHeightForWidth()) + self.INFierroMeshBuilder.setSizePolicy(sizePolicy) + self.INFierroMeshBuilder.setMinimumSize(QSize(252, 0)) + self.INFierroMeshBuilder.setWordWrap(True) - self.gridLayout_3.addWidget(self.LExecutables, 0, 2, 1, 1) + self.gridLayout_3.addWidget(self.INFierroMeshBuilder, 1, 2, 1, 1) self.LFierroMeshBuilder = QLabel(self.frame_7) self.LFierroMeshBuilder.setObjectName(u"LFierroMeshBuilder") self.gridLayout_3.addWidget(self.LFierroMeshBuilder, 1, 0, 1, 1) + self.BFierroParallelExplicit = QPushButton(self.frame_7) + self.BFierroParallelExplicit.setObjectName(u"BFierroParallelExplicit") + self.BFierroParallelExplicit.setAutoDefault(False) + + self.gridLayout_3.addWidget(self.BFierroParallelExplicit, 3, 3, 1, 1) + + self.LExecutables = QLabel(self.frame_7) + self.LExecutables.setObjectName(u"LExecutables") + + self.gridLayout_3.addWidget(self.LExecutables, 0, 2, 1, 1) + self.INFierroVoxelizer = QLabel(self.frame_7) self.INFierroVoxelizer.setObjectName(u"INFierroVoxelizer") sizePolicy.setHeightForWidth(self.INFierroVoxelizer.sizePolicy().hasHeightForWidth()) @@ -188,6 +198,12 @@ def setupUi(self, Dialog): self.gridLayout_3.addWidget(self.INFierroVoxelizer, 2, 2, 1, 1) + self.BFierroMeshBuilder = QPushButton(self.frame_7) + self.BFierroMeshBuilder.setObjectName(u"BFierroMeshBuilder") + self.BFierroMeshBuilder.setAutoDefault(False) + + self.gridLayout_3.addWidget(self.BFierroMeshBuilder, 1, 3, 1, 1) + self.INFierroParallelExplicit = QLabel(self.frame_7) self.INFierroParallelExplicit.setObjectName(u"INFierroParallelExplicit") sizePolicy.setHeightForWidth(self.INFierroParallelExplicit.sizePolicy().hasHeightForWidth()) @@ -197,37 +213,40 @@ def setupUi(self, Dialog): self.gridLayout_3.addWidget(self.INFierroParallelExplicit, 3, 2, 1, 1) - self.INFierroMeshBuilder = QLabel(self.frame_7) - self.INFierroMeshBuilder.setObjectName(u"INFierroMeshBuilder") - sizePolicy.setHeightForWidth(self.INFierroMeshBuilder.sizePolicy().hasHeightForWidth()) - self.INFierroMeshBuilder.setSizePolicy(sizePolicy) - self.INFierroMeshBuilder.setMinimumSize(QSize(252, 0)) - self.INFierroMeshBuilder.setWordWrap(True) + self.BFierroVoxelizer = QPushButton(self.frame_7) + self.BFierroVoxelizer.setObjectName(u"BFierroVoxelizer") + self.BFierroVoxelizer.setAutoDefault(False) - self.gridLayout_3.addWidget(self.INFierroMeshBuilder, 1, 2, 1, 1) + self.gridLayout_3.addWidget(self.BFierroVoxelizer, 2, 3, 1, 1) + + self.LFierroParallelExplicit = QLabel(self.frame_7) + self.LFierroParallelExplicit.setObjectName(u"LFierroParallelExplicit") + + self.gridLayout_3.addWidget(self.LFierroParallelExplicit, 3, 0, 1, 1) self.LFierroVoxelizer = QLabel(self.frame_7) self.LFierroVoxelizer.setObjectName(u"LFierroVoxelizer") self.gridLayout_3.addWidget(self.LFierroVoxelizer, 2, 0, 1, 1) - self.BFierroMeshBuilder = QPushButton(self.frame_7) - self.BFierroMeshBuilder.setObjectName(u"BFierroMeshBuilder") - self.BFierroMeshBuilder.setAutoDefault(False) + self.Levpfft = QLabel(self.frame_7) + self.Levpfft.setObjectName(u"Levpfft") - self.gridLayout_3.addWidget(self.BFierroMeshBuilder, 1, 3, 1, 1) + self.gridLayout_3.addWidget(self.Levpfft, 4, 0, 1, 1) - self.BFierroVoxelizer = QPushButton(self.frame_7) - self.BFierroVoxelizer.setObjectName(u"BFierroVoxelizer") - self.BFierroVoxelizer.setAutoDefault(False) + self.BFierroEvpfft = QPushButton(self.frame_7) + self.BFierroEvpfft.setObjectName(u"BFierroEvpfft") - self.gridLayout_3.addWidget(self.BFierroVoxelizer, 2, 3, 1, 1) + self.gridLayout_3.addWidget(self.BFierroEvpfft, 4, 3, 1, 1) - self.BFierroParallelExplicit = QPushButton(self.frame_7) - self.BFierroParallelExplicit.setObjectName(u"BFierroParallelExplicit") - self.BFierroParallelExplicit.setAutoDefault(False) + self.INFierroEvpfft = QLabel(self.frame_7) + self.INFierroEvpfft.setObjectName(u"INFierroEvpfft") + sizePolicy.setHeightForWidth(self.INFierroEvpfft.sizePolicy().hasHeightForWidth()) + self.INFierroEvpfft.setSizePolicy(sizePolicy) + self.INFierroEvpfft.setMinimumSize(QSize(252, 0)) + self.INFierroEvpfft.setWordWrap(True) - self.gridLayout_3.addWidget(self.BFierroParallelExplicit, 3, 3, 1, 1) + self.gridLayout_3.addWidget(self.INFierroEvpfft, 4, 2, 1, 1) self.verticalLayout_4.addWidget(self.frame_7) @@ -269,16 +288,19 @@ def retranslateUi(self, Dialog): self.label.setText(QCoreApplication.translate("Dialog", u"

Select profile configuration:

", None)) self.radioButton.setText(QCoreApplication.translate("Dialog", u"User", None)) self.radioButton_2.setText(QCoreApplication.translate("Dialog", u"Developer", None)) - self.LFierroParallelExplicit.setText(QCoreApplication.translate("Dialog", u"

fierro-parallel-explicit:

", None)) - self.LExecutables.setText(QCoreApplication.translate("Dialog", u"

Specifiy the path to the build executables:

", None)) + self.INFierroMeshBuilder.setText(QCoreApplication.translate("Dialog", u"

/

", None)) self.LFierroMeshBuilder.setText(QCoreApplication.translate("Dialog", u"

fierro-mesh-builder:

", None)) + self.BFierroParallelExplicit.setText(QCoreApplication.translate("Dialog", u"Select", None)) + self.LExecutables.setText(QCoreApplication.translate("Dialog", u"

Specifiy the path to the build executables:

", None)) self.INFierroVoxelizer.setText(QCoreApplication.translate("Dialog", u"

/

", None)) - self.INFierroParallelExplicit.setText(QCoreApplication.translate("Dialog", u"

/

", None)) - self.INFierroMeshBuilder.setText(QCoreApplication.translate("Dialog", u"

/

", None)) - self.LFierroVoxelizer.setText(QCoreApplication.translate("Dialog", u"

fierro-voxelizer:

", None)) self.BFierroMeshBuilder.setText(QCoreApplication.translate("Dialog", u"Select", None)) + self.INFierroParallelExplicit.setText(QCoreApplication.translate("Dialog", u"

/

", None)) self.BFierroVoxelizer.setText(QCoreApplication.translate("Dialog", u"Select", None)) - self.BFierroParallelExplicit.setText(QCoreApplication.translate("Dialog", u"Select", None)) + self.LFierroParallelExplicit.setText(QCoreApplication.translate("Dialog", u"

fierro-parallel-explicit:

", None)) + self.LFierroVoxelizer.setText(QCoreApplication.translate("Dialog", u"

fierro-voxelizer:

", None)) + self.Levpfft.setText(QCoreApplication.translate("Dialog", u"evpfft:", None)) + self.BFierroEvpfft.setText(QCoreApplication.translate("Dialog", u"Select", None)) + self.INFierroEvpfft.setText(QCoreApplication.translate("Dialog", u"

/

", None)) self.BConfirm.setText(QCoreApplication.translate("Dialog", u"Confirm", None)) # retranslateUi