# -*- coding: utf-8 -*-
# TorsoCAE Validation Journal — geometric_nonlinear case 1: cantilever elastica large deflection
# See README.md in this directory for theory and results.

import sys
sys.path.insert(0, "./server/")
from pytorsocae import TorsoCAESession

session = TorsoCAESession()
session.csg_make_shape("box", {"dx": 2.0, "dy": 0.1, "dz": 0.1, "cx": 0, "cy": -0.05, "cz": -0.05},
                        name="Elastica", body_id="body_0")
session.csg_select("body_0")
session.mesh(mesh_id="mesh_0", algo_id="hex_transfinite", size_factor=1.0, size_min=0, size_max=0, order=2, dim=3)
session.solid("Elastica").material(E=210e9, nu=0.3)
session.surface(1, scope_id="body_0").bc("fixed")
session.surface(2, scope_id="body_0").bc("traction", values=[0, 87500000, 0])   # p=2.0 -> P_total=875000N over 0.01 m^2
session.set_physics("structural", submodel="geometric_nonlinear", backend="dolfinx")
session.set_solver_options(algo="cg", precond="gamg", tol=1e-08, max_iter=2000,
                            num_steps=20, max_inner_iter=25, inner_tol=1e-07, n_cores=2, device="cpu")
session.compute(mesh_ids=["mesh_0"])
