From 53b9c0b6e684d3a3e2dc9dd8b2e72957166e87cb Mon Sep 17 00:00:00 2001 From: FEA-eng <59876896+FEA-eng@users.noreply.github.com> Date: Fri, 15 Mar 2024 19:12:12 +0100 Subject: [PATCH] Fem: Update writer of the constraint rigid body --- src/Mod/Fem/App/FemConstraintRigidBody.cpp | 2 +- src/Mod/Fem/CMakeLists.txt | 1 + .../calculix/write_constraint_rigidbody.py | 28 +++--- .../write_constraint_rigidbody_step.py | 88 +++++++++++++++++++ src/Mod/Fem/femsolver/calculix/writer.py | 2 + src/Mod/Fem/femtools/membertools.py | 3 + 6 files changed, 105 insertions(+), 19 deletions(-) create mode 100644 src/Mod/Fem/femsolver/calculix/write_constraint_rigidbody_step.py diff --git a/src/Mod/Fem/App/FemConstraintRigidBody.cpp b/src/Mod/Fem/App/FemConstraintRigidBody.cpp index dd7a5bd194..cb57e9cdca 100644 --- a/src/Mod/Fem/App/FemConstraintRigidBody.cpp +++ b/src/Mod/Fem/App/FemConstraintRigidBody.cpp @@ -77,7 +77,7 @@ void ConstraintRigidBody::onChanged(const App::Property* prop) if (prop == &References) { std::vector points; std::vector normals; - int scale = 1; // OvG: Enforce use of scale + double scale = 1; // OvG: Enforce use of scale if (getPoints(points, normals, &scale)) { Points.setValues(points); Normals.setValues(normals); diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index 365e208dc7..97a64ed510 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -232,6 +232,7 @@ SET(FemSolverCalculix_SRCS femsolver/calculix/write_constraint_planerotation.py femsolver/calculix/write_constraint_pressure.py femsolver/calculix/write_constraint_rigidbody.py + femsolver/calculix/write_constraint_rigidbody_step.py femsolver/calculix/write_constraint_sectionprint.py femsolver/calculix/write_constraint_selfweight.py femsolver/calculix/write_constraint_temperature.py diff --git a/src/Mod/Fem/femsolver/calculix/write_constraint_rigidbody.py b/src/Mod/Fem/femsolver/calculix/write_constraint_rigidbody.py index 26169e4098..0ea4566e80 100644 --- a/src/Mod/Fem/femsolver/calculix/write_constraint_rigidbody.py +++ b/src/Mod/Fem/femsolver/calculix/write_constraint_rigidbody.py @@ -66,9 +66,9 @@ def write_constraint(f, femobj, rb_obj, ccxwriter): is_ref_bc_defined = any((rb_obj.xDisplacement, rb_obj.yDisplacement, rb_obj.zDisplacement, - rb_obj.xLoad, - rb_obj.yLoad, - rb_obj.zLoad)) + rb_obj.xForce, + rb_obj.yForce, + rb_obj.zForce)) is_rot_bc_defined = any((rb_obj.xRotation, rb_obj.yRotation, @@ -78,10 +78,14 @@ def write_constraint(f, femobj, rb_obj, ccxwriter): rb_obj.zMoment)) # FIXME: This needs to be implemented - ref_node_idx = -1 - rot_node_idx = -1 + ref_node_idx = 10000000 + rot_node_idx = 20000000 - kw_line = "*RIGID BODY,NSET={}".format(rb_obj.Name) + f.write("*NODE\n") + f.write("{},{},{},{}\n".format(ref_node_idx, rb_obj.xRefNode, rb_obj.yRefNode, rb_obj.zRefNode)) + f.write("{},{},{},{}\n".format(rot_node_idx, rb_obj.xRefNode, rb_obj.yRefNode, rb_obj.zRefNode)) + + kw_line = "*RIGID BODY, NSET={}, REF NODE={}, ROT NODE={}".format(rb_obj.Name, ref_node_idx, rot_node_idx) if is_ref_bc_defined: kw_line = kw_line + ",REF NODE={}".format(ref_node_idx) @@ -91,15 +95,3 @@ def write_constraint(f, femobj, rb_obj, ccxwriter): f.write(kw_line + "\n") - # TODO: Displacement definitions need fixing - if is_ref_bc_defined: - f.write("*CLOAD\n") - f.write("{},1,{}\n".format(ref_node_idx, rb_obj.xLoad)) - f.write("{},2,{}\n".format(ref_node_idx, rb_obj.yLoad)) - f.write("{},3,{}\n".format(ref_node_idx, rb_obj.zLoad)) - - if is_rot_bc_defined: - f.write("*CLOAD\n") - f.write("{},1,{}\n".format(rot_node_idx, rb_obj.xMoment)) - f.write("{},2,{}\n".format(rot_node_idx, rb_obj.yMoment)) - f.write("{},3,{}\n".format(rot_node_idx, rb_obj.zMoment)) diff --git a/src/Mod/Fem/femsolver/calculix/write_constraint_rigidbody_step.py b/src/Mod/Fem/femsolver/calculix/write_constraint_rigidbody_step.py new file mode 100644 index 0000000000..4b026675d3 --- /dev/null +++ b/src/Mod/Fem/femsolver/calculix/write_constraint_rigidbody_step.py @@ -0,0 +1,88 @@ +# *************************************************************************** +# * Copyright (c) 2022 Ajinkya Dahale * +# * * +# * This file is part of the FreeCAD CAx development system. * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +__title__ = "FreeCAD FEM calculix constraint rigid body" +__author__ = "Ajinkya Dahale" +__url__ = "https://www.freecadweb.org" + + +def get_analysis_types(): + return "all" # write for all analysis types + + +def get_sets_name(): + return "constraints_rigidbody_node_sets" + + +def get_constraint_title(): + return "Rigid Body Constraints" + + +def get_before_write_meshdata_constraint(): + return "" + + +def get_after_write_meshdata_constraint(): + return "" + + +def get_before_write_constraint(): + return "" + + +def get_after_write_constraint(): + return "" + + +def write_constraint(f, femobj, rb_obj, ccxwriter): + + # floats read from ccx should use {:.13G}, see comment in writer module + is_ref_bc_defined = any((rb_obj.xDisplacement, + rb_obj.yDisplacement, + rb_obj.zDisplacement, + rb_obj.xForce, + rb_obj.yForce, + rb_obj.zForce)) + + is_rot_bc_defined = any((rb_obj.xRotation, + rb_obj.yRotation, + rb_obj.zRotation, + rb_obj.xMoment, + rb_obj.yMoment, + rb_obj.zMoment)) + + # FIXME: This needs to be implemented + ref_node_idx = 10000000 + rot_node_idx = 20000000 + + + # TODO: Displacement definitions need fixing + f.write("*CLOAD\n") + f.write("{},1,{}\n".format(ref_node_idx, rb_obj.xForce)) + f.write("{},2,{}\n".format(ref_node_idx, rb_obj.yForce)) + f.write("{},3,{}\n".format(ref_node_idx, rb_obj.zForce)) + + f.write("*CLOAD\n") + f.write("{},1,{}\n".format(rot_node_idx, rb_obj.xMoment)) + f.write("{},2,{}\n".format(rot_node_idx, rb_obj.yMoment)) + f.write("{},3,{}\n".format(rot_node_idx, rb_obj.zMoment)) diff --git a/src/Mod/Fem/femsolver/calculix/writer.py b/src/Mod/Fem/femsolver/calculix/writer.py index 25225bc9c5..bee4afb173 100644 --- a/src/Mod/Fem/femsolver/calculix/writer.py +++ b/src/Mod/Fem/femsolver/calculix/writer.py @@ -46,6 +46,7 @@ from . import write_constraint_initialtemperature as con_itemp from . import write_constraint_planerotation as con_planerotation from . import write_constraint_pressure as con_pressure from . import write_constraint_rigidbody as con_rigidbody +from . import write_constraint_rigidbody_step as con_rigidbody_step from . import write_constraint_sectionprint as con_sectionprint from . import write_constraint_selfweight as con_selfweight from . import write_constraint_temperature as con_temperature @@ -190,6 +191,7 @@ class FemInputWriterCcx(writerbase.FemInputWriter): # constraints dependent from steps self.write_constraints_propdata(inpfile, self.member.cons_fixed, con_fixed) + self.write_constraints_propdata(inpfile, self.member.cons_rigidbody_step, con_rigidbody_step) self.write_constraints_propdata(inpfile, self.member.cons_displacement, con_displacement) self.write_constraints_propdata(inpfile, self.member.cons_sectionprint, con_sectionprint) self.write_constraints_propdata(inpfile, self.member.cons_selfweight, con_selfweight) diff --git a/src/Mod/Fem/femtools/membertools.py b/src/Mod/Fem/femtools/membertools.py index 705885b0a6..058ca710d5 100644 --- a/src/Mod/Fem/femtools/membertools.py +++ b/src/Mod/Fem/femtools/membertools.py @@ -301,6 +301,9 @@ class AnalysisMember(): self.cons_rigidbody = self.get_several_member( "Fem::ConstraintRigidBody" ) + self.cons_rigidbody_step = self.get_several_member( + "Fem::ConstraintRigidBody" + ) self.cons_force = self.get_several_member( "Fem::ConstraintForce" )