diff --git a/iga/README.md b/iga/README.md index 11e192c2..582c2188 100644 --- a/iga/README.md +++ b/iga/README.md @@ -1,10 +1,19 @@ # Iga Examples +This folder contains examples related to Isogeometric Analysis in Kratos. + +They are realized using the IgaApplication + +The Examples are continuously updated and extended + ## Use Cases - [External Boundary Circle (NURBS)](https://github.com/KratosMultiphysics/Examples/blob/master/iga/use_cases/external_boundary_circle_with_nurbs/README.md) - [IGA Single-Patch Shell in Membrane Action with Weak Supports and Line Load](https://github.com/KratosMultiphysics/Examples/blob/master/iga/use_cases/iga_shell_3p_single_patch/README.md) - [3D Laplacian on an Embedded Cube with SBM](https://github.com/KratosMultiphysics/Examples/blob/master/iga/use_cases/laplacian_3d_cube_sbm/README.md) ## Validation Cases - -# Use Cases +- [Buckling Analysis - Single Patch - Cantilever Beam](https://github.com/KratosMultiphysics/Examples/blob/master/iga/validation/buckling_analysis_single_patch_cantilever_beam/README.md) +- [Geometric Linear Analysis - Single Patch - Scordelis-Lo Roof](https://github.com/KratosMultiphysics/Examples/blob/master/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/README.md) +- [Geometric Linear Analysis - Trimmed Patch - Plate with Hole](https://github.com/KratosMultiphysics/Examples/blob/master/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/README.md) +- [Geometric Non-Linear Analysis - Multi Patch - Cantilever Beam](https://github.com/KratosMultiphysics/Examples/blob/master/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/README.md) +- [Geometric Non-Linear Analysis - Single Patch - Cantilever Beam](https://github.com/KratosMultiphysics/Examples/blob/master/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/README.md) diff --git a/iga/validation/README.md b/iga/validation/README.md index 78c1f8ac..efed75d2 100644 --- a/iga/validation/README.md +++ b/iga/validation/README.md @@ -2,3 +2,8 @@ This folder contains the validation cases: +- [Buckling Analysis - Single Patch - Cantilever Beam](buckling_analysis_single_patch_cantilever_beam/README.md) +- [Geometric Linear Analysis - Single Patch - Scordelis-Lo Roof](geometric_linear_analysis_single_patch_scordelis_lo_roof/README.md) +- [Geometric Linear Analysis - Trimmed Patch - Plate with Hole](geometric_linear_analysis_trimmed_patch_plate_with_hole/README.md) +- [Geometric Non-Linear Analysis - Multi Patch - Cantilever Beam](geometric_nonlinear_analysis_multi_patch_cantilever_beam/README.md) +- [Geometric Non-Linear Analysis - Single Patch - Cantilever Beam](geometric_nonlinear_analysis_single_patch_cantilever_beam/README.md) diff --git a/iga/validation/buckling_analysis_single_patch_cantilever_beam/README.md b/iga/validation/buckling_analysis_single_patch_cantilever_beam/README.md new file mode 100644 index 00000000..0175b941 --- /dev/null +++ b/iga/validation/buckling_analysis_single_patch_cantilever_beam/README.md @@ -0,0 +1,49 @@ +# Buckling Analysis - Single Patch - Cantilever Beam + +**Author:** Aakash Ravichandran + +**Kratos version:** 10.2 + +**Source files:** [Buckling Analysis - Single Patch - Cantilever Beam](https://github.com/KratosMultiphysics/Examples/tree/master/iga/validation/buckling_analysis_single_patch_cantilever_beam/source) + +## Problem definition + +This example presents the validation of buckling analysis in Kratos with Isogeometric Analysis. + +
+Displacement + +*Structural System [1]* +
+ + +The cantilever beam is modeled using single NURBS patch with the Shell3pElement. The CAD model is constructed with single span B-spline surfaces and has a curve degree of 2 in both directions of the plane. Additional refinement is applied in Kratos, by increasing the curve degree to 4 in both axes and inserting 4 knots in the width and 20 knots along the length of the beam. + +## Results + +The buckling load factors are shown in table below. The corresponding buckling modes are shown in image below. + +
+ +| | Reference | Kratos | +| :--- | :--- | :--- | +| $\lambda_{cr}^{(1)}$ | 4.1123 | 4.06977 | +| $\lambda_{cr}^{(2)}$ | 16.449 | 16.1693 | +| $\lambda_{cr}^{(3)}$ | 37.011 | 36.6759 | +| $\lambda_{cr}^{(4)}$ | 102.81 | 102.106 | + +
+ +| Buckling Mode Shape 1 | Buckling Mode Shape 2 | +| :---: | :---: | +| ![Buckling Mode Shape 1](data/Buckling_Mode_1.png) | ![Buckling Mode Shape 2](data/Buckling_Mode_2.png) | + +| Buckling Mode Shape 3 | Buckling Mode Shape 4 | +| :---: | :---: | +| ![Buckling Mode Shape 3](data/Buckling_Mode_3.png) | ![Buckling Mode Shape 4](data/Buckling_Mode_4.png) | + + + +## References + +1. Altair Engineering, Inc. (2026). *OS-V: 0080 Buckling of Shells and Composites with Offset*. In Altair OptiStruct Verification Problems. [link](https://help.altair.com/hwsolvers/os/topics/solvers/os/buckling_of_shells_and_composites_with_offset_verification_r.htm) \ No newline at end of file diff --git a/iga/validation/buckling_analysis_single_patch_cantilever_beam/data/Buckling_Mode_1.png b/iga/validation/buckling_analysis_single_patch_cantilever_beam/data/Buckling_Mode_1.png new file mode 100644 index 00000000..19580627 Binary files /dev/null and b/iga/validation/buckling_analysis_single_patch_cantilever_beam/data/Buckling_Mode_1.png differ diff --git a/iga/validation/buckling_analysis_single_patch_cantilever_beam/data/Buckling_Mode_2.png b/iga/validation/buckling_analysis_single_patch_cantilever_beam/data/Buckling_Mode_2.png new file mode 100644 index 00000000..53fcb4b5 Binary files /dev/null and b/iga/validation/buckling_analysis_single_patch_cantilever_beam/data/Buckling_Mode_2.png differ diff --git a/iga/validation/buckling_analysis_single_patch_cantilever_beam/data/Buckling_Mode_3.png b/iga/validation/buckling_analysis_single_patch_cantilever_beam/data/Buckling_Mode_3.png new file mode 100644 index 00000000..cb15b1ee Binary files /dev/null and b/iga/validation/buckling_analysis_single_patch_cantilever_beam/data/Buckling_Mode_3.png differ diff --git a/iga/validation/buckling_analysis_single_patch_cantilever_beam/data/Buckling_Mode_4.png b/iga/validation/buckling_analysis_single_patch_cantilever_beam/data/Buckling_Mode_4.png new file mode 100644 index 00000000..adbfbd9d Binary files /dev/null and b/iga/validation/buckling_analysis_single_patch_cantilever_beam/data/Buckling_Mode_4.png differ diff --git a/iga/validation/buckling_analysis_single_patch_cantilever_beam/data/Reference_Model.png b/iga/validation/buckling_analysis_single_patch_cantilever_beam/data/Reference_Model.png new file mode 100644 index 00000000..b8584dd8 Binary files /dev/null and b/iga/validation/buckling_analysis_single_patch_cantilever_beam/data/Reference_Model.png differ diff --git a/iga/validation/buckling_analysis_single_patch_cantilever_beam/source/ProjectParameters.json b/iga/validation/buckling_analysis_single_patch_cantilever_beam/source/ProjectParameters.json new file mode 100644 index 00000000..bc7833c4 --- /dev/null +++ b/iga/validation/buckling_analysis_single_patch_cantilever_beam/source/ProjectParameters.json @@ -0,0 +1,177 @@ +{ + "problem_data": { + "problem_name": "Buckling_Analysis", + "echo_level": 0, + "parallel_type": "OpenMP", + "start_time": 0, + "end_time": 0.1 + }, + "solver_settings": { + "model_part_name": "IgaModelPart", + "domain_size": 1, + "echo_level": 1, + "buffer_size": 2, + "analysis_type": "linear", + "model_import_settings": { + "input_type": "use_input_model_part" + }, + "material_import_settings": { + "materials_filename": "materials.json" + }, + "time_stepping": { + "time_step": 1 + }, + "rotation_dofs": false, + "reform_dofs_at_each_step": false, + "line_search": false, + "compute_reactions": true, + "clear_storage": false, + "move_mesh_flag": true, + "convergence_criterion": "residual_criterion", + "displacement_relative_tolerance": 0.0001, + "displacement_absolute_tolerance": 1E-09, + "residual_relative_tolerance": 0.0001, + "residual_absolute_tolerance": 1E-09, + "max_iteration": 1, + "builder_and_solver_settings" : { + "advanced_settings": {}, + "use_block_builder": true, + "use_lagrange_BS": false + }, + "solver_type": "prebuckling", + "buckling_settings" : { + "initial_load_increment" : 1.0, + "small_load_increment" : 0.0005, + "path_following_step" : 0.5, + "convergence_ratio" : 0.05, + "make_matrices_symmetric" : true + }, + "eigensolver_settings" : { + "solver_type" : "eigen_eigensystem", + "max_iteration" : 1000, + "tolerance" : 1e-6, + "number_of_eigenvalues" : 5, + "echo_level" : 1 + }, + "auxiliary_variables_list": [], + "auxiliary_dofs_list": [], + "auxiliary_reaction_list": [] + }, + "modelers": [ + { + "modeler_name": "CadIoModeler", + "Parameters": { + "echo_level": 0, + "cad_model_part_name": "IgaModelPart", + "geometry_file_name": "geometry.cad.json", + "output_geometry_file_name": "Buckling_Analysis_kratos_0.georhino.json" + } + }, + { + "modeler_name": "RefinementModeler", + "Parameters": { + "echo_level": 0, + "physics_file_name": "refinements.iga.json" + } + }, + { + "modeler_name": "IgaModeler", + "Parameters": { + "echo_level": 0, + "cad_model_part_name": "IgaModelPart", + "analysis_model_part_name": "IgaModelPart", + "physics_file_name": "physics.iga.json" + } + } + ], + "processes": { + "additional_processes": [ + { + "kratos_module": "IgaApplication", + "python_module": "output_quadrature_domain_process", + "Parameters": { + "output_file_name": "Buckling_Analysis_kratos_shell_1_integrationdomain.json", + "model_part_name": "IgaModelPart.StructuralAnalysis_1", + "output_geometry_elements": true, + "output_geometry_conditions": false + } + }, + { + "kratos_module": "IgaApplication", + "python_module": "output_quadrature_domain_process", + "Parameters": { + "output_file_name": "Buckling_Analysis_kratos_support_2_integrationdomain.json", + "model_part_name": "IgaModelPart.Support_2", + "output_geometry_elements": false, + "output_geometry_conditions": true + } + }, + { + "kratos_module": "IgaApplication", + "python_module": "output_eigen_values_process", + "Parameters": { + "output_file_name": "Buckling_Analysis_kratos_eigen_values.post.res", + "model_part_name": "IgaModelPart" + } + } + ], + "dirichlet_process_list": [ + { + "kratos_module": "KratosMultiphysics", + "python_module": "assign_vector_variable_process", + "Parameters": { + "model_part_name": "IgaModelPart.Support_2", + "variable_name": "DISPLACEMENT", + "value": [ + 0, + 0, + 0 + ], + "interval": [ + 0, + "End" + ] + } + }, + { + "kratos_module": "KratosMultiphysics", + "python_module": "assign_vector_variable_process", + "Parameters": { + "model_part_name": "IgaModelPart.Support_2_Rotational", + "variable_name": "DISPLACEMENT", + "value": [ + 0, + 0, + 0 + ], + "interval": [ + 0, + "End" + ] + } + } + ], + "neumann_process_list": [ + { + "kratos_module": "KratosMultiphysics", + "python_module": "assign_vector_variable_to_conditions_process", + "Parameters": { + "model_part_name": "IgaModelPart.Load_3", + "variable_name": "DEAD_LOAD", + "value": [ + -5, + 0, + 0 + ], + "interval": [ + 0, + "End" + ] + } + } + ] + }, + "output_processes": { + "output_process_list": [] + } +} \ No newline at end of file diff --git a/iga/validation/buckling_analysis_single_patch_cantilever_beam/source/geometry.cad.json b/iga/validation/buckling_analysis_single_patch_cantilever_beam/source/geometry.cad.json new file mode 100644 index 00000000..12396c4b --- /dev/null +++ b/iga/validation/buckling_analysis_single_patch_cantilever_beam/source/geometry.cad.json @@ -0,0 +1,507 @@ +{ + "tolerances": { + "model_tolerance": 0.001 + }, + "version_number": 1, + "breps": [ + { + "brep_id": 1, + "faces": [ + { + "brep_id": 2, + "swapped_surface_normal": false, + "surface": { + "is_trimmed": true, + "is_rational": false, + "degrees": [ + 2, + 2 + ], + "knot_vectors": [ + [ + 0, + 0, + 0, + 2, + 2, + 2 + ], + [ + 0, + 0, + 0, + 100, + 100, + 100 + ] + ], + "control_points": [ + [ + 1, + [ + 0, + 0, + 0, + 1 + ] + ], + [ + 2, + [ + 0, + 1, + 0, + 1 + ] + ], + [ + 3, + [ + 0, + 2, + 0, + 1 + ] + ], + [ + 4, + [ + 50, + 0, + 0, + 1 + ] + ], + [ + 5, + [ + 50, + 1, + 0, + 1 + ] + ], + [ + 6, + [ + 50, + 2, + 0, + 1 + ] + ], + [ + 7, + [ + 100, + 0, + 0, + 1 + ] + ], + [ + 8, + [ + 100, + 1, + 0, + 1 + ] + ], + [ + 9, + [ + 100, + 2, + 0, + 1 + ] + ] + ] + }, + "boundary_loops": [ + { + "loop_type": "outer", + "trimming_curves": [ + { + "trim_index": 0, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 2, + 2 + ], + "active_range": [ + 0, + 2 + ], + "control_points": [ + [ + 10, + [ + 0, + 0, + 0, + 1 + ] + ], + [ + 11, + [ + 2, + 0, + 0, + 1 + ] + ] + ] + } + }, + { + "trim_index": 1, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 100, + 100 + ], + "active_range": [ + 0, + 100 + ], + "control_points": [ + [ + 12, + [ + 2, + 0, + 0, + 1 + ] + ], + [ + 13, + [ + 2, + 100, + 0, + 1 + ] + ] + ] + } + }, + { + "trim_index": 2, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 2, + 2 + ], + "active_range": [ + 0, + 2 + ], + "control_points": [ + [ + 14, + [ + 2, + 100, + 0, + 1 + ] + ], + [ + 15, + [ + 0, + 100, + 0, + 1 + ] + ] + ] + } + }, + { + "trim_index": 3, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 100, + 100 + ], + "active_range": [ + 0, + 100 + ], + "control_points": [ + [ + 16, + [ + 0, + 100, + 0, + 1 + ] + ], + [ + 17, + [ + 0, + 0, + 0, + 1 + ] + ] + ] + } + } + ] + } + ], + "embedded_loops": [], + "embedded_edges": [], + "embedded_points": [] + } + ], + "edges": [ + { + "brep_id": 3, + "3d_curve": { + "degree": 2, + "knot_vector": [ + 0, + 0, + 0, + 2, + 2, + 2 + ], + "active_range": [ + 0, + 2 + ], + "control_points": [ + [ + 18, + [ + 0, + 0, + 0, + 1 + ] + ], + [ + 19, + [ + 0, + 1, + 0, + 1 + ] + ], + [ + 20, + [ + 0, + 2, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 2, + "trim_index": 0, + "relative_direction": true + } + ] + }, + { + "brep_id": 4, + "3d_curve": { + "degree": 2, + "knot_vector": [ + 0, + 0, + 0, + 100, + 100, + 100 + ], + "active_range": [ + 0, + 100 + ], + "control_points": [ + [ + 21, + [ + 0, + 2, + 0, + 1 + ] + ], + [ + 22, + [ + 50, + 2, + 0, + 1 + ] + ], + [ + 23, + [ + 100, + 2, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 2, + "trim_index": 1, + "relative_direction": true + } + ] + }, + { + "brep_id": 5, + "3d_curve": { + "degree": 2, + "knot_vector": [ + -2, + -2, + -2, + 0, + 0, + 0 + ], + "active_range": [ + -2, + 0 + ], + "control_points": [ + [ + 24, + [ + 100, + 2, + 0, + 1 + ] + ], + [ + 25, + [ + 100, + 1, + 0, + 1 + ] + ], + [ + 26, + [ + 100, + 0, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 2, + "trim_index": 2, + "relative_direction": true + } + ] + }, + { + "brep_id": 6, + "3d_curve": { + "degree": 2, + "knot_vector": [ + -100, + -100, + -100, + 0, + 0, + 0 + ], + "active_range": [ + -100, + 0 + ], + "control_points": [ + [ + 27, + [ + 100, + 0, + 0, + 1 + ] + ], + [ + 28, + [ + 50, + 0, + 0, + 1 + ] + ], + [ + 29, + [ + 0, + 0, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 2, + "trim_index": 3, + "relative_direction": true + } + ] + } + ], + "vertices": [] + } + ] +} \ No newline at end of file diff --git a/iga/validation/buckling_analysis_single_patch_cantilever_beam/source/kratos_main_iga.py b/iga/validation/buckling_analysis_single_patch_cantilever_beam/source/kratos_main_iga.py new file mode 100644 index 00000000..ad02f37c --- /dev/null +++ b/iga/validation/buckling_analysis_single_patch_cantilever_beam/source/kratos_main_iga.py @@ -0,0 +1,11 @@ +import KratosMultiphysics +import KratosMultiphysics.IgaApplication +from KratosMultiphysics.StructuralMechanicsApplication.structural_mechanics_analysis import StructuralMechanicsAnalysis + +if __name__ == "__main__": + with open("ProjectParameters.json",'r') as parameter_file: + parameters = KratosMultiphysics.Parameters(parameter_file.read()) + + model = KratosMultiphysics.Model() + simulation = StructuralMechanicsAnalysis(model, parameters) + simulation.Run() diff --git a/iga/validation/buckling_analysis_single_patch_cantilever_beam/source/materials.json b/iga/validation/buckling_analysis_single_patch_cantilever_beam/source/materials.json new file mode 100644 index 00000000..2921201d --- /dev/null +++ b/iga/validation/buckling_analysis_single_patch_cantilever_beam/source/materials.json @@ -0,0 +1,21 @@ +{ + "properties": [ + { + "model_part_name": "IgaModelPart.StructuralAnalysis_1", + "properties_id": 1, + "Material": { + "name": "Steel", + "constitutive_law": { + "name": "LinearElasticPlaneStress2DLaw" + }, + "Variables": { + "THICKNESS": 1, + "YOUNG_MODULUS": 1e6, + "POISSON_RATIO": 0, + "DENSITY": 1 + }, + "Tables": {} + } + } + ] +} \ No newline at end of file diff --git a/iga/validation/buckling_analysis_single_patch_cantilever_beam/source/physics.iga.json b/iga/validation/buckling_analysis_single_patch_cantilever_beam/source/physics.iga.json new file mode 100644 index 00000000..29387ed4 --- /dev/null +++ b/iga/validation/buckling_analysis_single_patch_cantilever_beam/source/physics.iga.json @@ -0,0 +1,50 @@ +{ + "element_condition_list": [ + { + "brep_ids": [ + 2 + ], + "geometry_type": "GeometrySurface", + "iga_model_part": "StructuralAnalysis_1", + "parameters": { + "type": "element", + "name": "Shell3pElement", + "shape_function_derivatives_order": 3 + } + }, + { + "brep_id": 2, + "geometry_type": "GeometrySurfaceNodes", + "iga_model_part": "Support_2", + "parameters": { + "local_parameters": [ + -1, + 0 + ] + } + }, + { + "brep_id": 2, + "geometry_type": "GeometrySurfaceVariationNodes", + "iga_model_part": "Support_2_Rotational", + "parameters": { + "local_parameters": [ + -1, + 0 + ] + } + }, + { + "brep_ids": [ + 5 + ], + "geometry_type": "SurfaceEdge", + "iga_model_part": "Load_3", + "parameters": { + "type": "condition", + "name": "LoadCondition", + "shape_function_derivatives_order": 2 + } + } + ] +} \ No newline at end of file diff --git a/iga/validation/buckling_analysis_single_patch_cantilever_beam/source/refinements.iga.json b/iga/validation/buckling_analysis_single_patch_cantilever_beam/source/refinements.iga.json new file mode 100644 index 00000000..411ffe53 --- /dev/null +++ b/iga/validation/buckling_analysis_single_patch_cantilever_beam/source/refinements.iga.json @@ -0,0 +1,17 @@ +{ + "refinements": [ + { + "brep_ids": [ + 2 + ], + "geometry_type": "NurbsSurface", + "model_part_name": "IgaModelPart", + "parameters": { + "insert_nb_per_span_u": 4, + "insert_nb_per_span_v": 20, + "increase_degree_u": 2, + "increase_degree_v": 2 + } + } + ] +} \ No newline at end of file diff --git a/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/README.md b/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/README.md new file mode 100644 index 00000000..c6a1b78c --- /dev/null +++ b/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/README.md @@ -0,0 +1,38 @@ +# Geometric Linear Analysis - Single Patch - Scordelis-Lo Roof + +**Author:** Aakash Ravichandran + +**Kratos version:** 10.4 + +**Source files:** [Geometric Linear Analysis - Single Patch - Scordelis-Lo Roof](https://github.com/KratosMultiphysics/Examples/tree/master/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/source) + + +## Problem definition + +This example presents the validation of Scordelis-Lo Roof with Shell3pElement in geometric linear analysis [1]. + +
+Displacement + +*Structural System [1]* +
+ +Load = 90 per unit + +The roof is modeled using single NURBS patch with the Shell3pElement. The CAD model is constructed with single span b-splines of curve degree 2 in both axis of the roof. Additional refinement is applied in Kratos, by increasing the curve degree to 4 and inserting 6 knots in each direction of the roof. + + +## Results + +The displacement at mid of the free edge as -0.3068 units, which is in agreement with the reference value of -0.3024 units. + +
+Displacement + +*Displacement Result* +
+ + +## References + +1. Josef M. Kiendl, *Isogeometric Analysis and Shape Optimal Design of Shell Structures*, PhD Dissertation, pp. 51–52. [Link](https://mediatum.ub.tum.de/doc/1002634/464162.pdf) \ No newline at end of file diff --git a/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/data/Model.png b/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/data/Model.png new file mode 100644 index 00000000..241f82aa Binary files /dev/null and b/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/data/Model.png differ diff --git a/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/data/Reference_Model.png b/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/data/Reference_Model.png new file mode 100644 index 00000000..1a7ce338 Binary files /dev/null and b/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/data/Reference_Model.png differ diff --git a/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/source/ProjectParameters.json b/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/source/ProjectParameters.json new file mode 100644 index 00000000..67002d6a --- /dev/null +++ b/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/source/ProjectParameters.json @@ -0,0 +1,176 @@ +{ + "problem_data": { + "problem_name": "Scordelis_Lo_roof_single_patch_linear_analysis", + "echo_level": 0, + "parallel_type": "OpenMP", + "start_time": 0, + "end_time": 0.1 + }, + "solver_settings": { + "model_part_name": "IgaModelPart", + "domain_size": 1, + "echo_level": 1, + "buffer_size": 2, + "analysis_type": "linear", + "model_import_settings": { + "input_type": "use_input_model_part" + }, + "material_import_settings": { + "materials_filename": "materials.json" + }, + "time_stepping": { + "time_step": 1 + }, + "rotation_dofs": false, + "reform_dofs_at_each_step": false, + "line_search": false, + "compute_reactions": true, + "block_builder": true, + "clear_storage": false, + "move_mesh_flag": true, + "convergence_criterion": "residual_criterion", + "displacement_relative_tolerance": 0.0001, + "displacement_absolute_tolerance": 1E-09, + "residual_relative_tolerance": 0.0001, + "residual_absolute_tolerance": 1E-09, + "max_iteration": 1, + "solver_type": "static", + "linear_solver_settings": { + "solver_type": "LinearSolversApplication.sparse_lu", + "max_iteration": 500, + "tolerance": 1E-09, + "scaling": false, + "verbosity": 1 + }, + "auxiliary_variables_list": [], + "auxiliary_dofs_list": [], + "auxiliary_reaction_list": [] + }, + "modelers": [ + { + "modeler_name": "CadIoModeler", + "Parameters": { + "echo_level": 0, + "cad_model_part_name": "IgaModelPart", + "geometry_file_name": "geometry.cad.json", + "output_geometry_file_name": "Scordelis_Lo_roof_single_patch_linear_analysis_kratos_0.georhino.json" + } + }, + { + "modeler_name": "RefinementModeler", + "Parameters": { + "echo_level": 0, + "physics_file_name": "refinements.iga.json" + } + }, + { + "modeler_name": "IgaModeler", + "Parameters": { + "echo_level": 0, + "cad_model_part_name": "IgaModelPart", + "analysis_model_part_name": "IgaModelPart", + "physics_file_name": "physics.iga.json" + } + } + ], + "processes": { + "additional_processes": [ + { + "kratos_module": "IgaApplication", + "python_module": "output_quadrature_domain_process", + "Parameters": { + "output_file_name": "Scordelis_Lo_roof_single_patch_linear_analysis_kratos_shell_1_integrationdomain.json", + "model_part_name": "IgaModelPart.StructuralAnalysis_1", + "output_geometry_elements": true, + "output_geometry_conditions": false + } + }, + { + "kratos_module": "IgaApplication", + "python_module": "output_quadrature_domain_process", + "Parameters": { + "output_file_name": "Scordelis_Lo_roof_single_patch_linear_analysis_kratos_support_2_integrationdomain.json", + "model_part_name": "IgaModelPart.Support_2", + "output_geometry_elements": false, + "output_geometry_conditions": true + } + } + ], + "dirichlet_process_list": [ + { + "kratos_module": "KratosMultiphysics", + "python_module": "assign_vector_variable_process", + "Parameters": { + "model_part_name": "IgaModelPart.Support_2", + "variable_name": "DISPLACEMENT", + "value": [ + 0, + null, + 0 + ], + "interval": [ + 0, + "End" + ] + } + } + ], + "neumann_process_list": [ + { + "kratos_module": "KratosMultiphysics", + "python_module": "assign_vector_variable_to_conditions_process", + "Parameters": { + "model_part_name": "IgaModelPart.Load_3", + "variable_name": "DEAD_LOAD", + "value": [ + 0, + 0, + -90 + ], + "interval": [ + 0, + "End" + ] + } + } + ] + }, + "output_processes": { + "output_process_list": [ + { + "kratos_module": "IgaApplication", + "python_module": "iga_output_process", + "Parameters": { + "nodal_results": [ + "DISPLACEMENT" + ], + "integration_point_results": [ + "CAUCHY_STRESS", + "PK2_STRESS", + "INTERNAL_MOMENT" + ], + "output_file_name": "Scordelis_Lo_roof_single_patch_linear_analysis_kratos_shell_1.post.res", + "model_part_name": "IgaModelPart.StructuralAnalysis_1", + "file_label": "step", + "output_control_type": "time", + "output_frequency": 0.1 + } + }, + { + "kratos_module": "IgaApplication", + "python_module": "iga_output_process", + "Parameters": { + "nodal_results": [], + "integration_point_results": [ + "REACTION" + ], + "output_file_name": "Scordelis_Lo_roof_single_patch_linear_analysis_kratos_support_2.post.res", + "model_part_name": "IgaModelPart.Support_2", + "file_label": "step", + "output_control_type": "time", + "output_frequency": 0.1 + } + } + ] + } +} \ No newline at end of file diff --git a/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/source/geometry.cad.json b/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/source/geometry.cad.json new file mode 100644 index 00000000..5c064ad4 --- /dev/null +++ b/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/source/geometry.cad.json @@ -0,0 +1,507 @@ +{ + "tolerances": { + "model_tolerance": 0.001 + }, + "version_number": 1, + "breps": [ + { + "brep_id": 1, + "faces": [ + { + "brep_id": 2, + "swapped_surface_normal": false, + "surface": { + "is_trimmed": true, + "is_rational": true, + "degrees": [ + 2, + 2 + ], + "knot_vectors": [ + [ + 0, + 0, + 0, + 34.906585039886586, + 34.906585039886586, + 34.906585039886586 + ], + [ + 0, + 0, + 0, + 50, + 50, + 50 + ] + ], + "control_points": [ + [ + 1, + [ + 16.069690242163485, + 0, + 19.151111077974452, + 1 + ] + ], + [ + 2, + [ + 4.6377383332166693E-15, + 0, + 32.635182233306963, + 0.766044443118978 + ] + ], + [ + 3, + [ + -16.069690242163485, + 0, + 19.151111077974456, + 1 + ] + ], + [ + 4, + [ + 16.069690242163489, + 25, + 19.151111077974456, + 1 + ] + ], + [ + 5, + [ + 6.9566074998250028E-15, + 24.999999999999996, + 32.635182233306956, + 0.76604444311897812 + ] + ], + [ + 6, + [ + -16.069690242163478, + 25, + 19.151111077974456, + 1 + ] + ], + [ + 7, + [ + 16.069690242163489, + 50, + 19.151111077974452, + 1 + ] + ], + [ + 8, + [ + 9.2754766664333386E-15, + 50, + 32.635182233306963, + 0.766044443118978 + ] + ], + [ + 9, + [ + -16.069690242163482, + 50, + 19.151111077974456, + 1 + ] + ] + ] + }, + "boundary_loops": [ + { + "loop_type": "outer", + "trimming_curves": [ + { + "trim_index": 0, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 34.906585039886586, + 34.906585039886586 + ], + "active_range": [ + 0, + 34.906585039886586 + ], + "control_points": [ + [ + 10, + [ + 0, + 0, + 0, + 1 + ] + ], + [ + 11, + [ + 34.906585039886586, + 0, + 0, + 1 + ] + ] + ] + } + }, + { + "trim_index": 1, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 50, + 50 + ], + "active_range": [ + 0, + 50 + ], + "control_points": [ + [ + 12, + [ + 34.906585039886586, + 0, + 0, + 1 + ] + ], + [ + 13, + [ + 34.906585039886586, + 50, + 0, + 1 + ] + ] + ] + } + }, + { + "trim_index": 2, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 34.906585039886586, + 34.906585039886586 + ], + "active_range": [ + 0, + 34.906585039886586 + ], + "control_points": [ + [ + 14, + [ + 34.906585039886586, + 50, + 0, + 1 + ] + ], + [ + 15, + [ + 0, + 50, + 0, + 1 + ] + ] + ] + } + }, + { + "trim_index": 3, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 50, + 50 + ], + "active_range": [ + 0, + 50 + ], + "control_points": [ + [ + 16, + [ + 0, + 50, + 0, + 1 + ] + ], + [ + 17, + [ + 0, + 0, + 0, + 1 + ] + ] + ] + } + } + ] + } + ], + "embedded_loops": [], + "embedded_edges": [], + "embedded_points": [] + } + ], + "edges": [ + { + "brep_id": 3, + "3d_curve": { + "degree": 2, + "knot_vector": [ + 0, + 0, + 0, + 34.906585039886586, + 34.906585039886586, + 34.906585039886586 + ], + "active_range": [ + 0, + 34.906585039886586 + ], + "control_points": [ + [ + 18, + [ + 16.069690242163485, + 0, + 19.151111077974452, + 1 + ] + ], + [ + 19, + [ + 4.6377383332166693E-15, + 0, + 32.635182233306963, + 0.766044443118978 + ] + ], + [ + 20, + [ + -16.069690242163485, + 0, + 19.151111077974456, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 2, + "trim_index": 0, + "relative_direction": true + } + ] + }, + { + "brep_id": 4, + "3d_curve": { + "degree": 2, + "knot_vector": [ + 0, + 0, + 0, + 50, + 50, + 50 + ], + "active_range": [ + 0, + 50 + ], + "control_points": [ + [ + 21, + [ + -16.069690242163485, + 0, + 19.151111077974456, + 1 + ] + ], + [ + 22, + [ + -16.069690242163478, + 25, + 19.151111077974456, + 1 + ] + ], + [ + 23, + [ + -16.069690242163482, + 50, + 19.151111077974456, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 2, + "trim_index": 1, + "relative_direction": true + } + ] + }, + { + "brep_id": 5, + "3d_curve": { + "degree": 2, + "knot_vector": [ + -34.906585039886586, + -34.906585039886586, + -34.906585039886586, + 0, + 0, + 0 + ], + "active_range": [ + -34.906585039886586, + 0 + ], + "control_points": [ + [ + 24, + [ + -16.069690242163482, + 50, + 19.151111077974456, + 1 + ] + ], + [ + 25, + [ + 9.2754766664333386E-15, + 50, + 32.635182233306963, + 0.766044443118978 + ] + ], + [ + 26, + [ + 16.069690242163489, + 50, + 19.151111077974452, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 2, + "trim_index": 2, + "relative_direction": true + } + ] + }, + { + "brep_id": 6, + "3d_curve": { + "degree": 2, + "knot_vector": [ + -50, + -50, + -50, + 0, + 0, + 0 + ], + "active_range": [ + -50, + 0 + ], + "control_points": [ + [ + 27, + [ + 16.069690242163489, + 50, + 19.151111077974452, + 1 + ] + ], + [ + 28, + [ + 16.069690242163489, + 25, + 19.151111077974456, + 1 + ] + ], + [ + 29, + [ + 16.069690242163485, + 0, + 19.151111077974452, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 2, + "trim_index": 3, + "relative_direction": true + } + ] + } + ], + "vertices": [] + } + ] +} \ No newline at end of file diff --git a/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/source/kratos_main_iga.py b/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/source/kratos_main_iga.py new file mode 100644 index 00000000..ad02f37c --- /dev/null +++ b/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/source/kratos_main_iga.py @@ -0,0 +1,11 @@ +import KratosMultiphysics +import KratosMultiphysics.IgaApplication +from KratosMultiphysics.StructuralMechanicsApplication.structural_mechanics_analysis import StructuralMechanicsAnalysis + +if __name__ == "__main__": + with open("ProjectParameters.json",'r') as parameter_file: + parameters = KratosMultiphysics.Parameters(parameter_file.read()) + + model = KratosMultiphysics.Model() + simulation = StructuralMechanicsAnalysis(model, parameters) + simulation.Run() diff --git a/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/source/materials.json b/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/source/materials.json new file mode 100644 index 00000000..16044f3c --- /dev/null +++ b/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/source/materials.json @@ -0,0 +1,21 @@ +{ + "properties": [ + { + "model_part_name": "IgaModelPart.StructuralAnalysis_1", + "properties_id": 1, + "Material": { + "name": "Steel", + "constitutive_law": { + "name": "LinearElasticPlaneStress2DLaw" + }, + "Variables": { + "THICKNESS": 0.25, + "YOUNG_MODULUS": 4.32e8, + "POISSON_RATIO": 0, + "DENSITY": 1 + }, + "Tables": {} + } + } + ] +} \ No newline at end of file diff --git a/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/source/physics.iga.json b/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/source/physics.iga.json new file mode 100644 index 00000000..df33dd7d --- /dev/null +++ b/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/source/physics.iga.json @@ -0,0 +1,50 @@ +{ + "element_condition_list": [ + { + "brep_ids": [ + 2 + ], + "geometry_type": "GeometrySurface", + "iga_model_part": "StructuralAnalysis_1", + "parameters": { + "type": "element", + "name": "Shell3pElement", + "shape_function_derivatives_order": 3 + } + }, + { + "brep_id": 2, + "geometry_type": "GeometrySurfaceNodes", + "iga_model_part": "Support_2", + "parameters": { + "local_parameters": [ + -1, + 0 + ] + } + }, + { + "brep_id": 2, + "geometry_type": "GeometrySurfaceNodes", + "iga_model_part": "Support_2", + "parameters": { + "local_parameters": [ + -1, + 1 + ] + } + }, + { + "brep_ids": [ + 2 + ], + "geometry_type": "GeometrySurface", + "iga_model_part": "Load_3", + "parameters": { + "type": "condition", + "name": "LoadCondition", + "shape_function_derivatives_order": 2 + } + } + ] +} \ No newline at end of file diff --git a/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/source/refinements.iga.json b/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/source/refinements.iga.json new file mode 100644 index 00000000..1e34aadf --- /dev/null +++ b/iga/validation/geometric_linear_analysis_single_patch_scordelis_lo_roof/source/refinements.iga.json @@ -0,0 +1,17 @@ +{ + "refinements": [ + { + "brep_ids": [ + 2 + ], + "geometry_type": "NurbsSurface", + "model_part_name": "IgaModelPart", + "parameters": { + "insert_nb_per_span_u": 5, + "insert_nb_per_span_v": 5, + "increase_degree_u": 2, + "increase_degree_v": 2 + } + } + ] +} \ No newline at end of file diff --git a/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/README.md b/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/README.md new file mode 100644 index 00000000..9e00a587 --- /dev/null +++ b/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/README.md @@ -0,0 +1,36 @@ +# Geometric Linear Analysis - Trimmed Patch - Plate with Hole + +**Author:** Aakash Ravichandran + +**Kratos version:** 10.4 + +**Source files:** [Geometric Linear Analysis - Trimmed Patch - Plate with Hole](https://github.com/KratosMultiphysics/Examples/tree/master/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/source) + + +## Problem definition + +This example presents the validation of geometric linear analysis for a square plate with a circular hole subjected to bending. + +
+Displacement + +*Structural System [1]* +
+ +The plate is modeled using single trimmed NURBS patch with the Shell3pElement. The CAD model is constructed with single span b-splines of curve degree 2 in both axis of the plate. Additional refinement is applied in Kratos, by increasing the curve degree to 4 and inserting 15 knots in each direction of the plate. + + +## Results + +The displacement at point A is obtained as -6.3511 units, which is in agreement with the reference value of -6.3499 units. + +
+Displacement + +*Displacement Result* +
+ + +## References + +1. Michael Breitenberger, *CAD-Integrated Design and Analysis of Shell Structures*, PhD Dissertation, pp. 122–125. [Link](https://mediatum.ub.tum.de/doc/1311417/93268.pdf) \ No newline at end of file diff --git a/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/data/Model.png b/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/data/Model.png new file mode 100644 index 00000000..8e9272f3 Binary files /dev/null and b/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/data/Model.png differ diff --git a/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/data/Reference_Model.png b/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/data/Reference_Model.png new file mode 100644 index 00000000..de9b22cf Binary files /dev/null and b/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/data/Reference_Model.png differ diff --git a/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/source/ProjectParameters.json b/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/source/ProjectParameters.json new file mode 100644 index 00000000..c59b9f7d --- /dev/null +++ b/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/source/ProjectParameters.json @@ -0,0 +1,193 @@ +{ + "problem_data": { + "problem_name": "Plate_with_hole_trimmed_patch_linear", + "echo_level": 0, + "parallel_type": "OpenMP", + "start_time": 0, + "end_time": 0.1 + }, + "solver_settings": { + "model_part_name": "IgaModelPart", + "domain_size": 1, + "echo_level": 1, + "buffer_size": 2, + "analysis_type": "linear", + "model_import_settings": { + "input_type": "use_input_model_part" + }, + "material_import_settings": { + "materials_filename": "materials.json" + }, + "time_stepping": { + "time_step": 1 + }, + "rotation_dofs": false, + "reform_dofs_at_each_step": false, + "line_search": false, + "compute_reactions": true, + "block_builder": true, + "clear_storage": false, + "move_mesh_flag": true, + "convergence_criterion": "residual_criterion", + "displacement_relative_tolerance": 0.0001, + "displacement_absolute_tolerance": 1E-09, + "residual_relative_tolerance": 0.0001, + "residual_absolute_tolerance": 1E-09, + "max_iteration": 1, + "solver_type": "static", + "linear_solver_settings": { + "solver_type": "LinearSolversApplication.sparse_lu", + "max_iteration": 500, + "tolerance": 1E-09, + "scaling": false, + "verbosity": 1 + }, + "auxiliary_variables_list": [], + "auxiliary_dofs_list": [], + "auxiliary_reaction_list": [] + }, + "modelers": [ + { + "modeler_name": "CadIoModeler", + "Parameters": { + "echo_level": 0, + "cad_model_part_name": "IgaModelPart", + "geometry_file_name": "geometry.cad.json", + "output_geometry_file_name": "Plate_with_hole_trimmed_patch_linear_kratos_0.georhino.json" + } + }, + { + "modeler_name": "RefinementModeler", + "Parameters": { + "echo_level": 0, + "physics_file_name": "refinements.iga.json" + } + }, + { + "modeler_name": "IgaModeler", + "Parameters": { + "echo_level": 0, + "cad_model_part_name": "IgaModelPart", + "analysis_model_part_name": "IgaModelPart", + "physics_file_name": "physics.iga.json" + } + } + ], + "processes": { + "additional_processes": [ + { + "kratos_module": "IgaApplication", + "python_module": "output_quadrature_domain_process", + "Parameters": { + "output_file_name": "Plate_with_hole_trimmed_patch_linear_kratos_shell_1_integrationdomain.json", + "model_part_name": "IgaModelPart.StructuralAnalysis_1", + "output_geometry_elements": true, + "output_geometry_conditions": false + } + }, + { + "kratos_module": "IgaApplication", + "python_module": "output_quadrature_domain_process", + "Parameters": { + "output_file_name": "Plate_with_hole_trimmed_patch_linear_kratos_support_2_integrationdomain.json", + "model_part_name": "IgaModelPart.Support_2", + "output_geometry_elements": false, + "output_geometry_conditions": true + } + } + ], + "dirichlet_process_list": [ + { + "kratos_module": "KratosMultiphysics", + "python_module": "assign_vector_variable_process", + "Parameters": { + "model_part_name": "IgaModelPart.Support_2", + "variable_name": "DISPLACEMENT", + "value": [ + 0, + 0, + 0 + ], + "interval": [ + 0, + "End" + ] + } + }, + { + "kratos_module": "KratosMultiphysics", + "python_module": "assign_vector_variable_process", + "Parameters": { + "model_part_name": "IgaModelPart.Support_2_Rotational", + "variable_name": "DISPLACEMENT", + "value": [ + 0, + 0, + 0 + ], + "interval": [ + 0, + "End" + ] + } + } + ], + "neumann_process_list": [ + { + "kratos_module": "KratosMultiphysics", + "python_module": "assign_vector_variable_to_conditions_process", + "Parameters": { + "model_part_name": "IgaModelPart.Load_3", + "variable_name": "DEAD_LOAD", + "value": [ + 0, + 0, + -10 + ], + "interval": [ + 0, + "End" + ] + } + } + ] + }, + "output_processes": { + "output_process_list": [ + { + "kratos_module": "IgaApplication", + "python_module": "iga_output_process", + "Parameters": { + "nodal_results": [ + "DISPLACEMENT" + ], + "integration_point_results": [ + "CAUCHY_STRESS", + "PK2_STRESS", + "INTERNAL_MOMENT" + ], + "output_file_name": "Plate_with_hole_trimmed_patch_linear_kratos_shell_1.post.res", + "model_part_name": "IgaModelPart.StructuralAnalysis_1", + "file_label": "step", + "output_control_type": "time", + "output_frequency": 0.1 + } + }, + { + "kratos_module": "IgaApplication", + "python_module": "iga_output_process", + "Parameters": { + "nodal_results": [], + "integration_point_results": [ + "REACTION" + ], + "output_file_name": "Plate_with_hole_trimmed_patch_linear_kratos_support_2.post.res", + "model_part_name": "IgaModelPart.Support_2", + "file_label": "step", + "output_control_type": "time", + "output_frequency": 0.1 + } + } + ] + } +} \ No newline at end of file diff --git a/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/source/geometry.cad.json b/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/source/geometry.cad.json new file mode 100644 index 00000000..013f8013 --- /dev/null +++ b/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/source/geometry.cad.json @@ -0,0 +1,1013 @@ +{ + "tolerances": { + "model_tolerance": 0.001 + }, + "version_number": 1, + "breps": [ + { + "brep_id": 1, + "faces": [ + { + "brep_id": 2, + "swapped_surface_normal": false, + "surface": { + "is_trimmed": true, + "is_rational": false, + "degrees": [ + 2, + 2 + ], + "knot_vectors": [ + [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + [ + 0, + 0, + 0, + 10, + 10, + 10 + ] + ], + "control_points": [ + [ + 1, + [ + 0, + 0, + 0, + 1 + ] + ], + [ + 2, + [ + 5, + 0, + 0, + 1 + ] + ], + [ + 3, + [ + 10, + 0, + 0, + 1 + ] + ], + [ + 4, + [ + 0, + 5, + 0, + 1 + ] + ], + [ + 5, + [ + 5, + 5, + 0, + 1 + ] + ], + [ + 6, + [ + 10, + 5, + 0, + 1 + ] + ], + [ + 7, + [ + 0, + 10, + 0, + 1 + ] + ], + [ + 8, + [ + 5, + 10, + 0, + 1 + ] + ], + [ + 9, + [ + 10, + 10, + 0, + 1 + ] + ] + ] + }, + "boundary_loops": [ + { + "loop_type": "outer", + "trimming_curves": [ + { + "trim_index": 0, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 10, + 10 + ], + "active_range": [ + 0, + 10 + ], + "control_points": [ + [ + 10, + [ + 0, + 0, + 0, + 1 + ] + ], + [ + 11, + [ + 10, + 0, + 0, + 1 + ] + ] + ] + } + }, + { + "trim_index": 1, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 10, + 10 + ], + "active_range": [ + 0, + 10 + ], + "control_points": [ + [ + 12, + [ + 10, + 0, + 0, + 1 + ] + ], + [ + 13, + [ + 10, + 10, + 0, + 1 + ] + ] + ] + } + }, + { + "trim_index": 2, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 10, + 10 + ], + "active_range": [ + 0, + 10 + ], + "control_points": [ + [ + 14, + [ + 10, + 10, + 0, + 1 + ] + ], + [ + 15, + [ + 0, + 10, + 0, + 1 + ] + ] + ] + } + }, + { + "trim_index": 3, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 10, + 10 + ], + "active_range": [ + 0, + 10 + ], + "control_points": [ + [ + 16, + [ + 0, + 10, + 0, + 1 + ] + ], + [ + 17, + [ + 0, + 0, + 0, + 1 + ] + ] + ] + } + } + ] + }, + { + "loop_type": "inner", + "trimming_curves": [ + { + "trim_index": 4, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 3, + "knot_vector": [ + -18.849555921538759, + -18.849555921538759, + -18.849555921538759, + -18.849555921538759, + -16.493361431346411, + -16.493361431346411, + -16.493361431346411, + -14.137166941154067, + -14.137166941154067, + -14.137166941154067, + -11.780972450961722, + -11.780972450961722, + -11.780972450961722, + -9.42477796076938, + -9.42477796076938, + -9.42477796076938, + -7.0685834705770336, + -7.0685834705770336, + -7.0685834705770336, + -4.7123889803846906, + -4.7123889803846906, + -4.7123889803846906, + -2.3561944901923453, + -2.3561944901923453, + -2.3561944901923453, + 0, + 0, + 0, + 0 + ], + "active_range": [ + -18.849555921538759, + 0 + ], + "control_points": [ + [ + 18, + [ + 8, + 5, + 0, + 1 + ] + ], + [ + 19, + [ + 8, + 4.20435053048137, + 0, + 1 + ] + ], + [ + 20, + [ + 7.6839294789037442, + 3.4412887917844608, + 0, + 1 + ] + ], + [ + 21, + [ + 7.1213203435596428, + 2.8786796564403581, + 0, + 1 + ] + ], + [ + 22, + [ + 6.55871120821554, + 2.3160705210962544, + 0, + 1 + ] + ], + [ + 23, + [ + 5.7956494695186365, + 2, + 0, + 1 + ] + ], + [ + 24, + [ + 5, + 2, + 0, + 1 + ] + ], + [ + 25, + [ + 4.204350530481368, + 2, + 0, + 1 + ] + ], + [ + 26, + [ + 3.44128879178446, + 2.3160705210962531, + 0, + 1 + ] + ], + [ + 27, + [ + 2.8786796564403563, + 2.8786796564403572, + 0, + 1 + ] + ], + [ + 28, + [ + 2.3160705210962544, + 3.4412887917844595, + 0, + 1 + ] + ], + [ + 29, + [ + 2, + 4.2043505304813706, + 0, + 1 + ] + ], + [ + 30, + [ + 2, + 5, + 0, + 1 + ] + ], + [ + 31, + [ + 2, + 5.795649469518632, + 0, + 1 + ] + ], + [ + 32, + [ + 2.316070521096254, + 6.55871120821554, + 0, + 1 + ] + ], + [ + 33, + [ + 2.8786796564403581, + 7.1213203435596428, + 0, + 1 + ] + ], + [ + 34, + [ + 3.4412887917844626, + 7.6839294789037469, + 0, + 1 + ] + ], + [ + 35, + [ + 4.2043505304813671, + 8, + 0, + 1 + ] + ], + [ + 36, + [ + 5, + 8, + 0, + 1 + ] + ], + [ + 37, + [ + 5.795649469518624, + 8, + 0, + 1 + ] + ], + [ + 38, + [ + 6.5587112082155441, + 7.6839294789037424, + 0, + 1 + ] + ], + [ + 39, + [ + 7.1213203435596428, + 7.1213203435596428, + 0, + 1 + ] + ], + [ + 40, + [ + 7.683929478903746, + 6.5587112082155405, + 0, + 1 + ] + ], + [ + 41, + [ + 8, + 5.7956494695186294, + 0, + 1 + ] + ], + [ + 42, + [ + 8, + 5, + 0, + 1 + ] + ] + ] + } + } + ] + } + ], + "embedded_loops": [], + "embedded_edges": [], + "embedded_points": [] + } + ], + "edges": [ + { + "brep_id": 3, + "3d_curve": { + "degree": 2, + "knot_vector": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "active_range": [ + 0, + 10 + ], + "control_points": [ + [ + 43, + [ + 0, + 0, + 0, + 1 + ] + ], + [ + 44, + [ + 5, + 0, + 0, + 1 + ] + ], + [ + 45, + [ + 10, + 0, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 2, + "trim_index": 0, + "relative_direction": true + } + ] + }, + { + "brep_id": 4, + "3d_curve": { + "degree": 2, + "knot_vector": [ + 0, + 0, + 0, + 10, + 10, + 10 + ], + "active_range": [ + 0, + 10 + ], + "control_points": [ + [ + 46, + [ + 10, + 0, + 0, + 1 + ] + ], + [ + 47, + [ + 10, + 5, + 0, + 1 + ] + ], + [ + 48, + [ + 10, + 10, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 2, + "trim_index": 1, + "relative_direction": true + } + ] + }, + { + "brep_id": 5, + "3d_curve": { + "degree": 2, + "knot_vector": [ + -10, + -10, + -10, + 0, + 0, + 0 + ], + "active_range": [ + -10, + 0 + ], + "control_points": [ + [ + 49, + [ + 10, + 10, + 0, + 1 + ] + ], + [ + 50, + [ + 5, + 10, + 0, + 1 + ] + ], + [ + 51, + [ + 0, + 10, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 2, + "trim_index": 2, + "relative_direction": true + } + ] + }, + { + "brep_id": 6, + "3d_curve": { + "degree": 2, + "knot_vector": [ + -10, + -10, + -10, + 0, + 0, + 0 + ], + "active_range": [ + -10, + 0 + ], + "control_points": [ + [ + 52, + [ + 0, + 10, + 0, + 1 + ] + ], + [ + 53, + [ + 0, + 5, + 0, + 1 + ] + ], + [ + 54, + [ + 0, + 0, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 2, + "trim_index": 3, + "relative_direction": true + } + ] + }, + { + "brep_id": 7, + "3d_curve": { + "degree": 2, + "knot_vector": [ + -18.849555921538759, + -18.849555921538759, + -18.849555921538759, + -14.137166941154069, + -14.137166941154069, + -9.42477796076938, + -9.42477796076938, + -4.71238898038469, + -4.71238898038469, + 0, + 0, + 0 + ], + "active_range": [ + -18.849555921538759, + 0 + ], + "control_points": [ + [ + 55, + [ + 8, + 4.9999999999999991, + 0, + 1 + ] + ], + [ + 56, + [ + 7.9999999999999982, + 1.9999999999999996, + 0, + 0.70710678118654757 + ] + ], + [ + 57, + [ + 4.9999999999999991, + 2, + 0, + 1 + ] + ], + [ + 58, + [ + 1.9999999999999996, + 2, + 0, + 0.70710678118654757 + ] + ], + [ + 59, + [ + 2, + 5, + 0, + 1 + ] + ], + [ + 60, + [ + 2, + 8, + 0, + 0.70710678118654757 + ] + ], + [ + 61, + [ + 5, + 8, + 0, + 1 + ] + ], + [ + 62, + [ + 8, + 8, + 0, + 0.70710678118654757 + ] + ], + [ + 63, + [ + 8, + 4.9999999999999991, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 2, + "trim_index": 4, + "relative_direction": true + } + ] + } + ], + "vertices": [] + }, + { + "brep_id": 9, + "faces": [], + "edges": [ + { + "brep_id": 8, + "3d_curve": { + "degree": 2, + "knot_vector": [ + 0, + 0, + 0, + 4.71238898038469, + 4.71238898038469, + 9.42477796076938, + 9.42477796076938, + 14.137166941154069, + 14.137166941154069, + 18.849555921538759, + 18.849555921538759, + 18.849555921538759 + ], + "active_range": [ + 0, + 18.849555921538759 + ], + "control_points": [ + [ + 64, + [ + 8, + 5, + 0, + 1 + ] + ], + [ + 65, + [ + 8, + 8, + 0, + 0.70710678118654757 + ] + ], + [ + 66, + [ + 5, + 8, + 0, + 1 + ] + ], + [ + 67, + [ + 2, + 8, + 0, + 0.70710678118654757 + ] + ], + [ + 68, + [ + 2, + 5, + 0, + 1 + ] + ], + [ + 69, + [ + 1.9999999999999996, + 2, + 0, + 0.70710678118654757 + ] + ], + [ + 70, + [ + 4.9999999999999991, + 2, + 0, + 1 + ] + ], + [ + 71, + [ + 7.9999999999999982, + 1.9999999999999996, + 0, + 0.70710678118654757 + ] + ], + [ + 72, + [ + 8, + 5, + 0, + 1 + ] + ] + ] + }, + "topology": [], + "embedded_points": [], + "embedded_edges": [] + } + ], + "vertices": [] + } + ] +} \ No newline at end of file diff --git a/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/source/kratos_main_iga.py b/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/source/kratos_main_iga.py new file mode 100644 index 00000000..ad02f37c --- /dev/null +++ b/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/source/kratos_main_iga.py @@ -0,0 +1,11 @@ +import KratosMultiphysics +import KratosMultiphysics.IgaApplication +from KratosMultiphysics.StructuralMechanicsApplication.structural_mechanics_analysis import StructuralMechanicsAnalysis + +if __name__ == "__main__": + with open("ProjectParameters.json",'r') as parameter_file: + parameters = KratosMultiphysics.Parameters(parameter_file.read()) + + model = KratosMultiphysics.Model() + simulation = StructuralMechanicsAnalysis(model, parameters) + simulation.Run() diff --git a/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/source/materials.json b/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/source/materials.json new file mode 100644 index 00000000..319af392 --- /dev/null +++ b/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/source/materials.json @@ -0,0 +1,21 @@ +{ + "properties": [ + { + "model_part_name": "IgaModelPart.StructuralAnalysis_1", + "properties_id": 1, + "Material": { + "name": "Steel", + "constitutive_law": { + "name": "LinearElasticPlaneStress2DLaw" + }, + "Variables": { + "THICKNESS": 0.1, + "YOUNG_MODULUS": 10e6, + "POISSON_RATIO": 0, + "DENSITY": 0 + }, + "Tables": {} + } + } + ] +} \ No newline at end of file diff --git a/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/source/physics.iga.json b/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/source/physics.iga.json new file mode 100644 index 00000000..0eca05fb --- /dev/null +++ b/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/source/physics.iga.json @@ -0,0 +1,50 @@ +{ + "element_condition_list": [ + { + "brep_ids": [ + 2 + ], + "geometry_type": "GeometrySurface", + "iga_model_part": "StructuralAnalysis_1", + "parameters": { + "type": "element", + "name": "Shell3pElement", + "shape_function_derivatives_order": 3 + } + }, + { + "brep_id": 2, + "geometry_type": "GeometrySurfaceNodes", + "iga_model_part": "Support_2", + "parameters": { + "local_parameters": [ + 0, + -1 + ] + } + }, + { + "brep_id": 2, + "geometry_type": "GeometrySurfaceVariationNodes", + "iga_model_part": "Support_2_Rotational", + "parameters": { + "local_parameters": [ + 0, + -1 + ] + } + }, + { + "brep_ids": [ + 4 + ], + "geometry_type": "SurfaceEdge", + "iga_model_part": "Load_3", + "parameters": { + "type": "condition", + "name": "LoadCondition", + "shape_function_derivatives_order": 2 + } + } + ] +} \ No newline at end of file diff --git a/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/source/refinements.iga.json b/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/source/refinements.iga.json new file mode 100644 index 00000000..395afc34 --- /dev/null +++ b/iga/validation/geometric_linear_analysis_trimmed_patch_plate_with_hole/source/refinements.iga.json @@ -0,0 +1,17 @@ +{ + "refinements": [ + { + "brep_ids": [ + 2 + ], + "geometry_type": "NurbsSurface", + "model_part_name": "IgaModelPart", + "parameters": { + "insert_nb_per_span_u": 15, + "insert_nb_per_span_v": 15, + "increase_degree_u": 2, + "increase_degree_v": 2 + } + } + ] +} \ No newline at end of file diff --git a/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/README.md b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/README.md new file mode 100644 index 00000000..d3d193c0 --- /dev/null +++ b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/README.md @@ -0,0 +1,45 @@ +# Geometric Non-Linear Analysis - Multi Patch - Cantilever Beam + +**Author:** Aakash Ravichandran + +**Kratos version:** 10.4 + +**Source files:** [Geometric Non-Linear Analysis - Multi Patch - Cantilever Beam](https://github.com/KratosMultiphysics/Examples/tree/master/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/source) + +## Problem definition + +This example presents the validation of geometric non-linear analysis of a cantilever beam subjected to a end shear force [1]. + +
+Displacement + +*Structural System [1]* +
+ + +The cantilever beam is modeled using two connected NURBS patches with the Shell3pElement. The CAD model of both the patches is constructed with single span B-spline surfaces. The first patch has an curve degree of 2 in both axes and the second patch has an curve degree of 3 in the longitudinal direction and 2 in the transverse direction. Additional refinement is applied in Kratos by increasing the curve degree by 1 in both directions for both patches. Furthermore, h-refinement is applied by inserting 4 knots longitudinally and 3 knots transversely in the first patch, alongside 12 knots longitudinally and 4 knots transversely in the second patch. Hence on the edge where two surfaces gets connected, in the first patch number of elements is 4 and in 2nd patch the number of elements is 5. Therefore they are nonconforming patches. + +## Results + +The load-displacement curve obtained at the free end is shown in [figure](data/LoadStep_vs_Displacement_XZ.png). This shows a good agreement with the reference [1] - Figure 2a and Table 2. + +
+Displacement + +*Displacement Result* +
+ + +
+ +| Reference Force vs Displacement [1] | Force vs Displacement - From Kratos | +| :---: | :---: | +| | | + +
+ + + +## References + +1. Sze, K. Y., Liu, X. H., & Lo, S. H. (2004). Popular benchmark problems for geometric nonlinear analysis of shells. *Finite Elements in Analysis and Design*, 40(11), 1551–1569. https://doi.org/10.1016/j.finel.2003.11.001 \ No newline at end of file diff --git a/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/data/LoadStep_vs_Displacement_XZ.png b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/data/LoadStep_vs_Displacement_XZ.png new file mode 100644 index 00000000..6f1d41b8 Binary files /dev/null and b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/data/LoadStep_vs_Displacement_XZ.png differ diff --git a/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/data/Model.png b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/data/Model.png new file mode 100644 index 00000000..d7976f05 Binary files /dev/null and b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/data/Model.png differ diff --git a/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/data/Reference_LoadStep_vs_Displacement_XZ.png b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/data/Reference_LoadStep_vs_Displacement_XZ.png new file mode 100644 index 00000000..a0800bd3 Binary files /dev/null and b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/data/Reference_LoadStep_vs_Displacement_XZ.png differ diff --git a/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/data/Reference_Model.png b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/data/Reference_Model.png new file mode 100644 index 00000000..ace07021 Binary files /dev/null and b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/data/Reference_Model.png differ diff --git a/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/source/ProjectParameters.json b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/source/ProjectParameters.json new file mode 100644 index 00000000..cb26fcc7 --- /dev/null +++ b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/source/ProjectParameters.json @@ -0,0 +1,251 @@ +{ + "problem_data": { + "problem_name": "Cantilever_beam_geometric_nonlinear_analysis", + "echo_level": 0, + "parallel_type": "OpenMP", + "start_time": 0, + "end_time": 1 + }, + "solver_settings": { + "model_part_name": "IgaModelPart", + "domain_size": 1, + "echo_level": 1, + "buffer_size": 2, + "analysis_type": "non_linear", + "model_import_settings": { + "input_type": "use_input_model_part" + }, + "material_import_settings": { + "materials_filename": "materials.json" + }, + "time_stepping": { + "time_step": 0.1 + }, + "rotation_dofs": false, + "reform_dofs_at_each_step": false, + "line_search": false, + "compute_reactions": true, + "block_builder": true, + "clear_storage": false, + "move_mesh_flag": true, + "convergence_criterion": "residual_criterion", + "displacement_relative_tolerance": 0.0001, + "displacement_absolute_tolerance": 0.0001, + "residual_relative_tolerance": 0.0001, + "residual_absolute_tolerance": 0.0001, + "max_iteration": 100, + "solver_type": "static", + "linear_solver_settings": { + "solver_type": "LinearSolversApplication.sparse_lu", + "max_iteration": 500, + "tolerance": 1E-09, + "scaling": false, + "verbosity": 1 + }, + "auxiliary_variables_list": [], + "auxiliary_dofs_list": [], + "auxiliary_reaction_list": [] + }, + "modelers": [ + { + "modeler_name": "CadIoModeler", + "Parameters": { + "echo_level": 0, + "cad_model_part_name": "IgaModelPart", + "geometry_file_name": "geometry.cad.json", + "output_geometry_file_name": "Cantilever_beam_geometric_nonlinear_analysis_kratos_0.georhino.json" + } + }, + { + "modeler_name": "RefinementModeler", + "Parameters": { + "echo_level": 0, + "physics_file_name": "refinements.iga.json" + } + }, + { + "modeler_name": "IgaModeler", + "Parameters": { + "echo_level": 0, + "cad_model_part_name": "IgaModelPart", + "analysis_model_part_name": "IgaModelPart", + "physics_file_name": "physics.iga.json" + } + } + ], + "processes": { + "additional_processes": [ + { + "kratos_module": "IgaApplication", + "python_module": "output_quadrature_domain_process", + "Parameters": { + "output_file_name": "Cantilever_beam_geometric_nonlinear_analysis_kratos_shell_1_integrationdomain.json", + "model_part_name": "IgaModelPart.StructuralAnalysis_1", + "output_geometry_elements": true, + "output_geometry_conditions": false + } + }, + { + "kratos_module": "IgaApplication", + "python_module": "output_quadrature_domain_process", + "Parameters": { + "output_file_name": "Cantilever_beam_geometric_nonlinear_analysis_kratos_support_2_integrationdomain.json", + "model_part_name": "IgaModelPart.Support_2", + "output_geometry_elements": false, + "output_geometry_conditions": true + } + }, + { + "kratos_module": "IgaApplication", + "python_module": "output_quadrature_domain_process", + "Parameters": { + "output_file_name": "Cantilever_beam_geometric_nonlinear_analysis_kratos_coupling_4_integrationdomain.json", + "model_part_name": "IgaModelPart.Coupling_4", + "output_geometry_elements": false, + "output_geometry_conditions": false, + "output_coupling_geometry_conditions": true + } + } + ], + "dirichlet_process_list": [ + { + "kratos_module": "KratosMultiphysics", + "python_module": "assign_vector_variable_process", + "Parameters": { + "model_part_name": "IgaModelPart.Support_2", + "variable_name": "DISPLACEMENT", + "value": [ + 0, + 0, + 0 + ], + "interval": [ + 0, + "End" + ] + } + }, + { + "kratos_module": "KratosMultiphysics", + "python_module": "assign_vector_variable_process", + "Parameters": { + "model_part_name": "IgaModelPart.Support_2_Rotational", + "variable_name": "DISPLACEMENT", + "value": [ + 0, + 0, + 0 + ], + "interval": [ + 0, + "End" + ] + } + }, + { + "kratos_module": "IgaApplication", + "python_module": "assign_vector_variable_and_constraints_to_conditions_process", + "Parameters": { + "model_part_name": "IgaModelPart.Coupling_4", + "variable_name": "DISPLACEMENT", + "value": [ + 0, + 0, + 0 + ], + "interval": [ + 0, + "End" + ] + } + }, + { + "kratos_module": "IgaApplication", + "python_module": "assign_vector_variable_and_constraints_to_conditions_process", + "Parameters": { + "model_part_name": "IgaModelPart.Coupling_4", + "variable_name": "ROTATION", + "value": [ + 0, + 0, + 0 + ], + "interval": [ + 0, + "End" + ] + } + } + ], + "neumann_process_list": [ + { + "kratos_module": "KratosMultiphysics", + "python_module": "assign_vector_variable_to_conditions_process", + "Parameters": { + "model_part_name": "IgaModelPart.Load_3", + "variable_name": "DEAD_LOAD", + "value": [ + 0, + 0, + "(-4*t)*1.0" + ], + "interval": [ + 0, + "End" + ] + } + } + ] + }, + "output_processes": { + "output_process_list": [ + { + "kratos_module": "IgaApplication", + "python_module": "iga_output_process", + "Parameters": { + "nodal_results": [ + "DISPLACEMENT" + ], + "integration_point_results": [ + "CAUCHY_STRESS", + "PK2_STRESS", + "INTERNAL_MOMENT" + ], + "output_file_name": "Cantilever_beam_geometric_nonlinear_analysis_kratos_shell_1.post.res", + "model_part_name": "IgaModelPart.StructuralAnalysis_1", + "file_label": "step", + "output_control_type": "time", + "output_frequency": 0.1 + } + }, + { + "kratos_module": "IgaApplication", + "python_module": "iga_output_process", + "Parameters": { + "nodal_results": [], + "integration_point_results": [ + "REACTION" + ], + "output_file_name": "Cantilever_beam_geometric_nonlinear_analysis_kratos_support_2.post.res", + "model_part_name": "IgaModelPart.Support_2", + "file_label": "step", + "output_control_type": "time", + "output_frequency": 0.1 + } + }, + { + "kratos_module": "IgaApplication", + "python_module": "iga_output_process", + "Parameters": { + "nodal_results": [], + "integration_point_results": [], + "output_file_name": "Cantilever_beam_geometric_nonlinear_analysis_kratos_coupling_4.post.res", + "model_part_name": "IgaModelPart.Coupling_4", + "file_label": "step", + "output_control_type": "time", + "output_frequency": 0.1 + } + } + ] + } +} \ No newline at end of file diff --git a/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/source/geometry.cad.json b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/source/geometry.cad.json new file mode 100644 index 00000000..540f5118 --- /dev/null +++ b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/source/geometry.cad.json @@ -0,0 +1,1190 @@ +{ + "tolerances": { + "model_tolerance": 0.001 + }, + "version_number": 1, + "breps": [ + { + "brep_id": 1, + "faces": [ + { + "brep_id": 3, + "swapped_surface_normal": false, + "surface": { + "is_trimmed": true, + "is_rational": false, + "degrees": [ + 2, + 2 + ], + "knot_vectors": [ + [ + 0, + 0, + 0, + 2, + 2, + 2 + ], + [ + 0, + 0, + 0, + 1, + 1, + 1 + ] + ], + "control_points": [ + [ + 3, + [ + 0, + 0, + 0, + 1 + ] + ], + [ + 4, + [ + 1, + 0, + 0, + 1 + ] + ], + [ + 5, + [ + 2, + 0, + 0, + 1 + ] + ], + [ + 6, + [ + 0, + 0.5, + 0, + 1 + ] + ], + [ + 7, + [ + 1, + 0.5, + 0, + 1 + ] + ], + [ + 8, + [ + 2, + 0.5, + 0, + 1 + ] + ], + [ + 9, + [ + 0, + 1, + 0, + 1 + ] + ], + [ + 10, + [ + 1, + 1, + 0, + 1 + ] + ], + [ + 11, + [ + 2, + 1, + 0, + 1 + ] + ] + ] + }, + "boundary_loops": [ + { + "loop_type": "outer", + "trimming_curves": [ + { + "trim_index": 0, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 2, + 2 + ], + "active_range": [ + 0, + 2 + ], + "control_points": [ + [ + 12, + [ + 0, + 0, + 0, + 1 + ] + ], + [ + 13, + [ + 2, + 0, + 0, + 1 + ] + ] + ] + } + }, + { + "trim_index": 1, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 1, + 1 + ], + "active_range": [ + 0, + 1 + ], + "control_points": [ + [ + 14, + [ + 2, + 0, + 0, + 1 + ] + ], + [ + 15, + [ + 2, + 1, + 0, + 1 + ] + ] + ] + } + }, + { + "trim_index": 2, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 2, + 2 + ], + "active_range": [ + 0, + 2 + ], + "control_points": [ + [ + 16, + [ + 2, + 1, + 0, + 1 + ] + ], + [ + 17, + [ + 0, + 1, + 0, + 1 + ] + ] + ] + } + }, + { + "trim_index": 3, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 1, + 1 + ], + "active_range": [ + 0, + 1 + ], + "control_points": [ + [ + 18, + [ + 0, + 1, + 0, + 1 + ] + ], + [ + 19, + [ + 0, + 0, + 0, + 1 + ] + ] + ] + } + } + ] + } + ], + "embedded_loops": [], + "embedded_edges": [ + { + "trim_index": 6, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 1, + 1 + ], + "active_range": [ + 0, + 1 + ], + "control_points": [ + [ + 1, + [ + 2, + 0, + 0, + 1 + ] + ], + [ + 2, + [ + 2, + 1, + 0, + 1 + ] + ] + ] + } + } + ], + "embedded_points": [] + } + ], + "edges": [ + { + "brep_id": 5, + "3d_curve": { + "degree": 2, + "knot_vector": [ + 0, + 0, + 0, + 2, + 2, + 2 + ], + "active_range": [ + 0, + 2 + ], + "control_points": [ + [ + 20, + [ + 0, + 0, + 0, + 1 + ] + ], + [ + 21, + [ + 1, + 0, + 0, + 1 + ] + ], + [ + 22, + [ + 2, + 0, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 3, + "trim_index": 0, + "relative_direction": true + } + ] + }, + { + "brep_id": 6, + "3d_curve": { + "degree": 2, + "knot_vector": [ + 0, + 0, + 0, + 1, + 1, + 1 + ], + "active_range": [ + 0, + 1 + ], + "control_points": [ + [ + 23, + [ + 2, + 0, + 0, + 1 + ] + ], + [ + 24, + [ + 2, + 0.5, + 0, + 1 + ] + ], + [ + 25, + [ + 2, + 1, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 3, + "trim_index": 1, + "relative_direction": true + } + ] + }, + { + "brep_id": 7, + "3d_curve": { + "degree": 2, + "knot_vector": [ + -2, + -2, + -2, + 0, + 0, + 0 + ], + "active_range": [ + -2, + 0 + ], + "control_points": [ + [ + 26, + [ + 2, + 1, + 0, + 1 + ] + ], + [ + 27, + [ + 1, + 1, + 0, + 1 + ] + ], + [ + 28, + [ + 0, + 1, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 3, + "trim_index": 2, + "relative_direction": true + } + ] + }, + { + "brep_id": 8, + "3d_curve": { + "degree": 2, + "knot_vector": [ + -1, + -1, + -1, + 0, + 0, + 0 + ], + "active_range": [ + -1, + 0 + ], + "control_points": [ + [ + 29, + [ + 0, + 1, + 0, + 1 + ] + ], + [ + 30, + [ + 0, + 0.5, + 0, + 1 + ] + ], + [ + 31, + [ + 0, + 0, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 3, + "trim_index": 3, + "relative_direction": true + } + ] + } + ], + "vertices": [] + }, + { + "brep_id": 2, + "faces": [ + { + "brep_id": 4, + "swapped_surface_normal": false, + "surface": { + "is_trimmed": true, + "is_rational": false, + "degrees": [ + 3, + 2 + ], + "knot_vectors": [ + [ + 0, + 0, + 0, + 0, + 8, + 8, + 8, + 8 + ], + [ + 0, + 0, + 0, + 1, + 1, + 1 + ] + ], + "control_points": [ + [ + 34, + [ + 2, + 0, + 0, + 1 + ] + ], + [ + 35, + [ + 4.6666666666666661, + 0, + 0, + 1 + ] + ], + [ + 36, + [ + 7.33333333333333, + 0, + 0, + 1 + ] + ], + [ + 37, + [ + 10, + 0, + 0, + 1 + ] + ], + [ + 38, + [ + 2, + 0.5, + 0, + 1 + ] + ], + [ + 39, + [ + 4.6666666666666661, + 0.49999999999999983, + 0, + 1 + ] + ], + [ + 40, + [ + 7.3333333333333313, + 0.5, + 0, + 1 + ] + ], + [ + 41, + [ + 10, + 0.5, + 0, + 1 + ] + ], + [ + 42, + [ + 2, + 1, + 0, + 1 + ] + ], + [ + 43, + [ + 4.6666666666666661, + 0.99999999999999967, + 0, + 1 + ] + ], + [ + 44, + [ + 7.33333333333333, + 1, + 0, + 1 + ] + ], + [ + 45, + [ + 10, + 1, + 0, + 1 + ] + ] + ] + }, + "boundary_loops": [ + { + "loop_type": "outer", + "trimming_curves": [ + { + "trim_index": 0, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 8, + 8 + ], + "active_range": [ + 0, + 8 + ], + "control_points": [ + [ + 46, + [ + 0, + 0, + 0, + 1 + ] + ], + [ + 47, + [ + 8, + 0, + 0, + 1 + ] + ] + ] + } + }, + { + "trim_index": 1, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 1, + 1 + ], + "active_range": [ + 0, + 1 + ], + "control_points": [ + [ + 48, + [ + 8, + 0, + 0, + 1 + ] + ], + [ + 49, + [ + 8, + 1, + 0, + 1 + ] + ] + ] + } + }, + { + "trim_index": 2, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 8, + 8 + ], + "active_range": [ + 0, + 8 + ], + "control_points": [ + [ + 50, + [ + 8, + 1, + 0, + 1 + ] + ], + [ + 51, + [ + 0, + 1, + 0, + 1 + ] + ] + ] + } + }, + { + "trim_index": 3, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 1, + 1 + ], + "active_range": [ + 0, + 1 + ], + "control_points": [ + [ + 52, + [ + 0, + 1, + 0, + 1 + ] + ], + [ + 53, + [ + 0, + 0, + 0, + 1 + ] + ] + ] + } + } + ] + } + ], + "embedded_loops": [], + "embedded_edges": [ + { + "trim_index": 6, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 1, + 1 + ], + "active_range": [ + 0, + 1 + ], + "control_points": [ + [ + 32, + [ + 0, + 0, + 0, + 1 + ] + ], + [ + 33, + [ + 0, + 1, + 0, + 1 + ] + ] + ] + } + } + ], + "embedded_points": [] + } + ], + "edges": [ + { + "brep_id": 9, + "3d_curve": { + "degree": 3, + "knot_vector": [ + 0, + 0, + 0, + 0, + 8, + 8, + 8, + 8 + ], + "active_range": [ + 0, + 8 + ], + "control_points": [ + [ + 54, + [ + 2, + 0, + 0, + 1 + ] + ], + [ + 55, + [ + 4.6666666666666661, + 0, + 0, + 1 + ] + ], + [ + 56, + [ + 7.33333333333333, + 0, + 0, + 1 + ] + ], + [ + 57, + [ + 10, + 0, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 4, + "trim_index": 0, + "relative_direction": true + } + ] + }, + { + "brep_id": 10, + "3d_curve": { + "degree": 2, + "knot_vector": [ + 0, + 0, + 0, + 1, + 1, + 1 + ], + "active_range": [ + 0, + 1 + ], + "control_points": [ + [ + 58, + [ + 10, + 0, + 0, + 1 + ] + ], + [ + 59, + [ + 10, + 0.5, + 0, + 1 + ] + ], + [ + 60, + [ + 10, + 1, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 4, + "trim_index": 1, + "relative_direction": true + } + ] + }, + { + "brep_id": 11, + "3d_curve": { + "degree": 3, + "knot_vector": [ + -8, + -8, + -8, + -8, + 0, + 0, + 0, + 0 + ], + "active_range": [ + -8, + 0 + ], + "control_points": [ + [ + 61, + [ + 10, + 1, + 0, + 1 + ] + ], + [ + 62, + [ + 7.33333333333333, + 1, + 0, + 1 + ] + ], + [ + 63, + [ + 4.6666666666666661, + 0.99999999999999967, + 0, + 1 + ] + ], + [ + 64, + [ + 2, + 1, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 4, + "trim_index": 2, + "relative_direction": true + } + ] + }, + { + "brep_id": 12, + "3d_curve": { + "degree": 2, + "knot_vector": [ + -1, + -1, + -1, + 0, + 0, + 0 + ], + "active_range": [ + -1, + 0 + ], + "control_points": [ + [ + 65, + [ + 2, + 1, + 0, + 1 + ] + ], + [ + 66, + [ + 2, + 0.5, + 0, + 1 + ] + ], + [ + 67, + [ + 2, + 0, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 4, + "trim_index": 3, + "relative_direction": true + } + ] + } + ], + "vertices": [] + }, + { + "brep_id": 14, + "faces": [], + "edges": [ + { + "brep_id": 13, + "3d_curve": { + "degree": 1, + "knot_vector": [ + 0, + 0, + 1, + 1 + ], + "active_range": [ + 0, + 1 + ], + "control_points": [ + [ + 69, + [ + 2, + 0, + 0, + 1 + ] + ], + [ + 70, + [ + 2, + 1, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 3, + "trim_index": 6, + "relative_direction": true + }, + { + "brep_id": 4, + "trim_index": 6, + "relative_direction": true + } + ] + } + ], + "vertices": [] + } + ] +} \ No newline at end of file diff --git a/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/source/kratos_main_iga.py b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/source/kratos_main_iga.py new file mode 100644 index 00000000..ad02f37c --- /dev/null +++ b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/source/kratos_main_iga.py @@ -0,0 +1,11 @@ +import KratosMultiphysics +import KratosMultiphysics.IgaApplication +from KratosMultiphysics.StructuralMechanicsApplication.structural_mechanics_analysis import StructuralMechanicsAnalysis + +if __name__ == "__main__": + with open("ProjectParameters.json",'r') as parameter_file: + parameters = KratosMultiphysics.Parameters(parameter_file.read()) + + model = KratosMultiphysics.Model() + simulation = StructuralMechanicsAnalysis(model, parameters) + simulation.Run() diff --git a/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/source/materials.json b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/source/materials.json new file mode 100644 index 00000000..10ba8bef --- /dev/null +++ b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/source/materials.json @@ -0,0 +1,31 @@ +{ + "properties": [ + { + "model_part_name": "IgaModelPart.StructuralAnalysis_1", + "properties_id": 1, + "Material": { + "name": "Steel", + "constitutive_law": { + "name": "LinearElasticPlaneStress2DLaw" + }, + "Variables": { + "THICKNESS": 0.1, + "YOUNG_MODULUS": 1.2e6, + "POISSON_RATIO": 0, + "DENSITY": 1 + }, + "Tables": {} + } + }, + { + "model_part_name": "IgaModelPart.Coupling_4", + "properties_id": 4, + "Material": { + "Variables": { + "PENALTY_FACTOR": 10000000000.001 + }, + "Tables": {} + } + } + ] +} \ No newline at end of file diff --git a/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/source/physics.iga.json b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/source/physics.iga.json new file mode 100644 index 00000000..0fe14761 --- /dev/null +++ b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/source/physics.iga.json @@ -0,0 +1,64 @@ +{ + "element_condition_list": [ + { + "brep_ids": [ + 3, + 4 + ], + "geometry_type": "GeometrySurface", + "iga_model_part": "StructuralAnalysis_1", + "parameters": { + "type": "element", + "name": "Shell3pElement", + "shape_function_derivatives_order": 3 + } + }, + { + "brep_id": 3, + "geometry_type": "GeometrySurfaceNodes", + "iga_model_part": "Support_2", + "parameters": { + "local_parameters": [ + 0, + -1 + ] + } + }, + { + "brep_id": 3, + "geometry_type": "GeometrySurfaceVariationNodes", + "iga_model_part": "Support_2_Rotational", + "parameters": { + "local_parameters": [ + 0, + -1 + ] + } + }, + { + "brep_ids": [ + 10 + ], + "geometry_type": "SurfaceEdge", + "iga_model_part": "Load_3", + "parameters": { + "type": "condition", + "name": "LoadCondition", + "shape_function_derivatives_order": 2 + } + }, + { + "brep_ids": [ + 13 + ], + "geometry_type": "SurfaceEdgeSurfaceEdge", + "iga_model_part": "Coupling_4", + "parameters": { + "type": "condition", + "name": "CouplingPenaltyCondition", + "shape_function_derivatives_order": 2, + "variables": [] + } + } + ] +} \ No newline at end of file diff --git a/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/source/refinements.iga.json b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/source/refinements.iga.json new file mode 100644 index 00000000..576934a9 --- /dev/null +++ b/iga/validation/geometric_nonlinear_analysis_multi_patch_cantilever_beam/source/refinements.iga.json @@ -0,0 +1,30 @@ +{ + "refinements": [ + { + "brep_ids": [ + 3 + ], + "geometry_type": "NurbsSurface", + "model_part_name": "IgaModelPart", + "parameters": { + "insert_nb_per_span_u": 4, + "insert_nb_per_span_v": 3, + "increase_degree_u": 1, + "increase_degree_v": 1 + } + }, + { + "brep_ids": [ + 4 + ], + "geometry_type": "NurbsSurface", + "model_part_name": "IgaModelPart", + "parameters": { + "insert_nb_per_span_u": 12, + "insert_nb_per_span_v": 4, + "increase_degree_u": 1, + "increase_degree_v": 1 + } + } + ] +} \ No newline at end of file diff --git a/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/README.md b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/README.md new file mode 100644 index 00000000..cbba6538 --- /dev/null +++ b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/README.md @@ -0,0 +1,43 @@ +# Geometric Non-Linear Analysis - Single Patch - Cantilever Beam + +**Author:** Aakash Ravichandran + +**Kratos version:** 10.4 + +**Source files:** [Geometric Non-Linear Analysis - Single Patch - Cantilever Beam](https://github.com/KratosMultiphysics/Examples/tree/master/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/source) + +## Problem definition + +This example presents the validation of geometric non-linear analysis of a cantilever beam subjected to a end shear force [1]. + +
+Displacement + +*Structural System [1]* +
+ + +The cantilever beam is modeled using a single NURB patch with the Shell3pElement. The CAD model of the patch is constructed with single span B-spline surface. The patch has an curve degree of 3 in the longitudinal direction and 2 in the transverse direction. Additional refinement is applied in Kratos by increasing the curve degree by 1 in both directions for both patches. Furthermore, h-refinement is applied by inserting 10 knots longitudinally and 3 knots transversely in the patch. + +## Results + +The load-displacement curve obtained at the free end is shown in [figure](data/LoadStep_vs_Displacement_XZ.png). This shows a good agreement with the reference [1] - Figure 2a and Table 2. + +
+Displacement + +*Displacement Result* +
+ +
+ +| Reference Force vs Displacement [1] | Force vs Displacement - From Kratos | +| :---: | :---: | +| | | + +
+ + +## References + +1. Sze, K. Y., Liu, X. H., & Lo, S. H. (2004). Popular benchmark problems for geometric nonlinear analysis of shells. *Finite Elements in Analysis and Design*, 40(11), 1551–1569. https://doi.org/10.1016/j.finel.2003.11.001 \ No newline at end of file diff --git a/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/data/LoadStep_vs_Displacement_XZ.png b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/data/LoadStep_vs_Displacement_XZ.png new file mode 100644 index 00000000..d0718005 Binary files /dev/null and b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/data/LoadStep_vs_Displacement_XZ.png differ diff --git a/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/data/Model.png b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/data/Model.png new file mode 100644 index 00000000..5d01d7ea Binary files /dev/null and b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/data/Model.png differ diff --git a/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/data/Reference_LoadStep_vs_Displacement_XZ.png b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/data/Reference_LoadStep_vs_Displacement_XZ.png new file mode 100644 index 00000000..a0800bd3 Binary files /dev/null and b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/data/Reference_LoadStep_vs_Displacement_XZ.png differ diff --git a/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/data/Reference_Model.png b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/data/Reference_Model.png new file mode 100644 index 00000000..ace07021 Binary files /dev/null and b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/data/Reference_Model.png differ diff --git a/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/source/ProjectParameters.json b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/source/ProjectParameters.json new file mode 100644 index 00000000..d35dd4e5 --- /dev/null +++ b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/source/ProjectParameters.json @@ -0,0 +1,193 @@ +{ + "problem_data": { + "problem_name": "Cantilever_beam_geometric_nonlinear_analysis_kratos", + "echo_level": 0, + "parallel_type": "OpenMP", + "start_time": 0, + "end_time": 0.95 + }, + "solver_settings": { + "model_part_name": "IgaModelPart", + "domain_size": 1, + "echo_level": 1, + "buffer_size": 2, + "analysis_type": "non_linear", + "model_import_settings": { + "input_type": "use_input_model_part" + }, + "material_import_settings": { + "materials_filename": "materials.json" + }, + "time_stepping": { + "time_step": 0.1 + }, + "rotation_dofs": false, + "reform_dofs_at_each_step": false, + "line_search": false, + "compute_reactions": true, + "block_builder": true, + "clear_storage": false, + "move_mesh_flag": true, + "convergence_criterion": "residual_criterion", + "displacement_relative_tolerance": 0.0001, + "displacement_absolute_tolerance": 0.0001, + "residual_relative_tolerance": 0.0001, + "residual_absolute_tolerance": 0.0001, + "max_iteration": 100, + "solver_type": "static", + "linear_solver_settings": { + "solver_type": "LinearSolversApplication.sparse_lu", + "max_iteration": 500, + "tolerance": 1E-09, + "scaling": false, + "verbosity": 1 + }, + "auxiliary_variables_list": [], + "auxiliary_dofs_list": [], + "auxiliary_reaction_list": [] + }, + "modelers": [ + { + "modeler_name": "CadIoModeler", + "Parameters": { + "echo_level": 0, + "cad_model_part_name": "IgaModelPart", + "geometry_file_name": "geometry.cad.json", + "output_geometry_file_name": "Cantilever_beam_geometric_nonlinear_analysis_kratos_0.georhino.json" + } + }, + { + "modeler_name": "RefinementModeler", + "Parameters": { + "echo_level": 0, + "physics_file_name": "refinements.iga.json" + } + }, + { + "modeler_name": "IgaModeler", + "Parameters": { + "echo_level": 0, + "cad_model_part_name": "IgaModelPart", + "analysis_model_part_name": "IgaModelPart", + "physics_file_name": "physics.iga.json" + } + } + ], + "processes": { + "additional_processes": [ + { + "kratos_module": "IgaApplication", + "python_module": "output_quadrature_domain_process", + "Parameters": { + "output_file_name": "Cantilever_beam_geometric_nonlinear_analysis_kratos_shell_1_integrationdomain.json", + "model_part_name": "IgaModelPart.StructuralAnalysis_1", + "output_geometry_elements": true, + "output_geometry_conditions": false + } + }, + { + "kratos_module": "IgaApplication", + "python_module": "output_quadrature_domain_process", + "Parameters": { + "output_file_name": "Cantilever_beam_geometric_nonlinear_analysis_kratos_support_2_integrationdomain.json", + "model_part_name": "IgaModelPart.Support_2", + "output_geometry_elements": false, + "output_geometry_conditions": true + } + } + ], + "dirichlet_process_list": [ + { + "kratos_module": "KratosMultiphysics", + "python_module": "assign_vector_variable_process", + "Parameters": { + "model_part_name": "IgaModelPart.Support_2", + "variable_name": "DISPLACEMENT", + "value": [ + 0, + 0, + 0 + ], + "interval": [ + 0, + "End" + ] + } + }, + { + "kratos_module": "KratosMultiphysics", + "python_module": "assign_vector_variable_process", + "Parameters": { + "model_part_name": "IgaModelPart.Support_2_Rotational", + "variable_name": "DISPLACEMENT", + "value": [ + 0, + 0, + 0 + ], + "interval": [ + 0, + "End" + ] + } + } + ], + "neumann_process_list": [ + { + "kratos_module": "KratosMultiphysics", + "python_module": "assign_vector_variable_to_conditions_process", + "Parameters": { + "model_part_name": "IgaModelPart.Load_3", + "variable_name": "DEAD_LOAD", + "value": [ + 0, + 0, + "(-4*t)*1.0" + ], + "interval": [ + 0, + "End" + ] + } + } + ] + }, + "output_processes": { + "output_process_list": [ + { + "kratos_module": "IgaApplication", + "python_module": "iga_output_process", + "Parameters": { + "nodal_results": [ + "DISPLACEMENT" + ], + "integration_point_results": [ + "CAUCHY_STRESS", + "PK2_STRESS", + "INTERNAL_MOMENT" + ], + "output_file_name": "Cantilever_beam_geometric_nonlinear_analysis_kratos_shell_1.post.res", + "model_part_name": "IgaModelPart.StructuralAnalysis_1", + "file_label": "step", + "output_control_type": "time", + "output_frequency": 0.1 + } + }, + { + "kratos_module": "IgaApplication", + "python_module": "iga_output_process", + "Parameters": { + "nodal_results": [], + "integration_point_results": [ + "REACTION" + ], + "output_file_name": "Cantilever_beam_geometric_nonlinear_analysis_kratos_support_2.post.res", + "model_part_name": "IgaModelPart.Support_2", + "file_label": "step", + "output_control_type": "time", + "output_frequency": 0.1 + } + } + ] + } +} \ No newline at end of file diff --git a/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/source/geometry.cad.json b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/source/geometry.cad.json new file mode 100644 index 00000000..e08c0896 --- /dev/null +++ b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/source/geometry.cad.json @@ -0,0 +1,558 @@ +{ + "tolerances": { + "model_tolerance": 0.001 + }, + "version_number": 1, + "breps": [ + { + "brep_id": 1, + "faces": [ + { + "brep_id": 2, + "swapped_surface_normal": false, + "surface": { + "is_trimmed": true, + "is_rational": false, + "degrees": [ + 3, + 2 + ], + "knot_vectors": [ + [ + 0, + 0, + 0, + 0, + 10, + 10, + 10, + 10 + ], + [ + 0, + 0, + 0, + 1, + 1, + 1 + ] + ], + "control_points": [ + [ + 1, + [ + 0, + 0, + 0, + 1 + ] + ], + [ + 2, + [ + 3.3333333333333339, + 0, + 0, + 1 + ] + ], + [ + 3, + [ + 6.6666666666666661, + 0, + 0, + 1 + ] + ], + [ + 4, + [ + 10, + 0, + 0, + 1 + ] + ], + [ + 5, + [ + 0, + 0.5, + 0, + 1 + ] + ], + [ + 6, + [ + 3.3333333333333339, + 0.50000000000000011, + 0, + 1 + ] + ], + [ + 7, + [ + 6.666666666666667, + 0.49999999999999994, + 0, + 1 + ] + ], + [ + 8, + [ + 10, + 0.5, + 0, + 1 + ] + ], + [ + 9, + [ + 0, + 1, + 0, + 1 + ] + ], + [ + 10, + [ + 3.3333333333333339, + 1.0000000000000002, + 0, + 1 + ] + ], + [ + 11, + [ + 6.6666666666666661, + 0.99999999999999989, + 0, + 1 + ] + ], + [ + 12, + [ + 10, + 1, + 0, + 1 + ] + ] + ] + }, + "boundary_loops": [ + { + "loop_type": "outer", + "trimming_curves": [ + { + "trim_index": 0, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 10, + 10 + ], + "active_range": [ + 0, + 10 + ], + "control_points": [ + [ + 13, + [ + 0, + 0, + 0, + 1 + ] + ], + [ + 14, + [ + 10, + 0, + 0, + 1 + ] + ] + ] + } + }, + { + "trim_index": 1, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 1, + 1 + ], + "active_range": [ + 0, + 1 + ], + "control_points": [ + [ + 15, + [ + 10, + 0, + 0, + 1 + ] + ], + [ + 16, + [ + 10, + 1, + 0, + 1 + ] + ] + ] + } + }, + { + "trim_index": 2, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 10, + 10 + ], + "active_range": [ + 0, + 10 + ], + "control_points": [ + [ + 17, + [ + 10, + 1, + 0, + 1 + ] + ], + [ + 18, + [ + 0, + 1, + 0, + 1 + ] + ] + ] + } + }, + { + "trim_index": 3, + "curve_direction": true, + "parameter_curve": { + "is_rational": false, + "degree": 1, + "knot_vector": [ + 0, + 0, + 1, + 1 + ], + "active_range": [ + 0, + 1 + ], + "control_points": [ + [ + 19, + [ + 0, + 1, + 0, + 1 + ] + ], + [ + 20, + [ + 0, + 0, + 0, + 1 + ] + ] + ] + } + } + ] + } + ], + "embedded_loops": [], + "embedded_edges": [], + "embedded_points": [] + } + ], + "edges": [ + { + "brep_id": 3, + "3d_curve": { + "degree": 3, + "knot_vector": [ + 0, + 0, + 0, + 0, + 10, + 10, + 10, + 10 + ], + "active_range": [ + 0, + 10 + ], + "control_points": [ + [ + 21, + [ + 0, + 0, + 0, + 1 + ] + ], + [ + 22, + [ + 3.3333333333333339, + 0, + 0, + 1 + ] + ], + [ + 23, + [ + 6.6666666666666661, + 0, + 0, + 1 + ] + ], + [ + 24, + [ + 10, + 0, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 2, + "trim_index": 0, + "relative_direction": true + } + ] + }, + { + "brep_id": 4, + "3d_curve": { + "degree": 2, + "knot_vector": [ + 0, + 0, + 0, + 1, + 1, + 1 + ], + "active_range": [ + 0, + 1 + ], + "control_points": [ + [ + 25, + [ + 10, + 0, + 0, + 1 + ] + ], + [ + 26, + [ + 10, + 0.5, + 0, + 1 + ] + ], + [ + 27, + [ + 10, + 1, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 2, + "trim_index": 1, + "relative_direction": true + } + ] + }, + { + "brep_id": 5, + "3d_curve": { + "degree": 3, + "knot_vector": [ + -10, + -10, + -10, + -10, + 0, + 0, + 0, + 0 + ], + "active_range": [ + -10, + 0 + ], + "control_points": [ + [ + 28, + [ + 10, + 1, + 0, + 1 + ] + ], + [ + 29, + [ + 6.6666666666666661, + 0.99999999999999989, + 0, + 1 + ] + ], + [ + 30, + [ + 3.3333333333333339, + 1.0000000000000002, + 0, + 1 + ] + ], + [ + 31, + [ + 0, + 1, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 2, + "trim_index": 2, + "relative_direction": true + } + ] + }, + { + "brep_id": 6, + "3d_curve": { + "degree": 2, + "knot_vector": [ + -1, + -1, + -1, + 0, + 0, + 0 + ], + "active_range": [ + -1, + 0 + ], + "control_points": [ + [ + 32, + [ + 0, + 1, + 0, + 1 + ] + ], + [ + 33, + [ + 0, + 0.5, + 0, + 1 + ] + ], + [ + 34, + [ + 0, + 0, + 0, + 1 + ] + ] + ] + }, + "topology": [ + { + "brep_id": 2, + "trim_index": 3, + "relative_direction": true + } + ] + } + ], + "vertices": [] + } + ] +} \ No newline at end of file diff --git a/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/source/kratos_main_iga.py b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/source/kratos_main_iga.py new file mode 100644 index 00000000..ad02f37c --- /dev/null +++ b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/source/kratos_main_iga.py @@ -0,0 +1,11 @@ +import KratosMultiphysics +import KratosMultiphysics.IgaApplication +from KratosMultiphysics.StructuralMechanicsApplication.structural_mechanics_analysis import StructuralMechanicsAnalysis + +if __name__ == "__main__": + with open("ProjectParameters.json",'r') as parameter_file: + parameters = KratosMultiphysics.Parameters(parameter_file.read()) + + model = KratosMultiphysics.Model() + simulation = StructuralMechanicsAnalysis(model, parameters) + simulation.Run() diff --git a/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/source/materials.json b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/source/materials.json new file mode 100644 index 00000000..f209ffaf --- /dev/null +++ b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/source/materials.json @@ -0,0 +1,21 @@ +{ + "properties": [ + { + "model_part_name": "IgaModelPart.StructuralAnalysis_1", + "properties_id": 1, + "Material": { + "name": "Steel", + "constitutive_law": { + "name": "LinearElasticPlaneStress2DLaw" + }, + "Variables": { + "THICKNESS": 0.1, + "YOUNG_MODULUS": 1.2e6, + "POISSON_RATIO": 0, + "DENSITY": 1 + }, + "Tables": {} + } + } + ] +} \ No newline at end of file diff --git a/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/source/physics.iga.json b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/source/physics.iga.json new file mode 100644 index 00000000..379ae664 --- /dev/null +++ b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/source/physics.iga.json @@ -0,0 +1 @@ +{"element_condition_list":[{"brep_ids":[2],"geometry_type":"GeometrySurface","iga_model_part":"StructuralAnalysis_1","parameters":{"type":"element","name":"Shell3pElement","shape_function_derivatives_order":3}},{"brep_id":2,"geometry_type":"GeometrySurfaceNodes","iga_model_part":"Support_2","parameters":{"local_parameters":[0,-1]}},{"brep_id":2,"geometry_type":"GeometrySurfaceVariationNodes","iga_model_part":"Support_2_Rotational","parameters":{"local_parameters":[0,-1]}},{"brep_ids":[4],"geometry_type":"SurfaceEdge","iga_model_part":"Load_3","parameters":{"type":"condition","name":"LoadCondition","shape_function_derivatives_order":2}}]} diff --git a/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/source/refinements.iga.json b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/source/refinements.iga.json new file mode 100644 index 00000000..98eb75fb --- /dev/null +++ b/iga/validation/geometric_nonlinear_analysis_single_patch_cantilever_beam/source/refinements.iga.json @@ -0,0 +1,17 @@ +{ + "refinements": [ + { + "brep_ids": [ + 2 + ], + "geometry_type": "NurbsSurface", + "model_part_name": "IgaModelPart", + "parameters": { + "insert_nb_per_span_u": 10, + "insert_nb_per_span_v": 3, + "increase_degree_u": 1, + "increase_degree_v": 1 + } + } + ] +} \ No newline at end of file