diff --git a/README.md b/README.md index af9ba356..e18a32e1 100644 --- a/README.md +++ b/README.md @@ -144,3 +144,4 @@ Unit tests should *not* be uploaded to this repository. Please put them in the ` - [Multi Constraint Optimization 3D Hook](shape_optimization/10_Multi_Constraint_Optimization_3D_Hook) - [Smooth Surface Wrapping - Stanford Bunny](shape_optimization/11_Shape_Update_Optimization_Stanford_Bunny) - [Strain Energy Minimization - 3D Shell](shape_optimization/02_Strain_Energy_Minimization_3D_Shell) +- [Bead Optimization Plate](shape_optimization/06_bead_optimization_plate) diff --git a/shape_optimization/06_bead_optimization_plate/README.md b/shape_optimization/06_bead_optimization_plate/README.md new file mode 100644 index 00000000..f3369548 --- /dev/null +++ b/shape_optimization/06_bead_optimization_plate/README.md @@ -0,0 +1,49 @@ +# Bead Optimization of a Plate + +A bead optimization problem to minimize the strain energy of a square plate - supported at the corners and subject to a single force in the center. + +> **Author**: Armin Geiser +> +> **Kratos version**: 9.0 + +## Optimization Problem + +### Objective +- Minimize strain energy + +

+ +

+ +## Optimization settings +- Algorithm type : `bead_optimization` +- Number of steps : `300` +- Step size : `0.25` +- Filter radius : `0.075` +- Mesh motion : `False` + +## Results + +### Shape Evolution +The below images shows the shape evolution of the bead pattern on a plate during the optimization iterations. + +

+ +

+ +### Comparison with manual solutions + +In the table below, a comparison with manual solutions shows that the bead pattern obtained from the optimized solutions perform better. The last row shows the value of the objective function (here strain energy) for each of the bead patterns. + +| Manual Solution 1 | Manual Solution 2 | Manual Solution 3 | Manual Solution 4 | Manual Solution 5 | Optimized Solution | +| :----------------------------------------: | :----------------------------------------: | :----------------------------------------: | :----------------------------------------: | :----------------------------------------: | :-----------------------------------: | +| | | | | | | +| | | | | | | +| 2.46e-3 | 1.56e-3 | 1.17e-3 | 1.06e-3 | 7.86e-4 | 4.23e-4 | + +### Convergence +The below plots shows the evolution of the objective function over the bead optimization iterations. + +

+ +

diff --git a/shape_optimization/06_bead_optimization_plate/analysis_parameters.json b/shape_optimization/06_bead_optimization_plate/analysis_parameters.json index b2e0a97e..4173d27b 100644 --- a/shape_optimization/06_bead_optimization_plate/analysis_parameters.json +++ b/shape_optimization/06_bead_optimization_plate/analysis_parameters.json @@ -1,108 +1,160 @@ { - "problem_data" : { - "problem_name" : "Plate", - "parallel_type" : "OpenMP", - "start_time" : 0.0, - "end_time" : 1.0, - "echo_level" : 0 - }, - "solver_settings" : { - "solver_type" : "static", - "echo_level" : 0, - "analysis_type" : "linear", - "model_part_name" : "plate", - "domain_size" : 3, - "time_stepping" : { - "time_step" : 1.0 - }, - "model_import_settings" : { - "input_type" : "use_input_model_part", - "input_filename" : "plate" - }, - "material_import_settings" :{ - "materials_filename": "2D_material.json" - }, - "line_search" : false, - "convergence_criterion" : "residual_criterion", - "displacement_relative_tolerance" : 0.0001, - "displacement_absolute_tolerance" : 1e-9, - "residual_relative_tolerance" : 0.0001, - "residual_absolute_tolerance" : 1e-9, - "max_iteration" : 10, - "linear_solver_settings" : { - "solver_type" : "ExternalSolversApplication.super_lu", - "scaling" : false, - "verbosity" : 0 - }, - "rotation_dofs" : true - }, - "processes": { - "constraints_process_list" : [{ - "python_module" : "assign_vector_variable_process", - "kratos_module" : "KratosMultiphysics", - "help" : "This process fixes the selected components of a given vector variable", - "process_name" : "AssignVectorVariableProcess", - "Parameters" : { - "mesh_id" : 0, - "model_part_name" : "plate.corner_points", - "variable_name" : "DISPLACEMENT", - "value" : [0.0,0.0,0.0] - } + "problem_data": { + "problem_name": "Plate", + "parallel_type": "OpenMP", + "start_time": 0.0, + "end_time": 1.0, + "echo_level": 0 }, - { - "python_module" : "assign_vector_variable_process", - "kratos_module" : "KratosMultiphysics", - "help" : "This process fixes the selected components of a given vector variable", - "process_name" : "AssignVectorVariableProcess", - "Parameters" : { - "mesh_id" : 0, - "model_part_name" : "plate.corner_points", - "variable_name" : "ROTATION", - "value" : [0.0,0.0,0.0] - } - }], - "loads_process_list" : [{ - "python_module" : "assign_vector_by_direction_process", - "kratos_module" : "KratosMultiphysics", - "process_name" : "AssignVectorByDirectionProcess", - "Parameters" : { - "mesh_id" : 0, - "model_part_name" : "plate.load_point", - "variable_name" : "POINT_LOAD", - "modulus" : 100.0, - "constrained" : false, - "direction" : [0.0,0.0,-1.0] - } - }] - }, - "output_processes" : { - "gid_output" : [{ - "python_module" : "gid_output_process", - "kratos_module" : "KratosMultiphysics", - "process_name" : "GiDOutputProcess", - "help" : "This process writes postprocessing files for GiD", - "Parameters" : { - "model_part_name" : "plate", - "output_name" : "plate", - "postprocess_parameters" : { - "result_file_configuration" : { - "gidpost_flags" : { - "GiDPostMode" : "GiD_PostBinary", - "WriteDeformedMeshFlag" : "WriteDeformed", - "WriteConditionsFlag" : "WriteConditions", - "MultiFileFlag" : "SingleFile" - }, - "file_label" : "step", - "output_control_type" : "step", - "output_frequency" : 1, - "body_output" : true, - "node_output" : false, - "skin_output" : false, - "nodal_results" : ["DISPLACEMENT","REACTION","POINT_LOAD","ROTATION"] - }, - "point_data_configuration" : [] + "solver_settings": { + "solver_type": "static", + "echo_level": 0, + "analysis_type": "linear", + "model_part_name": "plate", + "domain_size": 3, + "time_stepping": { + "time_step": 1.0 + }, + "model_import_settings": { + "input_type": "use_input_model_part", + "input_filename": "plate" + }, + "material_import_settings": { + "materials_filename": "2D_material.json" + }, + "line_search": false, + "convergence_criterion": "residual_criterion", + "displacement_relative_tolerance": 0.0001, + "displacement_absolute_tolerance": 1e-9, + "residual_relative_tolerance": 0.0001, + "residual_absolute_tolerance": 1e-9, + "max_iteration": 10, + "linear_solver_settings": { + "solver_type": "EigenSolversApplication.sparse_lu", + "scaling": false, + "verbosity": 0 + }, + "rotation_dofs": true + }, + "processes": { + "constraints_process_list": [ + { + "python_module": "assign_vector_variable_process", + "kratos_module": "KratosMultiphysics", + "help": "This process fixes the selected components of a given vector variable", + "process_name": "AssignVectorVariableProcess", + "Parameters": { + "mesh_id": 0, + "model_part_name": "plate.corner_points", + "variable_name": "DISPLACEMENT", + "value": [ + 0.0, + 0.0, + 0.0 + ] + } + }, + { + "python_module": "assign_vector_variable_process", + "kratos_module": "KratosMultiphysics", + "help": "This process fixes the selected components of a given vector variable", + "process_name": "AssignVectorVariableProcess", + "Parameters": { + "mesh_id": 0, + "model_part_name": "plate.corner_points", + "variable_name": "ROTATION", + "value": [ + 0.0, + 0.0, + 0.0 + ] + } + } + ], + "loads_process_list": [ + { + "python_module": "assign_vector_by_direction_process", + "kratos_module": "KratosMultiphysics", + "process_name": "AssignVectorByDirectionProcess", + "Parameters": { + "mesh_id": 0, + "model_part_name": "plate.load_point", + "variable_name": "POINT_LOAD", + "modulus": 100.0, + "constrained": false, + "direction": [ + 0.0, + 0.0, + -1.0 + ] + } + } + ] + }, + "output_processes": { + "gid_output": [ + { + "python_module": "gid_output_process", + "kratos_module": "KratosMultiphysics", + "process_name": "GiDOutputProcess", + "help": "This process writes postprocessing files for GiD", + "Parameters": { + "model_part_name": "plate", + "output_name": "plate", + "postprocess_parameters": { + "result_file_configuration": { + "gidpost_flags": { + "GiDPostMode": "GiD_PostBinary", + "WriteDeformedMeshFlag": "WriteDeformed", + "WriteConditionsFlag": "WriteConditions", + "MultiFileFlag": "SingleFile" + }, + "file_label": "step", + "output_control_type": "step", + "output_frequency": 1, + "body_output": true, + "node_output": false, + "skin_output": false, + "nodal_results": [ + "DISPLACEMENT", + "REACTION", + "POINT_LOAD", + "ROTATION" + ] + }, + "point_data_configuration": [] + } + } + } + ], + "vtk_output": [ + { + "python_module": "vtk_output_process", + "kratos_module": "KratosMultiphysics", + "process_name": "VTKOutputProcess", + "help": "This process writes postprocessing files for VTK", + "Parameters": { + "model_part_name": "plate", + "file_format": "binary", + "output_precision": 7, + "output_control_type": "step", + "output_interval": 1.0, + "output_sub_model_parts": false, + "folder_name": "analysis_Results", + "save_output_files_in_folder": true, + "nodal_solution_step_data_variables": [ + "DISPLACEMENT", + "REACTION", + "ROTATION", + "POINT_LOAD" + ], + "nodal_data_value_variables": [], + "element_data_value_variables": [], + "condition_data_value_variables": [], + "gauss_point_variables_extrapolated_to_nodes": [], + "gauss_point_variables_in_elements": [] + } } - } - }] - } -} + ] + } +} \ No newline at end of file diff --git a/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_1_2D.png b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_1_2D.png new file mode 100644 index 00000000..bd843414 Binary files /dev/null and b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_1_2D.png differ diff --git a/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_1_3D.png b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_1_3D.png new file mode 100644 index 00000000..fbed7f39 Binary files /dev/null and b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_1_3D.png differ diff --git a/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_2_2D.png b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_2_2D.png new file mode 100644 index 00000000..20ae9dd5 Binary files /dev/null and b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_2_2D.png differ diff --git a/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_2_3D.png b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_2_3D.png new file mode 100644 index 00000000..f987d0b4 Binary files /dev/null and b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_2_3D.png differ diff --git a/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_3_2D.png b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_3_2D.png new file mode 100644 index 00000000..41c1b7f0 Binary files /dev/null and b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_3_2D.png differ diff --git a/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_3_3D.png b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_3_3D.png new file mode 100644 index 00000000..805d1ad5 Binary files /dev/null and b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_3_3D.png differ diff --git a/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_4_2D.png b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_4_2D.png new file mode 100644 index 00000000..556580f6 Binary files /dev/null and b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_4_2D.png differ diff --git a/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_4_3D.png b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_4_3D.png new file mode 100644 index 00000000..0ff950df Binary files /dev/null and b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_4_3D.png differ diff --git a/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_5_2D.png b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_5_2D.png new file mode 100644 index 00000000..a3183aee Binary files /dev/null and b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_5_2D.png differ diff --git a/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_5_3D.png b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_5_3D.png new file mode 100644 index 00000000..ec8a318c Binary files /dev/null and b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Manual_5_3D.png differ diff --git a/shape_optimization/06_bead_optimization_plate/images/beadOpt_Opt_2D.png b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Opt_2D.png new file mode 100644 index 00000000..c5f2466d Binary files /dev/null and b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Opt_2D.png differ diff --git a/shape_optimization/06_bead_optimization_plate/images/beadOpt_Opt_3D.png b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Opt_3D.png new file mode 100644 index 00000000..38c07dd8 Binary files /dev/null and b/shape_optimization/06_bead_optimization_plate/images/beadOpt_Opt_3D.png differ diff --git a/shape_optimization/06_bead_optimization_plate/images/beadOpt_SetupwithBC.png b/shape_optimization/06_bead_optimization_plate/images/beadOpt_SetupwithBC.png new file mode 100644 index 00000000..56ca0eff Binary files /dev/null and b/shape_optimization/06_bead_optimization_plate/images/beadOpt_SetupwithBC.png differ diff --git a/shape_optimization/06_bead_optimization_plate/images/beadOpt_plot.svg b/shape_optimization/06_bead_optimization_plate/images/beadOpt_plot.svg new file mode 100644 index 00000000..a8fdec2b --- /dev/null +++ b/shape_optimization/06_bead_optimization_plate/images/beadOpt_plot.svg @@ -0,0 +1,854 @@ + + + + + + + + + 2020-09-29T20:33:10.778915 + image/svg+xml + + + Matplotlib v3.3.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/shape_optimization/06_bead_optimization_plate/images/beadOpt_result.gif b/shape_optimization/06_bead_optimization_plate/images/beadOpt_result.gif new file mode 100644 index 00000000..5e459bc8 Binary files /dev/null and b/shape_optimization/06_bead_optimization_plate/images/beadOpt_result.gif differ diff --git a/shape_optimization/06_bead_optimization_plate/optimization_parameters.json b/shape_optimization/06_bead_optimization_plate/optimization_parameters.json index acb167a4..610b00bf 100644 --- a/shape_optimization/06_bead_optimization_plate/optimization_parameters.json +++ b/shape_optimization/06_bead_optimization_plate/optimization_parameters.json @@ -1,79 +1,85 @@ { - "optimization_settings" : { - "model_settings" : { - "domain_size" : 3, - "model_part_name" : "plate", - "model_import_settings" : { - "input_type" : "mdpa", - "input_filename" : "plate" + "optimization_settings": { + "model_settings": { + "domain_size": 3, + "model_part_name": "plate", + "model_import_settings": { + "input_type": "mdpa", + "input_filename": "plate" }, - "design_surface_sub_model_part_name" : "design_surface", - "damping" : { - "apply_damping" : false, - "damping_regions" : [{ - "sub_model_part_name" : "constraint_points", - "damp_X" : true, - "damp_Y" : true, - "damp_Z" : true, - "damping_function_type" : "cosine", - "damping_radius" : 0.15 - }] + "design_surface_sub_model_part_name": "design_surface", + "damping": { + "apply_damping": false, + "damping_regions": [ + { + "sub_model_part_name": "constraint_points", + "damp_X": true, + "damp_Y": true, + "damp_Z": true, + "damping_function_type": "cosine", + "damping_radius": 0.15 + } + ] }, - "mesh_motion" : { - "apply_mesh_solver" : false + "mesh_motion": { + "apply_mesh_solver": false } }, - "objectives" : [{ - "identifier" : "strain_energy", - "type" : "minimization", - "analyzer" : "kratos", - "response_settings":{ - "response_type" : "strain_energy", - "primal_settings" : "analysis_parameters.json", - "gradient_mode" : "semi_analytic", - "step_size" : 1e-7 - }, - "project_gradient_on_surface_normals" : false - }], - "constraints" : [], - "design_variables" : { - "type" : "vertex_morphing", - "filter" : { - "filter_function_type" : "linear", - "filter_radius" : 0.075, - "max_nodes_in_filter_radius" : 1000 + "objectives": [ + { + "identifier": "strain_energy", + "type": "minimization", + "analyzer": "kratos", + "response_settings": { + "response_type": "strain_energy", + "primal_settings": "analysis_parameters.json", + "gradient_mode": "semi_analytic", + "step_size": 1e-7 + }, + "project_gradient_on_surface_normals": false + } + ], + "constraints": [], + "design_variables": { + "type": "vertex_morphing", + "filter": { + "filter_function_type": "linear", + "filter_radius": 0.075, + "max_nodes_in_filter_radius": 1000 } }, - "optimization_algorithm" : { - "name" : "bead_optimization", - "bead_height" : 0.025, - "bead_direction" : [], - "bead_side" : "both", - "filter_penalty_term" : false, - "estimated_lagrange_multiplier" : 7e-4, - "max_total_iterations" : 300, - "max_inner_iterations" : 30, - "min_inner_iterations" : 3, - "inner_iteration_tolerance" : 1e-3, - "line_search" : { - "step_size" : 0.3 + "optimization_algorithm": { + "name": "bead_optimization", + "bead_height": 0.025, + "bead_direction": [], + "bead_side": "both", + "filter_penalty_term": false, + "estimated_lagrange_multiplier": 7e-4, + "max_total_iterations": 300, + "max_inner_iterations": 30, + "min_inner_iterations": 3, + "inner_iteration_tolerance": 1e-3, + "line_search": { + "step_size": 0.15 } }, - "output" : { - "design_output_mode" : "WriteDesignSurface", - "nodal_results" : [ "NORMALIZED_SURFACE_NORMAL", - "DF1DX", - "DF1DALPHA", - "DF1DALPHA_MAPPED", - "DPDALPHA", - "ALPHA", - "ALPHA_MAPPED", - "CONTROL_POINT_CHANGE", - "SHAPE_UPDATE", - "SHAPE_CHANGE" ], - "output_format" : { - "name" : "gid" + "output": { + "design_output_mode": "WriteDesignSurface", + "nodal_results": [ + "NORMALIZED_SURFACE_NORMAL", + "DF1DX", + "DF1DALPHA", + "DF1DALPHA_MAPPED", + "DPDALPHA", + "ALPHA", + "ALPHA_MAPPED", + "CONTROL_POINT_CHANGE", + "SHAPE_UPDATE", + "SHAPE_CHANGE" + ], + "output_format": { + "name": "vtk" } } } -} +} \ No newline at end of file diff --git a/shape_optimization/06_bead_optimization_plate/plot_results.py b/shape_optimization/06_bead_optimization_plate/plot_results.py new file mode 100644 index 00000000..3cb2567e --- /dev/null +++ b/shape_optimization/06_bead_optimization_plate/plot_results.py @@ -0,0 +1,58 @@ +from matplotlib.ticker import TickHelper +import pandas as pd +import matplotlib.pyplot as plt +import matplotlib.ticker as ticker +plt.style.use('seaborn') + +history = "Optimization_Results" + +plot = { + "name": "strain energy", + "column_name": "f" +} + + +path = f"{history}/optimization_log.csv" + +df = pd.read_csv(path, delimiter=",") +df.columns = [x.strip() for x in df.columns] + +""" +fig, axs = plt.subplots(1, len(plots), figsize=(18, 6)) + +for plot, ax in zip(plots, axs): + for column_name in plot["column_names"]: + ax.plot(df[column_name], label=column_name) + ax.legend() + ax.set_title(plot["name"]) +""" + +fig, ax = plt.subplots(1, 1, figsize=(4, 6)) +ax.plot(df[plot["column_name"]], label=plot["column_name"]) +ax.legend(fontsize=11) +ax.set_title(plot["name"], fontsize=13) +ax.tick_params(axis='x', labelsize=13) +ax.tick_params(axis='y', labelsize=13) +ax.yaxis.set_major_locator(ticker.MultipleLocator(0.001)) # tick_spacing +ax.xaxis.set_major_locator(ticker.MultipleLocator(10)) # tick_spacing + +"""grid = plt.GridSpec(2, 3) +plot_f = plt.subplot(grid[:, 0]) +plot_c1 = plt.subplot(grid[0, 1]) +plot_c2 = plt.subplot(grid[0, 2]) +plot_c3 = plt.subplot(grid[1, 1]) +plot_stp = plt.subplot(grid[1, 2]) +axs_list = [plot_f, plot_c1, plot_c2, plot_c3, plot_stp] +for plot, ax in zip(plots, axs_list): + for column_name in plot["column_names"]: + ax.plot(df[column_name], label=column_name) + ax.legend(fontsize=11) + ax.set_title(plot["name"], fontsize=13) + ax.tick_params(axis='x', labelsize=13) + ax.tick_params(axis='y', labelsize=13) + ax.xaxis.set_major_locator(ticker.MultipleLocator(4)) # tick_spacing is 4 + if plot['name'] == 'mass': + ax.yaxis.set_major_locator(ticker.MultipleLocator(1)) +plt.tight_layout() +""" +plt.show() diff --git a/shape_optimization/06_bead_optimization_plate/run_optimization.py b/shape_optimization/06_bead_optimization_plate/run_optimization.py index cdf37e84..1ff4ba9f 100644 --- a/shape_optimization/06_bead_optimization_plate/run_optimization.py +++ b/shape_optimization/06_bead_optimization_plate/run_optimization.py @@ -5,12 +5,13 @@ from KratosMultiphysics.ShapeOptimizationApplication import optimizer_factory # Read parameters -with open("optimization_parameters.json",'r') as parameter_file: +with open("optimization_parameters.json", 'r') as parameter_file: parameters = KM.Parameters(parameter_file.read()) # Defining the model_part model = KM.Model() # Create optimizer and perform optimization -optimizer = optimizer_factory.CreateOptimizer(parameters["optimization_settings"], model) -optimizer.Optimize() \ No newline at end of file +optimizer = optimizer_factory.CreateOptimizer( + parameters["optimization_settings"], model) +optimizer.Optimize() diff --git a/shape_optimization/README.md b/shape_optimization/README.md index 60b80385..798c6f8f 100644 --- a/shape_optimization/README.md +++ b/shape_optimization/README.md @@ -8,13 +8,13 @@ They are realized using the **ShapeOptimizationApplication** - [Multi Constraint Optimization 3D Hook](10_Multi_Constraint_Optimization_3D_Hook) - [Shape Update Response Optimization - Stanford Bunny](11_Shape_Update_Optimization_Stanford_Bunny) - [Strain Energy Minimization - 3D Shell](02_Strain_Energy_Minimization_3D_Shell) +- [Bead Optimization Plate](06_bead_optimization_plate) #### Other Examples - [Strain Energy Minimization - 3D Hook](01_Strain_Energy_Minimization_3D_Hook) - [Mesh Independent Optimization - 3D Shell](03_mesh_independent_optimization_3D_Shell) - [Eigen Frequency Maximization - 3D Cantilever](04_Eigenfrequency_Maximization_3D_Cantilever) - [Constrained Shell Optimization](05_Constrained_Shell_Opt) -- [Bead Optimization Plate](06_bead_optimization_plate) - [Optimization Plate with Step Adaption](07_optimization_plate_with_step_adaption) - [Optimization 3D Hook with Plane Constraint](08_Optimization_3D_Hook_plane_constraint) - [Packaging - 3D Shell](09_Packaging_3D_Shell) \ No newline at end of file