cadsimulation5 / app.py
karthikmn's picture
Update app.py
3a5b1a4 verified
import os
import gradio as gr
from ansys.mapdl.core import launch_mapdl
def generate_apdl_script(step_file_path, material_e, material_nu, mesh_size, load_value):
"""
Generate a detailed APDL script for simulation.
Parameters:
- step_file_path: Path to the uploaded STEP file.
- material_e: Young's Modulus of the material (Pa).
- material_nu: Poisson's Ratio of the material.
- mesh_size: Element size for meshing.
- load_value: Load to apply (N).
Returns:
- Path to the generated APDL script.
"""
file_name = os.path.basename(step_file_path)
part_name = os.path.splitext(file_name)[0]
# APDL script content
apdl_script = f"""
/prep7
! Import STEP geometry
/import, '{part_name}', step
! Define material properties
mp, ex, 1, {material_e}
mp, nuxy, 1, {material_nu}
! Set element type
et, 1, solid186
! Mesh the model
esize, {mesh_size}
amesh, all
! Apply boundary conditions
nsel, s, loc, x, 0
d, all, ux, 0
nsel, s, loc, y, 0
d, all, uy, 0
nsel, s, loc, z, 0
d, all, uz, 0
! Apply loads
nsel, s, loc, z, max
f, all, fz, {load_value}
! Solve the model
/solu
antype, static
solve
! Post-processing
/post1
set, last
! Write results
prnsol, s, comp
prnsol, u, comp
/exit
"""
# Save APDL script
apdl_file_path = f"/tmp/{part_name}_simulation_apdl.txt"
with open(apdl_file_path, "w") as f:
f.write(apdl_script)
return apdl_file_path
def run_simulation(step_file, material_e, material_nu, mesh_size, load_value):
"""
Generate the APDL script, run the simulation, and fetch results.
"""
# Generate the APDL script
apdl_file_path = generate_apdl_script(step_file.name, material_e, material_nu, mesh_size, load_value)
# Launch ANSYS MAPDL (ensure it's installed and licensed)
mapdl = launch_mapdl()
# Upload STEP file and APDL script to MAPDL
mapdl.upload(step_file.name)
mapdl.input(apdl_file_path)
# Run the APDL script
mapdl.run("/SOLU")
mapdl.solve()
# Post-process results
stress_output = mapdl.result.principal_stress()
displacement_output = mapdl.result.nodal_displacement()
# Save outputs
stress_file = "/tmp/stress_results.txt"
with open(stress_file, "w") as f:
f.write("Principal Stress Results:\n")
f.write(str(stress_output))
displacement_file = "/tmp/displacement_results.txt"
with open(displacement_file, "w") as f:
f.write("Nodal Displacement Results:\n")
f.write(str(displacement_output))
# Stop MAPDL
mapdl.exit()
return stress_file, displacement_file
# Gradio interface
def process_step_file(step_file, material_e, material_nu, mesh_size, load_value):
stress_file, displacement_file = run_simulation(step_file, material_e, material_nu, mesh_size, load_value)
return stress_file, displacement_file
# Define Gradio Interface
with gr.Blocks() as app:
with gr.Row():
step_file = gr.File(label="Upload STEP File")
material_e = gr.Number(label="Young's Modulus (Pa)", value=210e9)
material_nu = gr.Number(label="Poisson's Ratio", value=0.3)
mesh_size = gr.Number(label="Mesh Size (mm)", value=10)
load_value = gr.Number(label="Load Value (N)", value=1000)
submit_button = gr.Button("Submit")
stress_output = gr.File(label="Download Stress Results")
displacement_output = gr.File(label="Download Displacement Results")
submit_button.click(
process_step_file,
inputs=[step_file, material_e, material_nu, mesh_size, load_value],
outputs=[stress_output, displacement_output],
)
if __name__ == "__main__":
app.queue() # Ensure proper queuing for the submit button
app.launch()