Spaces:
Sleeping
Sleeping
| from fenics import * | |
| def run_fenics_simulation(length, width, thickness, force): | |
| """ | |
| Executes a FEniCS-based finite element simulation. | |
| Parameters: | |
| length (float): Length of the plate/beam. | |
| width (float): Width of the plate/beam. | |
| thickness (float): Thickness of the plate/beam. | |
| force (float): Applied force. | |
| Returns: | |
| tuple: (stress, deformation) from the simulation. | |
| """ | |
| # Geometry and mesh | |
| mesh = RectangleMesh(Point(0, 0), Point(length, width), 10, 10) | |
| # Define function space | |
| V = VectorFunctionSpace(mesh, "P", 1) | |
| # Define boundary conditions | |
| def clamped_boundary(x, on_boundary): | |
| return on_boundary and near(x[0], 0) | |
| bc = DirichletBC(V, Constant((0, 0)), clamped_boundary) | |
| # Define material properties | |
| E = 2e11 # Elastic modulus (Pa) | |
| nu = 0.3 # Poisson's ratio | |
| mu = E / (2 * (1 + nu)) | |
| lmbda = E * nu / ((1 + nu) * (1 - 2 * nu)) | |
| # Define strain and stress | |
| def epsilon(u): | |
| return sym(grad(u)) | |
| def sigma(u): | |
| return lmbda * div(u) * Identity(2) + 2 * mu * epsilon(u) | |
| # Define variational problem | |
| u = TrialFunction(V) | |
| d = TestFunction(V) | |
| f = Constant((force / (length * width), 0)) | |
| T = inner(sigma(u), epsilon(d)) * dx - dot(f, d) * dx | |
| a, L = lhs(T), rhs(T) | |
| # Solve problem | |
| u_sol = Function(V) | |
| solve(a == L, u_sol, bc) | |
| # Post-process results | |
| stress = max(project(sigma(u_sol)[0, 0], FunctionSpace(mesh, "P", 1)).vector()) | |
| deformation = max(u_sol.vector()) | |
| return stress, deformation | |