rama / app.py
SuriRaja's picture
Create app.py
f45088a verified
import gradio as gr
import numpy as np
import matplotlib.pyplot as plt
from ansys.mapdl.core import launch_mapdl
# Function to generate APDL script
def generate_apdl_script(youngs_modulus, poissons_ratio, length, width, thickness, element_size, pressure):
script = f"""
/PREP7
MP,EX,1,{youngs_modulus}
MP,PRXY,1,{poissons_ratio}
BLOCK,0,{length},0,{width},0,{thickness}
ESIZE,{element_size}
ET,1,SOLID185
VMESH,ALL
NSEL,S,LOC,X,0
D,ALL,ALL
ALLSEL,ALL
NSEL,S,LOC,Z,{thickness}
SF,ALL,PRES,{pressure}
ALLSEL,ALL
/SOLU
ANTYPE,STATIC
SOLVE
FINISH
/POST1
SET,1,1
PRNSOL,U,Z
PRNSOL,S,EQV
FINISH
"""
return script
# Function to run simulation and return results
def run_simulation(apdl_script):
mapdl = launch_mapdl()
mapdl.input_strings(apdl_script)
mapdl.post1()
mapdl.set(1, 1)
nodal_displacements = mapdl.post_processing.nodal_displacement('UZ')
nodal_stress = mapdl.post_processing.nodal_stress(0)
mapdl.exit()
return nodal_displacements, nodal_stress
# Function to visualize results
def visualize_results(displacements, stress):
fig, ax = plt.subplots(2, 1, figsize=(10, 8))
ax[0].plot(displacements, label='Nodal Displacement (UZ)')
ax[0].set_xlabel('Node Number')
ax[0].set_ylabel('Displacement (mm)')
ax[0].set_title('Nodal Displacement in Z Direction')
ax[0].legend()
ax[0].grid(True)
ax[1].plot(stress, label='Nodal Stress (EQV)')
ax[1].set_xlabel('Node Number')
ax[1].set_ylabel('Stress (MPa)')
ax[1].set_title('Equivalent Nodal Stress')
ax[1].legend()
ax[1].grid(True)
plt.tight_layout()
plt.show()
# Function to evaluate results against design criteria
def evaluate_results(displacements, stress, displacement_threshold=0.5, stress_threshold=250):
max_displacement = np.max(np.abs(displacements))
max_stress = np.max(np.abs(stress))
displacement_ok = max_displacement <= displacement_threshold
stress_ok = max_stress <= stress_threshold
return displacement_ok and stress_ok, max_displacement, max_stress
# Gradio interface functions
def project_requirements(youngs_modulus, poissons_ratio, length, width, thickness, element_size, pressure):
params = {
'youngs_modulus': youngs_modulus,
'poissons_ratio': poissons_ratio,
'length': length,
'width': width,
'thickness': thickness,
'element_size': element_size,
'pressure': pressure
}
return params
def apdl_program(params):
apdl_script = generate_apdl_script(**params)
return apdl_script
def simulation_and_visualization(apdl_script):
displacements, stress = run_simulation(apdl_script)
visualize_results(displacements, stress)
design_acceptable, max_disp, max_strs = evaluate_results(displacements, stress)
result_message = (
f"Max Displacement: {max_disp:.2f} mm\n"
f"Max Stress: {max_strs:.2f} MPa\n"
f"Design {'meets' if design_acceptable else 'does not meet'} all criteria."
)
return result_message
# Gradio Blocks for multi-tab interface
with gr.Blocks() as demo:
with gr.Tabs():
with gr.TabItem("Project Requirements"):
youngs_modulus = gr.Number(label="Young's Modulus (MPa)", value=210000)
poissons_ratio = gr.Number(label="Poisson's Ratio", value=0.3)
length = gr.Number(label="Length (mm)", value=100)
width = gr.Number(label="Width (mm)", value=50)
thickness = gr.Number(label="Thickness (mm)", value=10)
element_size = gr.Number(label="Element Size (mm)", value=5)
pressure = gr.Number(label="Applied Pressure (MPa)", value=10)
params_button = gr.Button("Submit")
params_output = gr.JSON()
params_button.click(
project_requirements,
inputs=[youngs_modulus, poissons_ratio, length, width, thickness, element_size, pressure],
outputs=params_output
)
with gr.TabItem("APDL Program Generation"):
apdl_output = gr.Textbox(label="Generated APDL Script", lines=20)
params_output.change(
apdl_program,
inputs=params_output,
outputs=apdl_output
)
with gr.TabItem("Simulation and Visualization"):
result_output = gr.Textbox(label="Simulation Results", lines=10)
simulate_button = gr.Button("Run Simulation")
simulate_button.click(
simulation_and_visualization,
inputs=apdl_output,
outputs=result_output
)
demo.launch()