From 9cb544b8c95079bdbb85bcc34e0cf084a57f5165 Mon Sep 17 00:00:00 2001 From: Nathaniel Morgan Date: Fri, 30 Aug 2024 12:47:01 -0600 Subject: [PATCH 01/33] updated var name for eos_state_vars --- single-node-refactor/src/common/material.h | 6 +- .../src/material_models/eos/gamma_law_eos.h | 5 +- .../src/material_models/eos/no_eos.h | 22 ++++++- .../material_models/eos/user_defined_eos.h | 43 ++++++++++++-- .../src/material_models/eos/void_eos.h | 58 ++++++++++++------- 5 files changed, 103 insertions(+), 31 deletions(-) diff --git a/single-node-refactor/src/common/material.h b/single-node-refactor/src/common/material.h index 309c37dbb..ee935004e 100644 --- a/single-node-refactor/src/common/material.h +++ b/single-node-refactor/src/common/material.h @@ -184,7 +184,7 @@ struct MaterialFunctions_t const DCArrayKokkos& MaterialPoints_stress, const size_t MaterialPoints_lid, const size_t mat_id, - const DCArrayKokkos& MaterialPoints_state_vars, + const DCArrayKokkos& MaterialPoints_eos_state_vars, const DCArrayKokkos& MaterialPoints_sspd, const double den, const double sie, @@ -194,7 +194,7 @@ struct MaterialFunctions_t const DCArrayKokkos& MaterialPoints_stress, const size_t MaterialPoints_lid, const size_t mat_id, - const DCArrayKokkos& MaterialPoints_state_vars, + const DCArrayKokkos& MaterialPoints_eos_state_vars, const DCArrayKokkos& MaterialPoints_sspd, const double den, const double sie, @@ -207,7 +207,7 @@ struct MaterialFunctions_t const DCArrayKokkos& MaterialPoints_stress, const size_t MaterialPoints_lid, const size_t mat_id, - const DCArrayKokkos& MaterialPoints_state_vars, + const DCArrayKokkos& MaterialPoints_strength_state_vars, const DCArrayKokkos& MaterialPoints_sspd, const double den, const double sie, diff --git a/single-node-refactor/src/material_models/eos/gamma_law_eos.h b/single-node-refactor/src/material_models/eos/gamma_law_eos.h index f7f5ae415..81b076861 100644 --- a/single-node-refactor/src/material_models/eos/gamma_law_eos.h +++ b/single-node-refactor/src/material_models/eos/gamma_law_eos.h @@ -75,6 +75,7 @@ namespace GammaLawGasEOSModel { const DCArrayKokkos& MaterialPoints_stress, const size_t mat_pt_lid, const size_t mat_id, + const DCArrayKokkos& MaterialPoints_eos_state_vars, const DCArrayKokkos& MaterialPoints_sspd, const double den, const double sie, @@ -92,7 +93,7 @@ namespace GammaLawGasEOSModel { const DCArrayKokkos& MaterialPoints_stress, const size_t mat_pt_lid, const size_t mat_id, - const DCArrayKokkos& MaterialPoints_state_vars, + const DCArrayKokkos& MaterialPoints_eos_state_vars, const DCArrayKokkos& MaterialPoints_sspd, const double den, const double sie, @@ -113,7 +114,7 @@ namespace GammaLawGasEOSModel { const DCArrayKokkos& MaterialPoints_stress, const size_t mat_pt_lid, const size_t mat_id, - const DCArrayKokkos& MaterialPoints_state_vars, + const DCArrayKokkos& MaterialPoints_eos_state_vars, const DCArrayKokkos& MaterialPoints_sspd, const double den, const double sie, diff --git a/single-node-refactor/src/material_models/eos/no_eos.h b/single-node-refactor/src/material_models/eos/no_eos.h index 6dd9f889f..611b3130b 100644 --- a/single-node-refactor/src/material_models/eos/no_eos.h +++ b/single-node-refactor/src/material_models/eos/no_eos.h @@ -54,13 +54,31 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /// ///////////////////////////////////////////////////////////////////////////// namespace NoEOSModel { + + // host side function + static void initialize(const DCArrayKokkos& MaterialPoints_pres, + const DCArrayKokkos& MaterialPoints_stress, + const size_t mat_pt_lid, + const size_t mat_id, + const DCArrayKokkos& MaterialPoints_eos_state_vars, + const DCArrayKokkos& MaterialPoints_sspd, + const double den, + const double sie, + const RaggedRightArrayKokkos &eos_global_vars, + const size_t num_vars) + { + + + + return; + } // end func KOKKOS_FUNCTION static void calc_pressure(const DCArrayKokkos& MaterialPoints_pres, const DCArrayKokkos& MaterialPoints_stress, const size_t mat_pt_lid, const size_t mat_id, - const DCArrayKokkos& MaterialPoints_state_vars, + const DCArrayKokkos& MaterialPoints_eos_state_vars, const DCArrayKokkos& MaterialPoints_sspd, const double den, const double sie, @@ -74,7 +92,7 @@ namespace NoEOSModel { const DCArrayKokkos& MaterialPoints_stress, const size_t mat_pt_lid, const size_t mat_id, - const DCArrayKokkos& MaterialPoints_state_vars, + const DCArrayKokkos& MaterialPoints_eos_state_vars, const DCArrayKokkos& MaterialPoints_sspd, const double den, const double sie, diff --git a/single-node-refactor/src/material_models/eos/user_defined_eos.h b/single-node-refactor/src/material_models/eos/user_defined_eos.h index 50a28e48b..4529956c5 100644 --- a/single-node-refactor/src/material_models/eos/user_defined_eos.h +++ b/single-node-refactor/src/material_models/eos/user_defined_eos.h @@ -60,13 +60,30 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ///////////////////////////////////////////////////////////////////////////// namespace UserDefinedEOSModel { + // host side function + static void initialize(const DCArrayKokkos& MaterialPoints_pres, + const DCArrayKokkos& MaterialPoints_stress, + const size_t mat_pt_lid, + const size_t mat_id, + const DCArrayKokkos& MaterialPoints_eos_state_vars, + const DCArrayKokkos& MaterialPoints_sspd, + const double den, + const double sie, + const RaggedRightArrayKokkos &eos_global_vars, + const size_t num_vars) + { + + + + return; + } // end func KOKKOS_FUNCTION static void calc_pressure(const DCArrayKokkos& MaterialPoints_pres, const DCArrayKokkos& MaterialPoints_stress, const size_t mat_pt_lid, const size_t mat_id, - const DCArrayKokkos& MaterialPoints_state_vars, + const DCArrayKokkos& MaterialPoints_eos_state_vars, const DCArrayKokkos& MaterialPoints_sspd, const double den, const double sie, @@ -88,7 +105,7 @@ namespace UserDefinedEOSModel const DCArrayKokkos& MaterialPoints_stress, const size_t mat_pt_lid, const size_t mat_id, - const DCArrayKokkos& MaterialPoints_state_vars, + const DCArrayKokkos& MaterialPoints_eos_state_vars, const DCArrayKokkos& MaterialPoints_sspd, const double den, const double sie, @@ -131,12 +148,30 @@ namespace UserDefinedEOSModel // ------------------------------------------------------------------------------ namespace NotionalEOSModel { + // host side function + static void initialize(const DCArrayKokkos& MaterialPoints_pres, + const DCArrayKokkos& MaterialPoints_stress, + const size_t mat_pt_lid, + const size_t mat_id, + const DCArrayKokkos& MaterialPoints_eos_state_vars, + const DCArrayKokkos& MaterialPoints_sspd, + const double den, + const double sie, + const RaggedRightArrayKokkos &eos_global_vars, + const size_t num_vars) + { + + + + return; + } // end func + KOKKOS_FUNCTION static void calc_pressure(const DCArrayKokkos& MaterialPoints_pres, const DCArrayKokkos& MaterialPoints_stress, const size_t mat_pt_lid, const size_t mat_id, - const DCArrayKokkos& MaterialPoints_state_vars, + const DCArrayKokkos& MaterialPoints_eos_state_vars, const DCArrayKokkos& MaterialPoints_sspd, const double den, const double sie, @@ -153,7 +188,7 @@ namespace NotionalEOSModel { const DCArrayKokkos& MaterialPoints_stress, const size_t mat_pt_lid, const size_t mat_id, - const DCArrayKokkos& MaterialPoints_state_vars, + const DCArrayKokkos& MaterialPoints_eos_state_vars, const DCArrayKokkos& MaterialPoints_sspd, const double den, const double sie, diff --git a/single-node-refactor/src/material_models/eos/void_eos.h b/single-node-refactor/src/material_models/eos/void_eos.h index d736d8aba..66d24ff19 100644 --- a/single-node-refactor/src/material_models/eos/void_eos.h +++ b/single-node-refactor/src/material_models/eos/void_eos.h @@ -55,37 +55,55 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ///////////////////////////////////////////////////////////////////////////// namespace VoidEOSModel { + // host side function + static void initialize(const DCArrayKokkos& MaterialPoints_pres, + const DCArrayKokkos& MaterialPoints_stress, + const size_t mat_pt_lid, + const size_t mat_id, + const DCArrayKokkos& MaterialPoints_eos_state_vars, + const DCArrayKokkos& MaterialPoints_sspd, + const double den, + const double sie, + const RaggedRightArrayKokkos &eos_global_vars, + const size_t num_vars) + { + + + + return; + } // end func + KOKKOS_FUNCTION - static void calc_pressure(const DCArrayKokkos& elem_pres, - const DCArrayKokkos& elem_stress, - const size_t mat_pt_lid, - const size_t mat_id, - const DCArrayKokkos& elem_state_vars, - const DCArrayKokkos& elem_sspd, - const double den, - const double sie, - const RaggedRightArrayKokkos &eos_global_vars) + static void calc_pressure(const DCArrayKokkos& MaterialPoints_pres, + const DCArrayKokkos& MaterialPoints_stress, + const size_t mat_pt_lid, + const size_t mat_id, + const DCArrayKokkos& MaterialPoints_eos_state_vars, + const DCArrayKokkos& MaterialPoints_sspd, + const double den, + const double sie, + const RaggedRightArrayKokkos &eos_global_vars) { // pressure of a void is 0 - elem_pres(mat_pt_lid) = 0.0; + MaterialPoints_pres(mat_pt_lid) = 0.0; return; } // end func KOKKOS_FUNCTION - static void calc_sound_speed(const DCArrayKokkos& elem_pres, - const DCArrayKokkos& elem_stress, - const size_t mat_pt_lid, - const size_t mat_id, - const DCArrayKokkos& elem_state_vars, - const DCArrayKokkos& elem_sspd, - const double den, - const double sie, - const RaggedRightArrayKokkos &eos_global_vars) + static void calc_sound_speed(const DCArrayKokkos& MaterialPoints_pres, + const DCArrayKokkos& MaterialPoints_stress, + const size_t mat_pt_lid, + const size_t mat_id, + const DCArrayKokkos& MaterialPoints_eos_state_vars, + const DCArrayKokkos& MaterialPoints_sspd, + const double den, + const double sie, + const RaggedRightArrayKokkos &eos_global_vars) { // sound speed of a void is 0, machine small must be used for CFL calculation - elem_sspd(mat_pt_lid) = 1.0e-32; + MaterialPoints_sspd(mat_pt_lid) = 1.0e-32; return; } // end func From 415275706b288bc028ff6805ca315ddd98c028a2 Mon Sep 17 00:00:00 2001 From: Nathaniel Morgan Date: Fri, 30 Aug 2024 16:02:25 -0600 Subject: [PATCH 02/33] updated and fixed bugs in RZ solver --- .../Solvers/SGH_solver_3D/src/force_sgh.cpp | 3 +- .../Solvers/SGH_solver_3D/src/properties.cpp | 3 +- .../SGH_solver_rz/src/force_sgh_rz.cpp | 17 ++- .../SGH_solver_rz/src/properties_rz.cpp | 3 +- single-node-refactor/src/common/material.h | 5 +- single-node-refactor/src/input/parse_yaml.cpp | 1 + .../material_models/eos/user_defined_eos.h | 3 + .../material_models/strength/no_strength.h | 108 +----------------- .../strength/user_defined_strength.h | 28 ++--- 9 files changed, 45 insertions(+), 126 deletions(-) diff --git a/single-node-refactor/src/Solvers/SGH_solver_3D/src/force_sgh.cpp b/single-node-refactor/src/Solvers/SGH_solver_3D/src/force_sgh.cpp index 7de569d13..6801b53a0 100644 --- a/single-node-refactor/src/Solvers/SGH_solver_3D/src/force_sgh.cpp +++ b/single-node-refactor/src/Solvers/SGH_solver_3D/src/force_sgh.cpp @@ -433,7 +433,8 @@ void SGH3D::get_force(const Material_t& Materials, node_vel, GaussPoints_vol(elem_gid), dt, - rk_alpha); + rk_alpha, + Materials.strength_global_vars); } // end logical on increment_based strength model }); // end parallel for loop over elements diff --git a/single-node-refactor/src/Solvers/SGH_solver_3D/src/properties.cpp b/single-node-refactor/src/Solvers/SGH_solver_3D/src/properties.cpp index 31f89b428..fced3b640 100644 --- a/single-node-refactor/src/Solvers/SGH_solver_3D/src/properties.cpp +++ b/single-node-refactor/src/Solvers/SGH_solver_3D/src/properties.cpp @@ -205,7 +205,8 @@ void SGH3D::update_state( node_vel, GaussPoints_vol(gauss_gid), dt, - rk_alpha); + rk_alpha, + Materials.strength_global_vars); }); // end parallel for over mat elem lid } // end if state_based strength model diff --git a/single-node-refactor/src/Solvers/SGH_solver_rz/src/force_sgh_rz.cpp b/single-node-refactor/src/Solvers/SGH_solver_rz/src/force_sgh_rz.cpp index c9a18e206..d233f73b5 100644 --- a/single-node-refactor/src/Solvers/SGH_solver_rz/src/force_sgh_rz.cpp +++ b/single-node-refactor/src/Solvers/SGH_solver_rz/src/force_sgh_rz.cpp @@ -414,11 +414,21 @@ void SGHRZ::get_force_rz(const Material_t& Materials, // Wilkins used elem_area*0.25 for the corner area, we will use the corner // areas calculated using Barlow's symmetry and energy preserving area partitioning if (node_radius > tiny) { + // sigma_RZ / R_p - corner_force(corner_gid, 0) += tau(1, 0) * corner_areas(corner_lid) / node_radius; + double force_term_1 = tau(1, 0) * corner_areas(corner_lid) / node_radius; + //force_term_1 = tau(1, 0) * 0.25*elem_area / node_radius; // Wilkins + + corner_force(corner_gid, 0) += force_term_1; + MaterialCorners_force(mat_corner_lid, 0) += force_term_1; // (sigma_RR - sigma_theta) / R_p - corner_force(corner_gid, 1) += (tau(1, 1) - tau(2, 2)) * corner_areas(corner_lid) / node_radius; + double force_term_2 = (tau(1, 1) - tau(2, 2)) * corner_areas(corner_lid) / node_radius; + //force_term_2 = (tau(1, 1) - tau(2, 2)) * 0.25*elem_area / node_radius; // Wilkins + + corner_force(corner_gid, 1) += force_term_2; + MaterialCorners_force(mat_corner_lid, 1) += force_term_2; + } // end if radius >0 } // end if eroded @@ -449,7 +459,8 @@ void SGHRZ::get_force_rz(const Material_t& Materials, node_vel, GaussPoints_vol(elem_gid), dt, - rk_alpha); + rk_alpha, + Materials.strength_global_vars); } // end logical on increment_based strength model }); // end parallel for loop over elements diff --git a/single-node-refactor/src/Solvers/SGH_solver_rz/src/properties_rz.cpp b/single-node-refactor/src/Solvers/SGH_solver_rz/src/properties_rz.cpp index 36b908dbf..de820bc4c 100644 --- a/single-node-refactor/src/Solvers/SGH_solver_rz/src/properties_rz.cpp +++ b/single-node-refactor/src/Solvers/SGH_solver_rz/src/properties_rz.cpp @@ -220,7 +220,8 @@ void SGHRZ::update_state_rz( node_vel, GaussPoints_vol(gauss_gid), dt, - rk_alpha); + rk_alpha, + Materials.strength_global_vars); }); // end parallel for over mat elem lid diff --git a/single-node-refactor/src/common/material.h b/single-node-refactor/src/common/material.h index ee935004e..bcefde1a8 100644 --- a/single-node-refactor/src/common/material.h +++ b/single-node-refactor/src/common/material.h @@ -113,7 +113,7 @@ static std::map eos_models_map { "no_eos", model::noEOS }, { "gamma_law_gas", model::gammaLawGasEOS }, { "void", model::voidEOS }, - { "user_defined", model::userDefinedEOS }, + { "user_defined_eos", model::userDefinedEOS }, }; static std::map erosion_model_map @@ -217,7 +217,8 @@ struct MaterialFunctions_t const DCArrayKokkos& node_vel, const double vol, const double dt, - const double rk_alpha) = NULL; + const double rk_alpha, + const RaggedRightArrayKokkos &strength_global_vars) = NULL; // -- Erosion -- diff --git a/single-node-refactor/src/input/parse_yaml.cpp b/single-node-refactor/src/input/parse_yaml.cpp index caaf999fb..9004fc53c 100644 --- a/single-node-refactor/src/input/parse_yaml.cpp +++ b/single-node-refactor/src/input/parse_yaml.cpp @@ -1707,6 +1707,7 @@ void parse_materials(Yaml::Node& root, Material_t& Materials) break; case model::userDefinedStrength: + RUN({ Materials.MaterialFunctions(mat_id).calc_stress = &UserDefinedStrengthModel::calc_stress; }); diff --git a/single-node-refactor/src/material_models/eos/user_defined_eos.h b/single-node-refactor/src/material_models/eos/user_defined_eos.h index 4529956c5..a9cd0f961 100644 --- a/single-node-refactor/src/material_models/eos/user_defined_eos.h +++ b/single-node-refactor/src/material_models/eos/user_defined_eos.h @@ -204,4 +204,7 @@ namespace NotionalEOSModel { } // end namespace + + + #endif // end Header Guard \ No newline at end of file diff --git a/single-node-refactor/src/material_models/strength/no_strength.h b/single-node-refactor/src/material_models/strength/no_strength.h index 35ca884e4..dd7ac1a6a 100644 --- a/single-node-refactor/src/material_models/strength/no_strength.h +++ b/single-node-refactor/src/material_models/strength/no_strength.h @@ -32,68 +32,11 @@ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. **********************************************************************************************/ -#ifndef USER_DEFINED_STRENGTH_H -#define USER_DEFINED_STRENGTH_H +#ifndef NO_STRENGTH_H +#define NO_STRENGTH_H -///////////////////////////////////////////////////////////////////////////// -/// -/// \fn UserDefinedStrengthModel -/// -/// \brief user defined strength model -/// -/// This is the user material model function for the stress tensor -/// -/// \param Element pressure -/// \param Element stress -/// \param Global ID for the element -/// \param Material ID for the element -/// \param Element state variables -/// \param Element Sound speed -/// \param Material density -/// \param Material specific internal energy -/// \param Element velocity gradient -/// \param Element nodes IDs in the element -/// \param Node node coordinates -/// \param Noe velocity -/// \param Element volume -/// \param Element time step -/// \param Element coefficient in the Runge Kutta time integration -/// -///////////////////////////////////////////////////////////////////////////// -namespace UserDefinedStrengthModel { - - KOKKOS_FUNCTION - static void calc_stress(const DCArrayKokkos& elem_pres, - const DCArrayKokkos& elem_stress, - const size_t mat_pt_lid, - const size_t mat_id, - const DCArrayKokkos& elem_state_vars, - const DCArrayKokkos& elem_sspd, - const double den, - const double sie, - const ViewCArrayKokkos& vel_grad, - const ViewCArrayKokkos& elem_node_gids, - const DCArrayKokkos& node_coords, - const DCArrayKokkos& node_vel, - const double vol, - const double dt, - const double rk_alpha) - { - // ----------------------------------------------------------------------------- - // Required variables are here - // ------------------------------------------------------------------------------ - - // ----------------------------------------------------------------------------- - // The user must coding goes here - // ------------------------------------------------------------------------------ - - return; - } // end of user mat - -} // end namespace - // ----------------------------------------------------------------------------- // This is the user material model function for the stress tensor // ------------------------------------------------------------------------------ @@ -114,51 +57,8 @@ namespace NoStrengthModel { const DCArrayKokkos& node_vel, const double vol, const double dt, - const double rk_alpha) - { - return; - } // end of user mat - -} // end namespace - - -///////////////////////////////////////////////////////////////////////////// -/// -/// \fn fcn_name -/// -/// \brief -/// -/// -/// -/// \param -/// \param -/// \param -/// -/// \return -/// -///////////////////////////////////////////////////////////////////////////// -// ----------------------------------------------------------------------------- -// This is place holder for another user strength model -// ------------------------------------------------------------------------------ -namespace NotionalStrengthModel { - - KOKKOS_FUNCTION - static void calc_stress(const DCArrayKokkos& elem_pres, - const DCArrayKokkos& elem_stress, - const size_t mat_pt_lid, - const size_t mat_id, - const DCArrayKokkos& elem_state_vars, - const DCArrayKokkos& elem_sspd, - const double den, - const double sie, - const ViewCArrayKokkos& vel_grad, - const ViewCArrayKokkos& elem_node_gids, - const DCArrayKokkos& node_coords, - const DCArrayKokkos& node_vel, - const double vol, - const double dt, - const double rk_alpha) + const double rk_alpha, + const RaggedRightArrayKokkos &strength_global_vars) { return; } // end of user mat diff --git a/single-node-refactor/src/material_models/strength/user_defined_strength.h b/single-node-refactor/src/material_models/strength/user_defined_strength.h index c194c8a1a..58ae6e5d5 100644 --- a/single-node-refactor/src/material_models/strength/user_defined_strength.h +++ b/single-node-refactor/src/material_models/strength/user_defined_strength.h @@ -65,12 +65,12 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace UserDefinedStrengthModel { KOKKOS_FUNCTION - static void calc_stress(const DCArrayKokkos& elem_pres, - const DCArrayKokkos& elem_stress, - const size_t mat_pt_lid, + static void calc_stress(const DCArrayKokkos& MaterialPoints_pres, + const DCArrayKokkos& MaterialPoints_stress, + const size_t MaterialPoints_lid, const size_t mat_id, - const DCArrayKokkos& elem_state_vars, - const DCArrayKokkos& elem_sspd, + const DCArrayKokkos& MaterialPoints_strength_state_vars, + const DCArrayKokkos& MaterialPoints_sspd, const double den, const double sie, const ViewCArrayKokkos& vel_grad, @@ -79,7 +79,8 @@ namespace UserDefinedStrengthModel { const DCArrayKokkos& node_vel, const double vol, const double dt, - const double rk_alpha) + const double rk_alpha, + const RaggedRightArrayKokkos &strength_global_vars) { // ----------------------------------------------------------------------------- // Required variables are here @@ -118,12 +119,12 @@ namespace UserDefinedStrengthModel { namespace NotionalStrengthModel { KOKKOS_FUNCTION - static void calc_stress(const DCArrayKokkos& elem_pres, - const DCArrayKokkos& elem_stress, - const size_t mat_pt_lid, + static void calc_stress(const DCArrayKokkos& MaterialPoints_pres, + const DCArrayKokkos& MaterialPoints_stress, + const size_t MaterialPoints_lid, const size_t mat_id, - const DCArrayKokkos& elem_state_vars, - const DCArrayKokkos& elem_sspd, + const DCArrayKokkos& MaterialPoints_strength_state_vars, + const DCArrayKokkos& MaterialPoints_sspd, const double den, const double sie, const ViewCArrayKokkos& vel_grad, @@ -132,7 +133,8 @@ namespace NotionalStrengthModel { const DCArrayKokkos& node_vel, const double vol, const double dt, - const double rk_alpha) + const double rk_alpha, + const RaggedRightArrayKokkos &strength_global_vars) { return; } // end of user mat @@ -140,6 +142,4 @@ namespace NotionalStrengthModel { } // end namespace - - #endif // end Header Guard \ No newline at end of file From 3c5db1cd4c584a53a68daf3a1914680ede828d33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CAdrian-Diaz=E2=80=9D?= <“adriandiaz1117@gmail.com”> Date: Mon, 12 Aug 2024 22:56:28 -0600 Subject: [PATCH 03/33] ENH: refactor dynamic objective calls --- .../Fierro_Optimization_Objective.hpp | 14 ++- .../SGH_Solver/include/FEA_Module_SGH.h | 1 - .../SGH_Solver/src/FEA_Module_SGH.cpp | 90 ++----------------- .../Kinetic_Energy_Minimize.h | 85 ++++++++++++++++++ 4 files changed, 105 insertions(+), 85 deletions(-) diff --git a/src/Parallel-Solvers/Optimization_Modules/Fierro_Optimization_Objective.hpp b/src/Parallel-Solvers/Optimization_Modules/Fierro_Optimization_Objective.hpp index d765f13c5..6aad228bf 100644 --- a/src/Parallel-Solvers/Optimization_Modules/Fierro_Optimization_Objective.hpp +++ b/src/Parallel-Solvers/Optimization_Modules/Fierro_Optimization_Objective.hpp @@ -118,13 +118,23 @@ class FierroOptimizationObjective : public ROL::Objective { public: bool time_accumulation; - real_t objective_accumulation; + real_t objective_accumulation, global_objective_accumulation; FierroOptimizationObjective(){ - objective_accumulation = 0; + global_objective_accumulation = objective_accumulation = 0; time_accumulation = false; } + virtual void step_accumulation(const real_t& dt, const size_t& cycle, const size_t& rk_level) {} + + // collect local objective values + virtual void global_reduction() { + + MPI_Allreduce(&objective_accumulation, &global_objective_accumulation, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); + + objective_accumulation = global_objective_accumulation; + } + }; // class ObjectiveMMA diff --git a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/include/FEA_Module_SGH.h b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/include/FEA_Module_SGH.h index 4d0f4ffac..f0aa4ba94 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/include/FEA_Module_SGH.h +++ b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/include/FEA_Module_SGH.h @@ -701,7 +701,6 @@ class FEA_Module_SGH : public FEA_Module int rk_num_bins; // optimization flags and data - bool kinetic_energy_objective; Teuchos::RCP> dynamic_checkpoint_set; Teuchos::RCP> cached_dynamic_checkpoints; int num_active_checkpoints; diff --git a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/FEA_Module_SGH.cpp b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/FEA_Module_SGH.cpp index 2036ce050..7d4a5d69b 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/FEA_Module_SGH.cpp +++ b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/FEA_Module_SGH.cpp @@ -67,7 +67,7 @@ // optimization #include "ROL_Solver.hpp" -#include "Kinetic_Energy_Minimize.h" +#include "Fierro_Optimization_Objective.hpp" #define MAX_ELEM_NODES 8 #define STRAIN_EPSILON 0.000000001 @@ -137,9 +137,6 @@ FEA_Module_SGH::FEA_Module_SGH( noutput = 0; init_output(); - // optimization flags - kinetic_energy_objective = false; - // set parameters Dynamic_Options dynamic_options = simparam->dynamic_options; time_value = dynamic_options.time_value; @@ -929,6 +926,7 @@ void FEA_Module_SGH::sgh_solve() std::vector> FEA_Module_My_TO_Modules = simparam->FEA_Module_My_TO_Modules; problem = Explicit_Solver_Pointer_->problem; // Pointer to ROL optimization problem object ROL::Ptr> obj_pointer; + FierroOptimizationObjective* objective_function; bool topology_optimization_on = simparam->topology_optimization_on; bool shape_optimization_on = simparam->shape_optimization_on; bool use_solve_checkpoints = simparam->optimization_options.use_solve_checkpoints; @@ -938,6 +936,7 @@ void FEA_Module_SGH::sgh_solve() bool dispensable_found = false; bool optimization_on = simparam->topology_optimization_on||simparam->shape_optimization_on; num_active_checkpoints = 0; + bool time_accumulation; if(simparam->optimization_options.disable_forward_solve_output){ @@ -958,10 +957,8 @@ void FEA_Module_SGH::sgh_solve() // simple setup to just request KE for now; above loop to be expanded and used later for scanning modules if (topology_optimization_on||shape_optimization_on) { obj_pointer = problem->getObjective(); - KineticEnergyMinimize_TopOpt& kinetic_energy_minimize_function = dynamic_cast(*obj_pointer); - kinetic_energy_minimize_function.objective_accumulation = 0; - global_objective_accumulation = objective_accumulation = 0; - kinetic_energy_objective = true; + objective_function = dynamic_cast(obj_pointer.getRawPtr()); + time_accumulation = objective_function->time_accumulation; if(!use_solve_checkpoints){ if (max_time_steps + 1 > forward_solve_velocity_data->size()) { old_max_forward_buffer = forward_solve_velocity_data->size(); @@ -1722,71 +1719,8 @@ void FEA_Module_SGH::sgh_solve() } // kinetic energy accumulation - if (kinetic_energy_objective) { - const_vec_array node_velocities_interface; - const_vec_array previous_node_velocities_interface; - if(use_solve_checkpoints){ - node_velocities_interface = all_node_velocities_distributed->getLocalView(Tpetra::Access::ReadOnly); - previous_node_velocities_interface = previous_node_velocities_distributed->getLocalView(Tpetra::Access::ReadOnly); - } - else{ - node_velocities_interface = (*forward_solve_velocity_data)[cycle + 1]->getLocalView(Tpetra::Access::ReadOnly); - previous_node_velocities_interface = (*forward_solve_velocity_data)[cycle]->getLocalView(Tpetra::Access::ReadOnly); - } - KE_loc_sum = 0.0; - KE_sum = 0.0; - // extensive KE - if(simparam->optimization_options.optimization_objective_regions.size()){ - int nobj_volumes = simparam->optimization_options.optimization_objective_regions.size(); - const_vec_array all_initial_node_coords = all_initial_node_coords_distributed->getLocalView(Tpetra::Access::ReadOnly); - REDUCE_SUM_CLASS(node_gid, 0, nlocal_nodes, KE_loc_sum, { - double ke = 0; - double current_node_coords[3]; - bool contained = false; - current_node_coords[0] = all_initial_node_coords(node_gid, 0); - current_node_coords[1] = all_initial_node_coords(node_gid, 1); - current_node_coords[2] = all_initial_node_coords(node_gid, 2); - for(int ivolume = 0; ivolume < nobj_volumes; ivolume++){ - if(simparam->optimization_options.optimization_objective_regions(ivolume).contains(current_node_coords)){ - contained = true; - } - } - if(contained){ - for (size_t dim = 0; dim < num_dim; dim++) { - // midpoint integration approximation - ke += (node_velocities_interface(node_gid, dim) + previous_node_velocities_interface(node_gid, dim)) * - (node_velocities_interface(node_gid, dim) + previous_node_velocities_interface(node_gid, dim)) / 4; // 1/2 at end - } // end for - } - - if (num_dim == 2) { - KE_loc_sum += node_mass(node_gid) * node_coords(rk_level, node_gid, 1) * ke; - } - else{ - KE_loc_sum += node_mass(node_gid) * ke; - } - }, KE_sum); - } - else{ - REDUCE_SUM_CLASS(node_gid, 0, nlocal_nodes, KE_loc_sum, { - double ke = 0; - for (size_t dim = 0; dim < num_dim; dim++) { - // midpoint integration approximation - ke += (node_velocities_interface(node_gid, dim) + previous_node_velocities_interface(node_gid, dim)) * - (node_velocities_interface(node_gid, dim) + previous_node_velocities_interface(node_gid, dim)) / 4; // 1/2 at end - } // end for - - if (num_dim == 2) { - KE_loc_sum += node_mass(node_gid) * node_coords(rk_level, node_gid, 1) * ke; - } - else{ - KE_loc_sum += node_mass(node_gid) * ke; - } - }, KE_sum); - } - Kokkos::fence(); - KE_sum = 0.5 * KE_sum; - objective_accumulation += KE_sum * dt; + if (time_accumulation) { + objective_function->step_accumulation(dt, cycle, rk_level); } } @@ -1850,15 +1784,7 @@ void FEA_Module_SGH::sgh_solve() // simple setup to just calculate KE minimize objective for now if (topology_optimization_on) { - KineticEnergyMinimize_TopOpt& kinetic_energy_minimize_function = dynamic_cast(*obj_pointer); - - // collect local objective values - MPI_Allreduce(&objective_accumulation, &global_objective_accumulation, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); - kinetic_energy_minimize_function.objective_accumulation = global_objective_accumulation; - - // if (myrank == 0) { - // std::cout << "CURRENT TIME INTEGRAL OF KINETIC ENERGY " << global_objective_accumulation << std::endl; - // } + objective_function->global_reduction(); } auto time_2 = std::chrono::high_resolution_clock::now(); diff --git a/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Kinetic_Energy_Minimize.h b/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Kinetic_Energy_Minimize.h index fc7937718..0b6c81581 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Kinetic_Energy_Minimize.h +++ b/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Kinetic_Energy_Minimize.h @@ -137,7 +137,10 @@ typedef MV::dual_view_type dual_vec_array; public: bool nodal_density_flag_; int last_comm_step, last_solve_step, current_step; + int num_dim; size_t nvalid_modules; + size_t nlocal_nodes; + DViewCArrayKokkos node_mass, node_coords; std::vector valid_fea_modules; // modules that may interface with this objective function FEA_MODULE_TYPE set_module_type; // std::string my_fea_module = "SGH"; @@ -151,16 +154,23 @@ typedef MV::dual_view_type dual_vec_array; valid_fea_modules.push_back(FEA_MODULE_TYPE::Dynamic_Elasticity); nvalid_modules = valid_fea_modules.size(); objective_sign = 1; + num_dim = Explicit_Solver_Pointer_->simparam.num_dims; const Simulation_Parameters& simparam = Explicit_Solver_Pointer_->simparam; for (const auto& fea_module : Explicit_Solver_Pointer_->fea_modules) { for (int ivalid = 0; ivalid < nvalid_modules; ivalid++) { if (fea_module->Module_Type == FEA_MODULE_TYPE::SGH) { FEM_SGH_ = dynamic_cast(fea_module); set_module_type = FEA_MODULE_TYPE::SGH; + node_mass = FEM_SGH_->node_mass; + node_coords = FEM_SGH_->node_coords; + nlocal_nodes = FEM_SGH_->nlocal_nodes; } if (fea_module->Module_Type == FEA_MODULE_TYPE::Dynamic_Elasticity) { FEM_Dynamic_Elasticity_ = dynamic_cast(fea_module); set_module_type = FEA_MODULE_TYPE::Dynamic_Elasticity; + node_mass = FEM_Dynamic_Elasticity_->node_mass; + node_coords = FEM_Dynamic_Elasticity_->node_coords; + nlocal_nodes = FEM_Dynamic_Elasticity_->nlocal_nodes; } } } @@ -355,6 +365,81 @@ typedef MV::dual_view_type dual_vec_array; } } + /* -------------------------------------------------------------------------------------- + Compute time integral contribution for this objective function form + ----------------------------------------------------------------------------------------- */ + void step_accumulation(const real_t& dt, const size_t& cycle, const size_t& rk_level) { + + const_vec_array node_velocities_interface; + const_vec_array previous_node_velocities_interface; + bool use_solve_checkpoints = FEM_SGH_->simparam->optimization_options.use_solve_checkpoints; + if(use_solve_checkpoints){ + node_velocities_interface = FEM_SGH_->all_node_velocities_distributed->getLocalView(Tpetra::Access::ReadOnly); + previous_node_velocities_interface = FEM_SGH_->previous_node_velocities_distributed->getLocalView(Tpetra::Access::ReadOnly); + } + else{ + auto forward_solve_velocity_data = FEM_SGH_->forward_solve_velocity_data; + node_velocities_interface = (*forward_solve_velocity_data)[cycle + 1]->getLocalView(Tpetra::Access::ReadOnly); + previous_node_velocities_interface = (*forward_solve_velocity_data)[cycle]->getLocalView(Tpetra::Access::ReadOnly); + } + + double KE_sum = 0.0; + double KE_loc_sum = 0.0; + + // extensive KE + if(FEM_SGH_->simparam->optimization_options.optimization_objective_regions.size()){ + int nobj_volumes = FEM_SGH_->simparam->optimization_options.optimization_objective_regions.size(); + const_vec_array all_initial_node_coords = FEM_SGH_->all_initial_node_coords_distributed->getLocalView(Tpetra::Access::ReadOnly); + REDUCE_SUM_CLASS(node_gid, 0, nlocal_nodes, KE_loc_sum, { + double ke = 0; + double current_node_coords[3]; + bool contained = false; + current_node_coords[0] = all_initial_node_coords(node_gid, 0); + current_node_coords[1] = all_initial_node_coords(node_gid, 1); + current_node_coords[2] = all_initial_node_coords(node_gid, 2); + for(int ivolume = 0; ivolume < nobj_volumes; ivolume++){ + if(FEM_SGH_->simparam->optimization_options.optimization_objective_regions(ivolume).contains(current_node_coords)){ + contained = true; + } + } + if(contained){ + for (size_t dim = 0; dim < num_dim; dim++) { + // midpoint integration approximation + ke += (node_velocities_interface(node_gid, dim) + previous_node_velocities_interface(node_gid, dim)) * + (node_velocities_interface(node_gid, dim) + previous_node_velocities_interface(node_gid, dim)) / 4; // 1/2 at end + } // end for + } + + if (num_dim == 2) { + KE_loc_sum += node_mass(node_gid) * node_coords(rk_level, node_gid, 1) * ke; + } + else{ + KE_loc_sum += node_mass(node_gid) * ke; + } + }, KE_sum); + } + else{ + REDUCE_SUM_CLASS(node_gid, 0, nlocal_nodes, KE_loc_sum, { + double ke = 0; + for (size_t dim = 0; dim < num_dim; dim++) { + // midpoint integration approximation + ke += (node_velocities_interface(node_gid, dim) + previous_node_velocities_interface(node_gid, dim)) * + (node_velocities_interface(node_gid, dim) + previous_node_velocities_interface(node_gid, dim)) / 4; // 1/2 at end + } // end for + + if (num_dim == 2) { + KE_loc_sum += node_mass(node_gid) * node_coords(rk_level, node_gid, 1) * ke; + } + else{ + KE_loc_sum += node_mass(node_gid) * ke; + } + }, KE_sum); + } + Kokkos::fence(); + KE_sum = 0.5 * KE_sum; + objective_accumulation += KE_sum * dt; + } + /* -------------------------------------------------------------------------------------- Update objective value with the current design variable vector, z ----------------------------------------------------------------------------------------- */ From 05ea48065b49d949a5633b567734079a94eb9833 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CAdrian-Diaz=E2=80=9D?= <“adriandiaz1117@gmail.com”> Date: Tue, 13 Aug 2024 14:12:16 -0600 Subject: [PATCH 04/33] BUG: dont use host class pointer in device kernel --- .../Topology_Optimization/Kinetic_Energy_Minimize.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Kinetic_Energy_Minimize.h b/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Kinetic_Energy_Minimize.h index 0b6c81581..49eed273e 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Kinetic_Energy_Minimize.h +++ b/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Kinetic_Energy_Minimize.h @@ -385,10 +385,10 @@ typedef MV::dual_view_type dual_vec_array; double KE_sum = 0.0; double KE_loc_sum = 0.0; - // extensive KE if(FEM_SGH_->simparam->optimization_options.optimization_objective_regions.size()){ int nobj_volumes = FEM_SGH_->simparam->optimization_options.optimization_objective_regions.size(); + auto optimization_objective_regions = FEM_SGH_->simparam->optimization_options.optimization_objective_regions; const_vec_array all_initial_node_coords = FEM_SGH_->all_initial_node_coords_distributed->getLocalView(Tpetra::Access::ReadOnly); REDUCE_SUM_CLASS(node_gid, 0, nlocal_nodes, KE_loc_sum, { double ke = 0; @@ -398,7 +398,7 @@ typedef MV::dual_view_type dual_vec_array; current_node_coords[1] = all_initial_node_coords(node_gid, 1); current_node_coords[2] = all_initial_node_coords(node_gid, 2); for(int ivolume = 0; ivolume < nobj_volumes; ivolume++){ - if(FEM_SGH_->simparam->optimization_options.optimization_objective_regions(ivolume).contains(current_node_coords)){ + if(optimization_objective_regions(ivolume).contains(current_node_coords)){ contained = true; } } From 8f48419d7663326eb1d9d3e0d731648fa4e7b0d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CAdrian-Diaz=E2=80=9D?= <“adriandiaz1117@gmail.com”> Date: Thu, 15 Aug 2024 01:15:16 -0600 Subject: [PATCH 05/33] WIP: refactor adjoint equations for generic objective --- src/Parallel-Solvers/FEA_Module.h | 4 ++ .../Fierro_Optimization_Objective.hpp | 10 ++++ .../SGH_Solver/src/FEA_Module_SGH.cpp | 2 +- .../SGH_Solver/src/sgh_optimization.cpp | 52 +++++++++++++------ 4 files changed, 51 insertions(+), 17 deletions(-) diff --git a/src/Parallel-Solvers/FEA_Module.h b/src/Parallel-Solvers/FEA_Module.h index 954ec2119..ecd33b2ad 100644 --- a/src/Parallel-Solvers/FEA_Module.h +++ b/src/Parallel-Solvers/FEA_Module.h @@ -67,6 +67,7 @@ class Problem; } // namespace ROL class Simulation_Parameters; +class FierroOptimizationObjective; enum class FEA_MODULE_TYPE; enum class BOUNDARY_TYPE; @@ -349,6 +350,9 @@ class FEA_Module // patch ids in bdy set size_t num_bdy_sets; DynamicRaggedRightArrayKokkos bdy_patches_in_set; + + //optimization data + FierroOptimizationObjective* objective_function; }; #endif // end HEADER_H diff --git a/src/Parallel-Solvers/Optimization_Modules/Fierro_Optimization_Objective.hpp b/src/Parallel-Solvers/Optimization_Modules/Fierro_Optimization_Objective.hpp index 6aad228bf..0bd516100 100644 --- a/src/Parallel-Solvers/Optimization_Modules/Fierro_Optimization_Objective.hpp +++ b/src/Parallel-Solvers/Optimization_Modules/Fierro_Optimization_Objective.hpp @@ -134,6 +134,16 @@ class FierroOptimizationObjective : public ROL::Objective { objective_accumulation = global_objective_accumulation; } + + //NOTE: these functions assign for every component of the gradient vector + //contributes to rate of change of adjoint vector due to term with velocity gradient of objective + virtual void velocity_gradient_adjoint_contribution(vec_array& adjoint_rate_vector){} + + //contributes to rate of change of adjoint vector due to term with displacement gradient of objective + virtual void displacement_gradient_adjoint_contribution(vec_array& adjoint_rate_vector){} + + //contributes to rate of change of adjoint vector due to term with specific internal energy gradient of objective + virtual void sie_gradient_adjoint_contribution(vec_array& adjoint_rate_vector){} }; // class ObjectiveMMA diff --git a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/FEA_Module_SGH.cpp b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/FEA_Module_SGH.cpp index 7d4a5d69b..1a429d02a 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/FEA_Module_SGH.cpp +++ b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/FEA_Module_SGH.cpp @@ -926,7 +926,7 @@ void FEA_Module_SGH::sgh_solve() std::vector> FEA_Module_My_TO_Modules = simparam->FEA_Module_My_TO_Modules; problem = Explicit_Solver_Pointer_->problem; // Pointer to ROL optimization problem object ROL::Ptr> obj_pointer; - FierroOptimizationObjective* objective_function; + bool topology_optimization_on = simparam->topology_optimization_on; bool shape_optimization_on = simparam->shape_optimization_on; bool use_solve_checkpoints = simparam->optimization_options.use_solve_checkpoints; diff --git a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp index c1c68234a..4b47a9403 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp +++ b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp @@ -915,10 +915,10 @@ void FEA_Module_SGH::compute_topology_optimization_adjoint_full(Teuchos::RCPvelocity_gradient_adjoint_contribution(midpoint_adjoint_vector); + FOR_ALL_CLASS(node_gid, 0, nlocal_nodes, { + real_t rate_of_change; + for (int idim = 0; idim < num_dim; idim++) { + rate_of_change = midpoint_adjoint_vector(node_gid, idim); + midpoint_adjoint_vector(node_gid, idim) = -rate_of_change * global_dt / node_mass(node_gid)/ 2 + previous_adjoint_vector(node_gid, idim); + } + }); // end parallel for + Kokkos::fence(); + // half step update for RK2 scheme; EQUATION 2 FOR_ALL_CLASS(node_gid, 0, nlocal_nodes, { real_t rate_of_change; @@ -1257,10 +1267,10 @@ void FEA_Module_SGH::compute_topology_optimization_adjoint_full(Teuchos::RCPvelocity_gradient_adjoint_contribution(current_adjoint_vector); + FOR_ALL_CLASS(node_gid, 0, nlocal_nodes, { + real_t rate_of_change; + for (int idim = 0; idim < num_dim; idim++) { + rate_of_change = current_adjoint_vector(node_gid, idim); + current_adjoint_vector(node_gid, idim) = -rate_of_change * global_dt / node_mass(node_gid) + previous_adjoint_vector(node_gid, idim); + } + }); // end parallel for + Kokkos::fence(); + // full step update with midpoint gradient for RK2 scheme; EQUATION 2 FOR_ALL_CLASS(node_gid, 0, nlocal_nodes, { real_t rate_of_change; From 03bd8b6a65f1d24a0004ad9a9f8b5e10a3bac7ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CAdrian-Diaz=E2=80=9D?= <“adriandiaz1117@gmail.com”> Date: Thu, 15 Aug 2024 12:18:45 -0600 Subject: [PATCH 06/33] WIP: refactor adjoint for generic objective --- .../Fierro_Optimization_Objective.hpp | 15 ++++- .../SGH_Solver/src/sgh_optimization.cpp | 67 +++++++++---------- .../Kinetic_Energy_Minimize.h | 16 +++++ 3 files changed, 60 insertions(+), 38 deletions(-) diff --git a/src/Parallel-Solvers/Optimization_Modules/Fierro_Optimization_Objective.hpp b/src/Parallel-Solvers/Optimization_Modules/Fierro_Optimization_Objective.hpp index 0bd516100..25928162b 100644 --- a/src/Parallel-Solvers/Optimization_Modules/Fierro_Optimization_Objective.hpp +++ b/src/Parallel-Solvers/Optimization_Modules/Fierro_Optimization_Objective.hpp @@ -137,13 +137,22 @@ class FierroOptimizationObjective : public ROL::Objective { //NOTE: these functions assign for every component of the gradient vector //contributes to rate of change of adjoint vector due to term with velocity gradient of objective - virtual void velocity_gradient_adjoint_contribution(vec_array& adjoint_rate_vector){} + virtual void velocity_gradient_adjoint_contribution(vec_array& adjoint_rate_vector, const DViewCArrayKokkos& node_mass, + const DViewCArrayKokkos& elem_mass, const DViewCArrayKokkos& node_vel, + const DViewCArrayKokkos& node_coords, const DViewCArrayKokkos& elem_sie, + const size_t& rk_level){} //contributes to rate of change of adjoint vector due to term with displacement gradient of objective - virtual void displacement_gradient_adjoint_contribution(vec_array& adjoint_rate_vector){} + virtual void displacement_gradient_adjoint_contribution(vec_array& adjoint_rate_vector, const DViewCArrayKokkos& node_mass, + const DViewCArrayKokkos& elem_mass, const DViewCArrayKokkos& node_vel, + const DViewCArrayKokkos& node_coords, const DViewCArrayKokkos& elem_sie, + const size_t& rk_level){} //contributes to rate of change of adjoint vector due to term with specific internal energy gradient of objective - virtual void sie_gradient_adjoint_contribution(vec_array& adjoint_rate_vector){} + virtual void sie_gradient_adjoint_contribution(vec_array& adjoint_rate_vector, const DViewCArrayKokkos& node_mass, + const DViewCArrayKokkos& elem_mass, const DViewCArrayKokkos& node_vel, + const DViewCArrayKokkos& node_coords, const DViewCArrayKokkos& elem_sie, + const size_t& rk_level){} }; // class ObjectiveMMA diff --git a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp index 4b47a9403..9358339e8 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp +++ b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp @@ -674,7 +674,7 @@ void FEA_Module_SGH::compute_topology_optimization_adjoint_full(Teuchos::RCPgetLocalView(Tpetra::Access::ReadOnly); psi_previous_adjoint_vector = (*psi_adjoint_vector_data)[cycle + 1]->getLocalView(Tpetra::Access::ReadOnly); } + + adjoint_vector_distributed->putScalar(0); + phi_adjoint_vector_distributed->putScalar(0); + psi_adjoint_vector_distributed->putScalar(0); vec_array midpoint_adjoint_vector = adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadWrite); vec_array phi_midpoint_adjoint_vector = phi_adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadWrite); vec_array psi_midpoint_adjoint_vector = psi_adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadWrite); + // half step update for RK2 scheme; EQUATION 1 + objective_function->velocity_gradient_adjoint_contribution(midpoint_adjoint_vector, node_mass, elem_mass, node_vel, node_coords, elem_sie, rk_level); + if(optimization_objective_regions.size()){ int nobj_volumes = optimization_objective_regions.size(); const_vec_array all_initial_node_coords = all_initial_node_coords_distributed->getLocalView(Tpetra::Access::ReadOnly); @@ -915,10 +922,10 @@ void FEA_Module_SGH::compute_topology_optimization_adjoint_full(Teuchos::RCPvelocity_gradient_adjoint_contribution(midpoint_adjoint_vector); - FOR_ALL_CLASS(node_gid, 0, nlocal_nodes, { - real_t rate_of_change; - for (int idim = 0; idim < num_dim; idim++) { - rate_of_change = midpoint_adjoint_vector(node_gid, idim); - midpoint_adjoint_vector(node_gid, idim) = -rate_of_change * global_dt / node_mass(node_gid)/ 2 + previous_adjoint_vector(node_gid, idim); - } - }); // end parallel for - Kokkos::fence(); - // half step update for RK2 scheme; EQUATION 2 + objective_function->displacement_gradient_adjoint_contribution(phi_midpoint_adjoint_vector, node_mass, elem_mass, node_vel, node_coords, elem_sie, rk_level); FOR_ALL_CLASS(node_gid, 0, nlocal_nodes, { real_t rate_of_change; real_t matrix_contribution; @@ -982,9 +980,9 @@ void FEA_Module_SGH::compute_topology_optimization_adjoint_full(Teuchos::RCPdescribe(*fos,Teuchos::VERB_EXTREME); // half step update for RK2 scheme; EQUATION 3 + objective_function->sie_gradient_adjoint_contribution(psi_midpoint_adjoint_vector, node_mass, elem_mass, node_vel, node_coords, elem_sie, rk_level); FOR_ALL_CLASS(elem_gid, 0, rnum_elem, { real_t rate_of_change; real_t matrix_contribution; @@ -1004,9 +1003,9 @@ void FEA_Module_SGH::compute_topology_optimization_adjoint_full(Teuchos::RCPputScalar(0); + phi_adjoint_vector_distributed->putScalar(0); + psi_adjoint_vector_distributed->putScalar(0); vec_array current_adjoint_vector = adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadWrite); vec_array phi_current_adjoint_vector = phi_adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadWrite); vec_array psi_current_adjoint_vector = psi_adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadWrite); + if(use_solve_checkpoints){ midpoint_adjoint_vector = midpoint_adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadWrite); phi_midpoint_adjoint_vector = midpoint_phi_adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadWrite); @@ -1232,6 +1235,7 @@ void FEA_Module_SGH::compute_topology_optimization_adjoint_full(Teuchos::RCPCPU_Time(); // full step update with midpoint gradient for RK2 scheme; EQUATION 1 + objective_function->velocity_gradient_adjoint_contribution(current_adjoint_vector, node_mass, elem_mass, node_vel, node_coords, elem_sie, rk_level); if(optimization_objective_regions.size()){ int nobj_volumes = optimization_objective_regions.size(); const_vec_array all_initial_node_coords = all_initial_node_coords_distributed->getLocalView(Tpetra::Access::ReadOnly); @@ -1267,10 +1271,10 @@ void FEA_Module_SGH::compute_topology_optimization_adjoint_full(Teuchos::RCPvelocity_gradient_adjoint_contribution(current_adjoint_vector); - FOR_ALL_CLASS(node_gid, 0, nlocal_nodes, { - real_t rate_of_change; - for (int idim = 0; idim < num_dim; idim++) { - rate_of_change = current_adjoint_vector(node_gid, idim); - current_adjoint_vector(node_gid, idim) = -rate_of_change * global_dt / node_mass(node_gid) + previous_adjoint_vector(node_gid, idim); - } - }); // end parallel for - Kokkos::fence(); // full step update with midpoint gradient for RK2 scheme; EQUATION 2 + objective_function->displacement_gradient_adjoint_contribution(phi_current_adjoint_vector, node_mass, elem_mass, node_vel, node_coords, elem_sie, rk_level); FOR_ALL_CLASS(node_gid, 0, nlocal_nodes, { real_t rate_of_change; real_t matrix_contribution; @@ -1336,7 +1332,7 @@ void FEA_Module_SGH::compute_topology_optimization_adjoint_full(Teuchos::RCPsie_gradient_adjoint_contribution(psi_current_adjoint_vector, node_mass, elem_mass, node_vel, node_coords, elem_sie, rk_level); FOR_ALL_CLASS(elem_gid, 0, rnum_elem, { real_t rate_of_change; real_t matrix_contribution; @@ -1356,10 +1353,10 @@ void FEA_Module_SGH::compute_topology_optimization_adjoint_full(Teuchos::RCPmyrank << std::endl; } + + //contributes to rate of change of adjoint vector due to term with velocity gradient of objective + void velocity_gradient_adjoint_contribution(vec_array& adjoint_rate_vector, const DViewCArrayKokkos& node_mass, + const DViewCArrayKokkos& elem_mass, const DViewCArrayKokkos& node_vel, + const DViewCArrayKokkos& node_coords, const DViewCArrayKokkos& elem_sie, + const size_t& rk_level){ + + + FOR_ALL_CLASS(node_gid, 0, nlocal_nodes, { + for (int idim = 0; idim < num_dim; idim++) { + adjoint_rate_vector(node_gid, idim) = node_mass(node_gid)*node_vel(rk_level, node_gid, idim); + } + }); // end parallel for + Kokkos::fence(); + } + }; #endif // end header guard From a76b0066de8ee031cd53c6f648a459b221dcb2ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CAdrian-Diaz=E2=80=9D?= <“adriandiaz1117@gmail.com”> Date: Thu, 15 Aug 2024 20:43:05 -0600 Subject: [PATCH 07/33] BUG: use midpoint evaluation --- .../SGH_Solver/src/sgh_optimization.cpp | 330 +++++------------- 1 file changed, 93 insertions(+), 237 deletions(-) diff --git a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp index 9358339e8..7d8a39ce0 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp +++ b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp @@ -674,119 +674,117 @@ void FEA_Module_SGH::compute_topology_optimization_adjoint_full(Teuchos::RCP::iterator last_checkpoint = dynamic_checkpoint_set->end(); - --last_checkpoint; - previous_velocity_vector = previous_node_velocities_distributed->getLocalView(Tpetra::Access::ReadOnly); - previous_coordinate_vector = previous_node_coords_distributed->getLocalView(Tpetra::Access::ReadOnly); - previous_element_internal_energy = previous_element_internal_energy_distributed->getLocalView(Tpetra::Access::ReadOnly); - current_velocity_vector = last_checkpoint->get_vector_pointer(V_DATA)->getLocalView(Tpetra::Access::ReadOnly); - current_coordinate_vector = last_checkpoint->get_vector_pointer(U_DATA)->getLocalView(Tpetra::Access::ReadOnly); - current_element_internal_energy = last_checkpoint->get_vector_pointer(SIE_DATA)->getLocalView(Tpetra::Access::ReadOnly); - - } - else{ - previous_velocity_vector = (*forward_solve_velocity_data)[cycle + 1]->getLocalView(Tpetra::Access::ReadOnly); - current_velocity_vector = (*forward_solve_velocity_data)[cycle]->getLocalView(Tpetra::Access::ReadOnly); - - previous_coordinate_vector = (*forward_solve_coordinate_data)[cycle + 1]->getLocalView(Tpetra::Access::ReadOnly); - current_coordinate_vector = (*forward_solve_coordinate_data)[cycle]->getLocalView(Tpetra::Access::ReadOnly); - - previous_element_internal_energy = (*forward_solve_internal_energy_data)[cycle + 1]->getLocalView(Tpetra::Access::ReadOnly); - current_element_internal_energy = (*forward_solve_internal_energy_data)[cycle]->getLocalView(Tpetra::Access::ReadOnly); - } - - // interface of arrays for current implementation of force calculation - - FOR_ALL_CLASS(node_gid, 0, nlocal_nodes + nghost_nodes, { - for (int idim = 0; idim < num_dim; idim++) { - node_vel(rk_level, node_gid, idim) = current_velocity_vector(node_gid, idim); - node_coords(rk_level, node_gid, idim) = current_coordinate_vector(node_gid, idim); - } - }); - Kokkos::fence(); - - FOR_ALL_CLASS(elem_gid, 0, rnum_elem, { - elem_sie(rk_level, elem_gid) = current_element_internal_energy(elem_gid, 0); - }); - Kokkos::fence(); - - // set state according to phase data at this timestep - get_vol(); - - // ---- Calculate velocity diveregence for the element ---- - if (num_dim == 2) { - get_divergence2D(elem_div, - node_coords, - node_vel, - elem_vol); - } - else{ - get_divergence(elem_div, - node_coords, - node_vel, - elem_vol); - } // end if 2D - - // ---- Calculate elem state (den, pres, sound speed, stress) for next time step ---- - if (num_dim == 2) { - update_state2D(material, - *mesh, - node_coords, - node_vel, - elem_den, - elem_pres, - elem_stress, - elem_sspd, - elem_sie, - elem_vol, - elem_mass, - elem_mat_id, - 1.0, - cycle); - } - else{ - update_state(material, - *mesh, - node_coords, - node_vel, - elem_den, - elem_pres, - elem_stress, - elem_sspd, - elem_sie, - elem_vol, - elem_mass, - elem_mat_id, - 1.0, - cycle); - } - - if (num_dim == 2) { - get_force_sgh2D(material, - *mesh, - node_coords, - node_vel, - elem_den, - elem_sie, - elem_pres, - elem_stress, - elem_sspd, - elem_vol, - elem_div, - elem_mat_id, - corner_force, - 1.0, - cycle); - } - else{ - get_force_sgh(material, - *mesh, - node_coords, - node_vel, - elem_den, - elem_sie, - elem_pres, - elem_stress, - elem_sspd, - elem_vol, - elem_div, - elem_mat_id, - corner_force, - 1.0, - cycle); - } - - if (have_loading_conditions) { - applied_forces(material, - *mesh, - node_coords, - node_vel, - node_mass, - elem_den, - elem_vol, - elem_div, - elem_mat_id, - corner_force, - 1.0, - cycle); - } //state_adjoint_time_start = Explicit_Solver_Pointer_->CPU_Time(); get_force_dgradient_sgh(material, @@ -1943,15 +1795,19 @@ void FEA_Module_SGH::compute_topology_optimization_gradient_tally(Teuchos::RCPgetLocalView(Tpetra::Access::ReadOnly); current_psi_adjoint_vector = psi_adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadOnly); + previous_adjoint_vector = previous_adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadOnly); + previous_psi_adjoint_vector = previous_psi_adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadOnly); } else{ current_adjoint_vector = (*adjoint_vector_data)[cycle]->getLocalView(Tpetra::Access::ReadOnly); current_psi_adjoint_vector = (*psi_adjoint_vector_data)[cycle]->getLocalView(Tpetra::Access::ReadOnly); + previous_adjoint_vector = (*adjoint_vector_data)[cycle+1]->getLocalView(Tpetra::Access::ReadOnly); + previous_psi_adjoint_vector = (*psi_adjoint_vector_data)[cycle+1]->getLocalView(Tpetra::Access::ReadOnly); } // derivatives of forces at corners stored in corner_vector_storage buffer by previous routine FOR_ALL_CLASS(elem_id, 0, rnum_elem, { @@ -1964,7 +1820,7 @@ void FEA_Module_SGH::compute_topology_optimization_gradient_tally(Teuchos::RCP Date: Mon, 19 Aug 2024 11:49:38 -0600 Subject: [PATCH 08/33] BUG: ensure t0 for IVP gradient contribution --- .../SGH_Solver/include/FEA_Module_SGH.h | 3 + .../SGH_Solver/src/sgh_optimization.cpp | 713 +++++++++++------- 2 files changed, 436 insertions(+), 280 deletions(-) diff --git a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/include/FEA_Module_SGH.h b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/include/FEA_Module_SGH.h index f0aa4ba94..2d567d597 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/include/FEA_Module_SGH.h +++ b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/include/FEA_Module_SGH.h @@ -505,6 +505,9 @@ class FEA_Module_SGH : public FEA_Module void compute_topology_optimization_gradient_tally(Teuchos::RCP design_densities_distributed, Teuchos::RCP design_gradients_distributed, unsigned long cycle, real_t global_dt); + void compute_topology_optimization_gradient_IVP(Teuchos::RCP design_densities_distributed, Teuchos::RCP design_gradients_distributed, + unsigned long cycle, real_t global_dt); + void boundary_adjoint(const mesh_t& mesh, const DCArrayKokkos& boundary, vec_array& node_adjoint, diff --git a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp index 7d8a39ce0..160c9d473 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp +++ b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp @@ -1404,6 +1404,132 @@ void FEA_Module_SGH::compute_topology_optimization_adjoint_full(Teuchos::RCPCPU_Time(); //state_adjoint_time += state_adjoint_time_end-state_adjoint_time_start; compute_topology_optimization_gradient_tally(design_densities_distributed, cached_design_gradients_distributed, cycle, global_dt); + + if(cycle==0){ + std::set::iterator last_checkpoint = dynamic_checkpoint_set->end(); + --last_checkpoint; + const_vec_array current_velocity_vector = last_checkpoint->get_vector_pointer(V_DATA)->getLocalView(Tpetra::Access::ReadOnly); + const_vec_array current_coordinate_vector = last_checkpoint->get_vector_pointer(U_DATA)->getLocalView(Tpetra::Access::ReadOnly); + const_vec_array current_element_internal_energy = last_checkpoint->get_vector_pointer(SIE_DATA)->getLocalView(Tpetra::Access::ReadOnly); + + // compute gradients at midpoint + FOR_ALL_CLASS(node_gid, 0, nlocal_nodes + nghost_nodes, { + for (int idim = 0; idim < num_dim; idim++) { + node_vel(rk_level, node_gid, idim) = current_velocity_vector(node_gid, idim); + node_coords(rk_level, node_gid, idim) = current_coordinate_vector(node_gid, idim); + } + }); + Kokkos::fence(); + + FOR_ALL_CLASS(elem_gid, 0, rnum_elem, { + elem_sie(rk_level, elem_gid) = current_element_internal_energy(elem_gid, 0); + }); + Kokkos::fence(); + + // state_adjoint_time_end = Explicit_Solver_Pointer_->CPU_Time(); + // state_adjoint_time += state_adjoint_time_end-state_adjoint_time_start; + // set state according to phase data at this timestep + get_vol(); + + // ---- Calculate velocity diveregence for the element ---- + if (num_dim == 2) { + get_divergence2D(elem_div, + node_coords, + node_vel, + elem_vol); + } + else{ + get_divergence(elem_div, + node_coords, + node_vel, + elem_vol); + } // end if 2D + + // ---- Calculate elem state (den, pres, sound speed, stress) for next time step ---- + if (num_dim == 2) { + update_state2D(material, + *mesh, + node_coords, + node_vel, + elem_den, + elem_pres, + elem_stress, + elem_sspd, + elem_sie, + elem_vol, + elem_mass, + elem_mat_id, + 1.0, + cycle); + } + else{ + update_state(material, + *mesh, + node_coords, + node_vel, + elem_den, + elem_pres, + elem_stress, + elem_sspd, + elem_sie, + elem_vol, + elem_mass, + elem_mat_id, + 1.0, + cycle); + } + + if (num_dim == 2) { + get_force_sgh2D(material, + *mesh, + node_coords, + node_vel, + elem_den, + elem_sie, + elem_pres, + elem_stress, + elem_sspd, + elem_vol, + elem_div, + elem_mat_id, + corner_force, + 1.0, + cycle); + } + else{ + get_force_sgh(material, + *mesh, + node_coords, + node_vel, + elem_den, + elem_sie, + elem_pres, + elem_stress, + elem_sspd, + elem_vol, + elem_div, + elem_mat_id, + corner_force, + 1.0, + cycle); + } + + if (have_loading_conditions) { + applied_forces(material, + *mesh, + node_coords, + node_vel, + node_mass, + elem_den, + elem_vol, + elem_div, + elem_mat_id, + corner_force, + 1.0, + cycle); + } + compute_topology_optimization_gradient_IVP(design_densities_distributed, cached_design_gradients_distributed, cycle, global_dt); + } } if(use_solve_checkpoints){ @@ -1438,7 +1564,6 @@ void FEA_Module_SGH::compute_topology_optimization_gradient_tally(Teuchos::RCPnum_bdy_nodes; const DCArrayKokkos boundary = module_params->boundary; - const DCArrayKokkos material = simparam->material; const int num_dim = simparam->num_dims; int num_corners = rnum_elem * num_nodes_in_elem; bool element_constant_density = true; @@ -1451,144 +1576,29 @@ void FEA_Module_SGH::compute_topology_optimization_gradient_tally(Teuchos::RCPgetLocalView(Tpetra::Access::ReadWrite); const_vec_array design_densities = design_densities_distributed->getLocalView(Tpetra::Access::ReadOnly); - // view scope - { - - const_vec_array current_velocity_vector; - const_vec_array next_velocity_vector; - if(use_solve_checkpoints){ - //note that these are assigned backwards because the adjoint loop progresses backwards - current_velocity_vector = all_node_velocities_distributed->getLocalView(Tpetra::Access::ReadOnly); - next_velocity_vector = previous_node_velocities_distributed->getLocalView(Tpetra::Access::ReadOnly); - } - else{ - current_velocity_vector = (*forward_solve_velocity_data)[cycle]->getLocalView(Tpetra::Access::ReadOnly); - next_velocity_vector = (*forward_solve_velocity_data)[cycle + 1]->getLocalView(Tpetra::Access::ReadOnly); - } - if(simparam->optimization_options.optimization_objective_regions.size()){ - int nobj_volumes = simparam->optimization_options.optimization_objective_regions.size(); - const_vec_array all_initial_node_coords = all_initial_node_coords_distributed->getLocalView(Tpetra::Access::ReadOnly); - FOR_ALL_CLASS(elem_id, 0, rnum_elem, { - size_t node_id; - size_t corner_id; - real_t inner_product; - // std::cout << elem_mass(elem_id) <optimization_options.optimization_objective_regions(ivolume).contains(current_node_coords)){ - contained = true; - } - } - if(contained){ - for (int idim = 0; idim < num_dim; idim++) { - inner_product += elem_mass(elem_id) * current_element_velocities(ifill, idim) * current_element_velocities(ifill, idim); - } - } - } - - for (int inode = 0; inode < num_nodes_in_elem; inode++) { - // compute gradient of local element contribution to v^t*M*v product - corner_id = elem_id * num_nodes_in_elem + inode; - // division by design ratio recovers nominal element mass used in the gradient operator - corner_value_storage(corner_id) = inner_product * global_dt / relative_element_densities(elem_id); - } - }); // end parallel for - Kokkos::fence(); - } - else{ - FOR_ALL_CLASS(elem_id, 0, rnum_elem, { - size_t node_id; - size_t corner_id; - real_t inner_product; - // std::cout << elem_mass(elem_id) <getLocalView(Tpetra::Access::ReadOnly); - current_adjoint_vector = all_adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadOnly); - next_velocity_vector = previous_node_velocities_distributed->getLocalView(Tpetra::Access::ReadOnly); - next_adjoint_vector = previous_adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadOnly); - } - else{ - current_velocity_vector = (*forward_solve_velocity_data)[cycle]->getLocalView(Tpetra::Access::ReadOnly); - current_adjoint_vector = (*adjoint_vector_data)[cycle]->getLocalView(Tpetra::Access::ReadOnly); - next_velocity_vector = (*forward_solve_velocity_data)[cycle + 1]->getLocalView(Tpetra::Access::ReadOnly); - next_adjoint_vector = (*adjoint_vector_data)[cycle + 1]->getLocalView(Tpetra::Access::ReadOnly); - } - + // view scope + { + + const_vec_array current_velocity_vector; + const_vec_array next_velocity_vector; + if(use_solve_checkpoints){ + //note that these are assigned backwards because the adjoint loop progresses backwards + current_velocity_vector = all_node_velocities_distributed->getLocalView(Tpetra::Access::ReadOnly); + next_velocity_vector = previous_node_velocities_distributed->getLocalView(Tpetra::Access::ReadOnly); + } + else{ + current_velocity_vector = (*forward_solve_velocity_data)[cycle]->getLocalView(Tpetra::Access::ReadOnly); + next_velocity_vector = (*forward_solve_velocity_data)[cycle + 1]->getLocalView(Tpetra::Access::ReadOnly); + } + if(simparam->optimization_options.optimization_objective_regions.size()){ + int nobj_volumes = simparam->optimization_options.optimization_objective_regions.size(); + const_vec_array all_initial_node_coords = all_initial_node_coords_distributed->getLocalView(Tpetra::Access::ReadOnly); FOR_ALL_CLASS(elem_id, 0, rnum_elem, { - real_t lambda_dot_current; - real_t lambda_dot_next; size_t node_id; size_t corner_id; real_t inner_product; // std::cout << elem_mass(elem_id) <optimization_options.optimization_objective_regions(ivolume).contains(current_node_coords)){ + contained = true; + } + } + if(contained){ + for (int idim = 0; idim < num_dim; idim++) { + inner_product += elem_mass(elem_id) * current_element_velocities(ifill, idim) * current_element_velocities(ifill, idim); + } } } for (int inode = 0; inode < num_nodes_in_elem; inode++) { // compute gradient of local element contribution to v^t*M*v product corner_id = elem_id * num_nodes_in_elem + inode; + // division by design ratio recovers nominal element mass used in the gradient operator corner_value_storage(corner_id) = inner_product * global_dt / relative_element_densities(elem_id); } }); // end parallel for Kokkos::fence(); - - // accumulate node values from corner storage - // multiply - FOR_ALL_CLASS(node_id, 0, nlocal_nodes, { - size_t corner_id; - for (int icorner = 0; icorner < num_corners_in_node(node_id); icorner++) { - corner_id = corners_in_node(node_id, icorner); - design_gradients(node_id, 0) += -corner_value_storage(corner_id) / (double)num_nodes_in_elem / (double)num_nodes_in_elem; - } - }); // end parallel for - Kokkos::fence(); - } // end view scope - - // compute adjoint vector for this data point; use velocity midpoint - // view scope - { - const_vec_array current_element_internal_energy; - const_vec_array current_psi_adjoint_vector; - const_vec_array next_element_internal_energy; - const_vec_array next_psi_adjoint_vector; - if(use_solve_checkpoints){ - //note that these are assigned backwards because the adjoint loop progresses backwards - current_element_internal_energy = element_internal_energy_distributed->getLocalView(Tpetra::Access::ReadOnly); - current_psi_adjoint_vector = psi_adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadOnly); - next_element_internal_energy = previous_element_internal_energy_distributed->getLocalView(Tpetra::Access::ReadOnly); - next_psi_adjoint_vector = previous_psi_adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadOnly); - } - else{ - current_element_internal_energy = (*forward_solve_internal_energy_data)[cycle]->getLocalView(Tpetra::Access::ReadOnly); - current_psi_adjoint_vector = (*psi_adjoint_vector_data)[cycle]->getLocalView(Tpetra::Access::ReadOnly); - next_element_internal_energy = (*forward_solve_internal_energy_data)[cycle + 1]->getLocalView(Tpetra::Access::ReadOnly); - next_psi_adjoint_vector = (*psi_adjoint_vector_data)[cycle + 1]->getLocalView(Tpetra::Access::ReadOnly); - } - - FOR_ALL_CLASS(elem_id, 0, rnum_elem, { - real_t psi_dot_current; - real_t psi_dot_next; - size_t node_id; - size_t corner_id; - real_t inner_product; - - psi_dot_current = (next_psi_adjoint_vector(elem_id, 0) - current_psi_adjoint_vector(elem_id, 0)) / global_dt; - inner_product = elem_mass(elem_id) * (psi_dot_current + psi_dot_current) * current_element_internal_energy(elem_id, 0) / 2; - - for (int inode = 0; inode < num_nodes_in_elem; inode++) { - // compute gradient of local element contribution to v^t*M*v product - corner_id = elem_id * num_nodes_in_elem + inode; - corner_value_storage(corner_id) = inner_product * global_dt / relative_element_densities(elem_id); - } - }); // end parallel for - Kokkos::fence(); - - // accumulate node values from corner storage - // multiply - FOR_ALL_CLASS(node_id, 0, nlocal_nodes, { - size_t corner_id; - for (int icorner = 0; icorner < num_corners_in_node(node_id); icorner++) { - corner_id = corners_in_node(node_id, icorner); - design_gradients(node_id, 0) += -corner_value_storage(corner_id) / (double)num_nodes_in_elem; - } - }); // end parallel for - Kokkos::fence(); - } // end view scope - - if(cycle==0){ - // compute initial condition contribution from velocities - // view scope - { - const_vec_array current_velocity_vector; - const_vec_array current_adjoint_vector; - if(use_solve_checkpoints){ - current_velocity_vector = all_node_velocities_distributed->getLocalView(Tpetra::Access::ReadOnly); - current_adjoint_vector = all_adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadOnly); - } - else{ - current_velocity_vector = (*forward_solve_velocity_data)[0]->getLocalView(Tpetra::Access::ReadOnly); - current_adjoint_vector = (*adjoint_vector_data)[0]->getLocalView(Tpetra::Access::ReadOnly); - } - + } + else{ FOR_ALL_CLASS(elem_id, 0, rnum_elem, { - real_t lambda_dot; size_t node_id; size_t corner_id; real_t inner_product; // std::cout << elem_mass(elem_id) <getLocalView(Tpetra::Access::ReadOnly); + current_adjoint_vector = all_adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadOnly); + next_velocity_vector = previous_node_velocities_distributed->getLocalView(Tpetra::Access::ReadOnly); + next_adjoint_vector = previous_adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadOnly); + } + else{ + current_velocity_vector = (*forward_solve_velocity_data)[cycle]->getLocalView(Tpetra::Access::ReadOnly); + current_adjoint_vector = (*adjoint_vector_data)[cycle]->getLocalView(Tpetra::Access::ReadOnly); + next_velocity_vector = (*forward_solve_velocity_data)[cycle + 1]->getLocalView(Tpetra::Access::ReadOnly); + next_adjoint_vector = (*adjoint_vector_data)[cycle + 1]->getLocalView(Tpetra::Access::ReadOnly); + } + + FOR_ALL_CLASS(elem_id, 0, rnum_elem, { + real_t lambda_dot_current; + real_t lambda_dot_next; + size_t node_id; + size_t corner_id; + real_t inner_product; + // std::cout << elem_mass(elem_id) <getLocalView(Tpetra::Access::ReadOnly); - current_psi_adjoint_vector = psi_adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadOnly); + inner_product = 0; + for (int ifill = 0; ifill < num_nodes_in_elem; ifill++) { + node_id = nodes_in_elem(elem_id, ifill); + for (int idim = 0; idim < num_dim; idim++) { + lambda_dot_current = lambda_dot_next = (next_adjoint_vector(node_id, idim) - current_adjoint_vector(node_id, idim)) / global_dt; + // lambda_dot_current = current_velocity_vector(node_id,idim) + damping_constant*current_adjoint_vector(node_id,idim)/node_mass(node_id) - current_phi_adjoint_vector(node_id,idim)/node_mass(node_id); + // lambda_dot_next = next_velocity_vector(node_id,idim) + damping_constant*next_adjoint_vector(node_id,idim)/node_mass(node_id) - next_phi_adjoint_vector(node_id,idim)/node_mass(node_id); + inner_product += elem_mass(elem_id) * (lambda_dot_current + lambda_dot_current) * current_element_velocities(ifill, idim) / 2; + } } - else{ - current_element_internal_energy = (*forward_solve_internal_energy_data)[0]->getLocalView(Tpetra::Access::ReadOnly); - current_psi_adjoint_vector = (*psi_adjoint_vector_data)[0]->getLocalView(Tpetra::Access::ReadOnly); + + for (int inode = 0; inode < num_nodes_in_elem; inode++) { + // compute gradient of local element contribution to v^t*M*v product + corner_id = elem_id * num_nodes_in_elem + inode; + corner_value_storage(corner_id) = inner_product * global_dt / relative_element_densities(elem_id); } + }); // end parallel for + Kokkos::fence(); - // (*psi_adjoint_vector_data)[100]->describe(*fos,Teuchos::VERB_EXTREME); - FOR_ALL_CLASS(elem_id, 0, rnum_elem, { - real_t lambda_dot; - size_t node_id; - size_t corner_id; - real_t inner_product; - // std::cout << elem_mass(elem_id) <getLocalView(Tpetra::Access::ReadOnly); + current_psi_adjoint_vector = psi_adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadOnly); + next_element_internal_energy = previous_element_internal_energy_distributed->getLocalView(Tpetra::Access::ReadOnly); + next_psi_adjoint_vector = previous_psi_adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadOnly); + } + else{ + current_element_internal_energy = (*forward_solve_internal_energy_data)[cycle]->getLocalView(Tpetra::Access::ReadOnly); + current_psi_adjoint_vector = (*psi_adjoint_vector_data)[cycle]->getLocalView(Tpetra::Access::ReadOnly); + next_element_internal_energy = (*forward_solve_internal_energy_data)[cycle + 1]->getLocalView(Tpetra::Access::ReadOnly); + next_psi_adjoint_vector = (*psi_adjoint_vector_data)[cycle + 1]->getLocalView(Tpetra::Access::ReadOnly); + } - for (int inode = 0; inode < num_nodes_in_elem; inode++) { - // compute gradient of local element contribution to v^t*M*v product - corner_id = elem_id * num_nodes_in_elem + inode; - corner_value_storage(corner_id) = inner_product / relative_element_densities(elem_id); - } - }); // end parallel for - Kokkos::fence(); + FOR_ALL_CLASS(elem_id, 0, rnum_elem, { + real_t psi_dot_current; + real_t psi_dot_next; + size_t node_id; + size_t corner_id; + real_t inner_product; - // accumulate node values from corner storage - // multiply - FOR_ALL_CLASS(node_id, 0, nlocal_nodes, { - size_t corner_id; - for (int icorner = 0; icorner < num_corners_in_node(node_id); icorner++) { - corner_id = corners_in_node(node_id, icorner); - design_gradients(node_id, 0) += -corner_value_storage(corner_id) / (double)num_nodes_in_elem; - } - }); // end parallel for - Kokkos::fence(); - } // end view scope - } + psi_dot_current = (next_psi_adjoint_vector(elem_id, 0) - current_psi_adjoint_vector(elem_id, 0)) / global_dt; + inner_product = elem_mass(elem_id) * (psi_dot_current + psi_dot_current) * current_element_internal_energy(elem_id, 0) / 2; + + for (int inode = 0; inode < num_nodes_in_elem; inode++) { + // compute gradient of local element contribution to v^t*M*v product + corner_id = elem_id * num_nodes_in_elem + inode; + corner_value_storage(corner_id) = inner_product * global_dt / relative_element_densities(elem_id); + } + }); // end parallel for + Kokkos::fence(); + + // accumulate node values from corner storage + // multiply + FOR_ALL_CLASS(node_id, 0, nlocal_nodes, { + size_t corner_id; + for (int icorner = 0; icorner < num_corners_in_node(node_id); icorner++) { + corner_id = corners_in_node(node_id, icorner); + design_gradients(node_id, 0) += -corner_value_storage(corner_id) / (double)num_nodes_in_elem; + } + }); // end parallel for + Kokkos::fence(); + } // end view scope //compute terms with gradient of force and gradient of specific internal energy w.r.t design density // view scope @@ -1873,6 +1888,146 @@ void FEA_Module_SGH::compute_topology_optimization_gradient_tally(Teuchos::RCP design_densities_distributed, + Teuchos::RCP design_gradients_distributed, unsigned long cycle, real_t global_dt) +{ + size_t num_bdy_nodes = mesh->num_bdy_nodes; + const int num_dim = simparam->num_dims; + int num_corners = rnum_elem * num_nodes_in_elem; + bool element_constant_density = true; + size_t current_data_index, next_data_index; + CArrayKokkos current_element_velocities = CArrayKokkos(num_nodes_in_elem, num_dim); + CArrayKokkos current_element_adjoint = CArrayKokkos(num_nodes_in_elem, num_dim); + bool use_solve_checkpoints = simparam->optimization_options.use_solve_checkpoints; + + { // view scope + vec_array design_gradients = design_gradients_distributed->getLocalView(Tpetra::Access::ReadWrite); + const_vec_array design_densities = design_densities_distributed->getLocalView(Tpetra::Access::ReadOnly); + + // compute initial condition contribution from velocities + // view scope + { + const_vec_array current_velocity_vector; + const_vec_array current_adjoint_vector; + if(use_solve_checkpoints){ + current_velocity_vector = all_node_velocities_distributed->getLocalView(Tpetra::Access::ReadOnly); + current_adjoint_vector = all_adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadOnly); + } + else{ + current_velocity_vector = (*forward_solve_velocity_data)[0]->getLocalView(Tpetra::Access::ReadOnly); + current_adjoint_vector = (*adjoint_vector_data)[0]->getLocalView(Tpetra::Access::ReadOnly); + } + + FOR_ALL_CLASS(elem_id, 0, rnum_elem, { + real_t lambda_dot; + size_t node_id; + size_t corner_id; + real_t inner_product; + // std::cout << elem_mass(elem_id) <getLocalView(Tpetra::Access::ReadOnly); + current_psi_adjoint_vector = psi_adjoint_vector_distributed->getLocalView(Tpetra::Access::ReadOnly); + } + else{ + current_element_internal_energy = (*forward_solve_internal_energy_data)[0]->getLocalView(Tpetra::Access::ReadOnly); + current_psi_adjoint_vector = (*psi_adjoint_vector_data)[0]->getLocalView(Tpetra::Access::ReadOnly); + } + + // (*psi_adjoint_vector_data)[100]->describe(*fos,Teuchos::VERB_EXTREME); + FOR_ALL_CLASS(elem_id, 0, rnum_elem, { + real_t lambda_dot; + size_t node_id; + size_t corner_id; + real_t inner_product; + // std::cout << elem_mass(elem_id) < design_densities_distributed, Teuchos::RCP design_gradients_distributed) { size_t num_bdy_nodes = mesh->num_bdy_nodes; - const DCArrayKokkos boundary = module_params->boundary; - const DCArrayKokkos material = simparam->material; const int num_dim = simparam->num_dims; int num_corners = rnum_elem * num_nodes_in_elem; real_t global_dt; From b929245abf81a862d2581c7ca667c7d19589f8a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CAdrian-Diaz=E2=80=9D?= <“adriandiaz1117@gmail.com”> Date: Mon, 19 Aug 2024 21:57:56 -0600 Subject: [PATCH 09/33] ENH: generalize objective gradient term tally --- src/Parallel-Solvers/FEA_Module.h | 2 +- .../Fierro_Optimization_Objective.hpp | 18 +- .../SGH_Solver/src/setup_sgh.cpp | 2 +- .../SGH_Solver/src/sgh_optimization.cpp | 359 ++++++------------ .../Kinetic_Energy_Minimize.h | 120 +++++- 5 files changed, 256 insertions(+), 245 deletions(-) diff --git a/src/Parallel-Solvers/FEA_Module.h b/src/Parallel-Solvers/FEA_Module.h index ecd33b2ad..defd5608a 100644 --- a/src/Parallel-Solvers/FEA_Module.h +++ b/src/Parallel-Solvers/FEA_Module.h @@ -239,7 +239,7 @@ class FEA_Module // Local FEA data including ghosts size_t nall_nodes; - size_t rnum_elem; + size_t rnum_elem, num_corners; // Global FEA data long long int num_nodes, num_elem; diff --git a/src/Parallel-Solvers/Optimization_Modules/Fierro_Optimization_Objective.hpp b/src/Parallel-Solvers/Optimization_Modules/Fierro_Optimization_Objective.hpp index 25928162b..db07deade 100644 --- a/src/Parallel-Solvers/Optimization_Modules/Fierro_Optimization_Objective.hpp +++ b/src/Parallel-Solvers/Optimization_Modules/Fierro_Optimization_Objective.hpp @@ -144,15 +144,21 @@ class FierroOptimizationObjective : public ROL::Objective { //contributes to rate of change of adjoint vector due to term with displacement gradient of objective virtual void displacement_gradient_adjoint_contribution(vec_array& adjoint_rate_vector, const DViewCArrayKokkos& node_mass, - const DViewCArrayKokkos& elem_mass, const DViewCArrayKokkos& node_vel, - const DViewCArrayKokkos& node_coords, const DViewCArrayKokkos& elem_sie, - const size_t& rk_level){} + const DViewCArrayKokkos& elem_mass, const DViewCArrayKokkos& node_vel, + const DViewCArrayKokkos& node_coords, const DViewCArrayKokkos& elem_sie, + const size_t& rk_level){} //contributes to rate of change of adjoint vector due to term with specific internal energy gradient of objective virtual void sie_gradient_adjoint_contribution(vec_array& adjoint_rate_vector, const DViewCArrayKokkos& node_mass, - const DViewCArrayKokkos& elem_mass, const DViewCArrayKokkos& node_vel, - const DViewCArrayKokkos& node_coords, const DViewCArrayKokkos& elem_sie, - const size_t& rk_level){} + const DViewCArrayKokkos& elem_mass, const DViewCArrayKokkos& node_vel, + const DViewCArrayKokkos& node_coords, const DViewCArrayKokkos& elem_sie, + const size_t& rk_level){} + + //contributes to gradient tally due to term with design density gradient of objective + virtual void density_gradient_term(vec_array& gradient_vector, const DViewCArrayKokkos& node_mass, + const DViewCArrayKokkos& elem_mass, const DViewCArrayKokkos& node_vel, + const DViewCArrayKokkos& node_coords, const DViewCArrayKokkos& elem_sie, + const size_t& rk_level, const real_t& global_dt = 0){} }; // class ObjectiveMMA diff --git a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/setup_sgh.cpp b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/setup_sgh.cpp index f86e6f1b2..bd3823ea8 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/setup_sgh.cpp +++ b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/setup_sgh.cpp @@ -81,7 +81,7 @@ void FEA_Module_SGH::setup() // shorthand names const size_t num_nodes = mesh->num_nodes; const size_t num_elems = mesh->num_elems; - const size_t num_corners = mesh->num_corners; + num_corners = mesh->num_corners; // --- make dual views of data on CPU and GPU --- // Notes: diff --git a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp index 160c9d473..f9f9864a7 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp +++ b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp @@ -1406,133 +1406,134 @@ void FEA_Module_SGH::compute_topology_optimization_adjoint_full(Teuchos::RCP::iterator last_checkpoint = dynamic_checkpoint_set->end(); - --last_checkpoint; - const_vec_array current_velocity_vector = last_checkpoint->get_vector_pointer(V_DATA)->getLocalView(Tpetra::Access::ReadOnly); - const_vec_array current_coordinate_vector = last_checkpoint->get_vector_pointer(U_DATA)->getLocalView(Tpetra::Access::ReadOnly); - const_vec_array current_element_internal_energy = last_checkpoint->get_vector_pointer(SIE_DATA)->getLocalView(Tpetra::Access::ReadOnly); - - // compute gradients at midpoint - FOR_ALL_CLASS(node_gid, 0, nlocal_nodes + nghost_nodes, { - for (int idim = 0; idim < num_dim; idim++) { - node_vel(rk_level, node_gid, idim) = current_velocity_vector(node_gid, idim); - node_coords(rk_level, node_gid, idim) = current_coordinate_vector(node_gid, idim); - } - }); - Kokkos::fence(); - - FOR_ALL_CLASS(elem_gid, 0, rnum_elem, { - elem_sie(rk_level, elem_gid) = current_element_internal_energy(elem_gid, 0); - }); - Kokkos::fence(); + //RE-ENABLE STATE SETUP FOR T=0 if IVP term involves computed properties + // std::set::iterator last_checkpoint = dynamic_checkpoint_set->end(); + // --last_checkpoint; + // const_vec_array current_velocity_vector = last_checkpoint->get_vector_pointer(V_DATA)->getLocalView(Tpetra::Access::ReadOnly); + // const_vec_array current_coordinate_vector = last_checkpoint->get_vector_pointer(U_DATA)->getLocalView(Tpetra::Access::ReadOnly); + // const_vec_array current_element_internal_energy = last_checkpoint->get_vector_pointer(SIE_DATA)->getLocalView(Tpetra::Access::ReadOnly); + + // // compute gradients at midpoint + // FOR_ALL_CLASS(node_gid, 0, nlocal_nodes + nghost_nodes, { + // for (int idim = 0; idim < num_dim; idim++) { + // node_vel(rk_level, node_gid, idim) = current_velocity_vector(node_gid, idim); + // node_coords(rk_level, node_gid, idim) = current_coordinate_vector(node_gid, idim); + // } + // }); + // Kokkos::fence(); + + // FOR_ALL_CLASS(elem_gid, 0, rnum_elem, { + // elem_sie(rk_level, elem_gid) = current_element_internal_energy(elem_gid, 0); + // }); + // Kokkos::fence(); - // state_adjoint_time_end = Explicit_Solver_Pointer_->CPU_Time(); - // state_adjoint_time += state_adjoint_time_end-state_adjoint_time_start; - // set state according to phase data at this timestep - get_vol(); - - // ---- Calculate velocity diveregence for the element ---- - if (num_dim == 2) { - get_divergence2D(elem_div, - node_coords, - node_vel, - elem_vol); - } - else{ - get_divergence(elem_div, - node_coords, - node_vel, - elem_vol); - } // end if 2D - - // ---- Calculate elem state (den, pres, sound speed, stress) for next time step ---- - if (num_dim == 2) { - update_state2D(material, - *mesh, - node_coords, - node_vel, - elem_den, - elem_pres, - elem_stress, - elem_sspd, - elem_sie, - elem_vol, - elem_mass, - elem_mat_id, - 1.0, - cycle); - } - else{ - update_state(material, - *mesh, - node_coords, - node_vel, - elem_den, - elem_pres, - elem_stress, - elem_sspd, - elem_sie, - elem_vol, - elem_mass, - elem_mat_id, - 1.0, - cycle); - } + // // state_adjoint_time_end = Explicit_Solver_Pointer_->CPU_Time(); + // // state_adjoint_time += state_adjoint_time_end-state_adjoint_time_start; + // // set state according to phase data at this timestep + // get_vol(); + + // // ---- Calculate velocity diveregence for the element ---- + // if (num_dim == 2) { + // get_divergence2D(elem_div, + // node_coords, + // node_vel, + // elem_vol); + // } + // else{ + // get_divergence(elem_div, + // node_coords, + // node_vel, + // elem_vol); + // } // end if 2D + + // // ---- Calculate elem state (den, pres, sound speed, stress) for next time step ---- + // if (num_dim == 2) { + // update_state2D(material, + // *mesh, + // node_coords, + // node_vel, + // elem_den, + // elem_pres, + // elem_stress, + // elem_sspd, + // elem_sie, + // elem_vol, + // elem_mass, + // elem_mat_id, + // 1.0, + // cycle); + // } + // else{ + // update_state(material, + // *mesh, + // node_coords, + // node_vel, + // elem_den, + // elem_pres, + // elem_stress, + // elem_sspd, + // elem_sie, + // elem_vol, + // elem_mass, + // elem_mat_id, + // 1.0, + // cycle); + // } - if (num_dim == 2) { - get_force_sgh2D(material, - *mesh, - node_coords, - node_vel, - elem_den, - elem_sie, - elem_pres, - elem_stress, - elem_sspd, - elem_vol, - elem_div, - elem_mat_id, - corner_force, - 1.0, - cycle); - } - else{ - get_force_sgh(material, - *mesh, - node_coords, - node_vel, - elem_den, - elem_sie, - elem_pres, - elem_stress, - elem_sspd, - elem_vol, - elem_div, - elem_mat_id, - corner_force, - 1.0, - cycle); - } + // if (num_dim == 2) { + // get_force_sgh2D(material, + // *mesh, + // node_coords, + // node_vel, + // elem_den, + // elem_sie, + // elem_pres, + // elem_stress, + // elem_sspd, + // elem_vol, + // elem_div, + // elem_mat_id, + // corner_force, + // 1.0, + // cycle); + // } + // else{ + // get_force_sgh(material, + // *mesh, + // node_coords, + // node_vel, + // elem_den, + // elem_sie, + // elem_pres, + // elem_stress, + // elem_sspd, + // elem_vol, + // elem_div, + // elem_mat_id, + // corner_force, + // 1.0, + // cycle); + // } - if (have_loading_conditions) { - applied_forces(material, - *mesh, - node_coords, - node_vel, - node_mass, - elem_den, - elem_vol, - elem_div, - elem_mat_id, - corner_force, - 1.0, - cycle); - } + // if (have_loading_conditions) { + // applied_forces(material, + // *mesh, + // node_coords, + // node_vel, + // node_mass, + // elem_den, + // elem_vol, + // elem_div, + // elem_mat_id, + // corner_force, + // 1.0, + // cycle); + // } compute_topology_optimization_gradient_IVP(design_densities_distributed, cached_design_gradients_distributed, cycle, global_dt); } } - if(use_solve_checkpoints){ + if(use_solve_checkpoints&&cycle!=0){ //store current solution in the previous vector storage for the next timestep previous_adjoint_vector_distributed->assign(*all_adjoint_vector_distributed); previous_phi_adjoint_vector_distributed->assign(*all_phi_adjoint_vector_distributed); @@ -1562,12 +1563,10 @@ void FEA_Module_SGH::compute_topology_optimization_adjoint_full(Teuchos::RCP design_densities_distributed, Teuchos::RCP design_gradients_distributed, unsigned long cycle, real_t global_dt) { - size_t num_bdy_nodes = mesh->num_bdy_nodes; - const DCArrayKokkos boundary = module_params->boundary; const int num_dim = simparam->num_dims; int num_corners = rnum_elem * num_nodes_in_elem; - bool element_constant_density = true; size_t current_data_index, next_data_index; + const size_t rk_level = simparam->dynamic_options.rk_num_bins - 1; CArrayKokkos current_element_velocities = CArrayKokkos(num_nodes_in_elem, num_dim); CArrayKokkos current_element_adjoint = CArrayKokkos(num_nodes_in_elem, num_dim); bool use_solve_checkpoints = simparam->optimization_options.use_solve_checkpoints; @@ -1576,114 +1575,8 @@ void FEA_Module_SGH::compute_topology_optimization_gradient_tally(Teuchos::RCPgetLocalView(Tpetra::Access::ReadWrite); const_vec_array design_densities = design_densities_distributed->getLocalView(Tpetra::Access::ReadOnly); - // view scope - { - - const_vec_array current_velocity_vector; - const_vec_array next_velocity_vector; - if(use_solve_checkpoints){ - //note that these are assigned backwards because the adjoint loop progresses backwards - current_velocity_vector = all_node_velocities_distributed->getLocalView(Tpetra::Access::ReadOnly); - next_velocity_vector = previous_node_velocities_distributed->getLocalView(Tpetra::Access::ReadOnly); - } - else{ - current_velocity_vector = (*forward_solve_velocity_data)[cycle]->getLocalView(Tpetra::Access::ReadOnly); - next_velocity_vector = (*forward_solve_velocity_data)[cycle + 1]->getLocalView(Tpetra::Access::ReadOnly); - } - if(simparam->optimization_options.optimization_objective_regions.size()){ - int nobj_volumes = simparam->optimization_options.optimization_objective_regions.size(); - const_vec_array all_initial_node_coords = all_initial_node_coords_distributed->getLocalView(Tpetra::Access::ReadOnly); - FOR_ALL_CLASS(elem_id, 0, rnum_elem, { - size_t node_id; - size_t corner_id; - real_t inner_product; - // std::cout << elem_mass(elem_id) <optimization_options.optimization_objective_regions(ivolume).contains(current_node_coords)){ - contained = true; - } - } - if(contained){ - for (int idim = 0; idim < num_dim; idim++) { - inner_product += elem_mass(elem_id) * current_element_velocities(ifill, idim) * current_element_velocities(ifill, idim); - } - } - } - - for (int inode = 0; inode < num_nodes_in_elem; inode++) { - // compute gradient of local element contribution to v^t*M*v product - corner_id = elem_id * num_nodes_in_elem + inode; - // division by design ratio recovers nominal element mass used in the gradient operator - corner_value_storage(corner_id) = inner_product * global_dt / relative_element_densities(elem_id); - } - }); // end parallel for - Kokkos::fence(); - } - else{ - FOR_ALL_CLASS(elem_id, 0, rnum_elem, { - size_t node_id; - size_t corner_id; - real_t inner_product; - // std::cout << elem_mass(elem_id) <density_gradient_term(design_gradients, node_mass, elem_mass, node_vel, node_coords, elem_sie, rk_level, global_dt); // compute adjoint vector for this data point; use velocity midpoint // view scope @@ -1903,10 +1796,8 @@ void FEA_Module_SGH::compute_topology_optimization_gradient_tally(Teuchos::RCP design_densities_distributed, Teuchos::RCP design_gradients_distributed, unsigned long cycle, real_t global_dt) { - size_t num_bdy_nodes = mesh->num_bdy_nodes; const int num_dim = simparam->num_dims; int num_corners = rnum_elem * num_nodes_in_elem; - bool element_constant_density = true; size_t current_data_index, next_data_index; CArrayKokkos current_element_velocities = CArrayKokkos(num_nodes_in_elem, num_dim); CArrayKokkos current_element_adjoint = CArrayKokkos(num_nodes_in_elem, num_dim); @@ -2040,11 +1931,9 @@ void FEA_Module_SGH::compute_topology_optimization_gradient_IVP(Teuchos::RCP design_densities_distributed, Teuchos::RCP design_gradients_distributed) { - size_t num_bdy_nodes = mesh->num_bdy_nodes; const int num_dim = simparam->num_dims; int num_corners = rnum_elem * num_nodes_in_elem; real_t global_dt; - bool element_constant_density = true; size_t current_data_index, next_data_index; CArrayKokkos current_element_velocities = CArrayKokkos(num_nodes_in_elem, num_dim); CArrayKokkos current_element_adjoint = CArrayKokkos(num_nodes_in_elem, num_dim); diff --git a/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Kinetic_Energy_Minimize.h b/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Kinetic_Energy_Minimize.h index 7cb35cb70..08627ea93 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Kinetic_Energy_Minimize.h +++ b/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Kinetic_Energy_Minimize.h @@ -139,7 +139,7 @@ typedef MV::dual_view_type dual_vec_array; int last_comm_step, last_solve_step, current_step; int num_dim; size_t nvalid_modules; - size_t nlocal_nodes; + size_t nlocal_nodes, num_corners, num_nodes_in_elem, rnum_elem; DViewCArrayKokkos node_mass, node_coords; std::vector valid_fea_modules; // modules that may interface with this objective function FEA_MODULE_TYPE set_module_type; @@ -164,6 +164,9 @@ typedef MV::dual_view_type dual_vec_array; node_mass = FEM_SGH_->node_mass; node_coords = FEM_SGH_->node_coords; nlocal_nodes = FEM_SGH_->nlocal_nodes; + num_corners = FEM_SGH_->num_corners; + num_nodes_in_elem = FEM_SGH_->num_nodes_in_elem; + rnum_elem = FEM_SGH_->rnum_elem; } if (fea_module->Module_Type == FEA_MODULE_TYPE::Dynamic_Elasticity) { FEM_Dynamic_Elasticity_ = dynamic_cast(fea_module); @@ -171,6 +174,9 @@ typedef MV::dual_view_type dual_vec_array; node_mass = FEM_Dynamic_Elasticity_->node_mass; node_coords = FEM_Dynamic_Elasticity_->node_coords; nlocal_nodes = FEM_Dynamic_Elasticity_->nlocal_nodes; + num_corners = FEM_Dynamic_Elasticity_->num_corners; + num_nodes_in_elem = FEM_Dynamic_Elasticity_->num_nodes_in_elem; + rnum_elem = FEM_Dynamic_Elasticity_->rnum_elem; } } } @@ -558,7 +564,117 @@ typedef MV::dual_view_type dual_vec_array; }); // end parallel for Kokkos::fence(); } - + + void density_gradient_term(vec_array& gradient_vector, const DViewCArrayKokkos& node_mass, + const DViewCArrayKokkos& elem_mass, const DViewCArrayKokkos& node_vel, + const DViewCArrayKokkos& node_coords, const DViewCArrayKokkos& elem_sie, + const size_t& rk_level, const real_t& global_dt = 0){ + size_t current_data_index, next_data_index; + CArrayKokkos current_element_velocities = CArrayKokkos(num_nodes_in_elem, num_dim); + CArrayKokkos current_element_adjoint = CArrayKokkos(num_nodes_in_elem, num_dim); + auto optimization_objective_regions = FEM_SGH_->simparam->optimization_options.optimization_objective_regions; + auto nodes_in_elem = FEM_SGH_->nodes_in_elem; + auto corner_value_storage = FEM_SGH_->corner_value_storage; + auto corners_in_node = FEM_SGH_->corners_in_node; + auto num_corners_in_node = FEM_SGH_->num_corners_in_node; + auto relative_element_densities = FEM_SGH_->relative_element_densities; + + // view scope + { + if(optimization_objective_regions.size()){ + int nobj_volumes = optimization_objective_regions.size(); + const_vec_array all_initial_node_coords = FEM_SGH_->all_initial_node_coords_distributed->getLocalView(Tpetra::Access::ReadOnly); + FOR_ALL_CLASS(elem_id, 0, rnum_elem, { + size_t node_id; + size_t corner_id; + real_t inner_product; + // std::cout << elem_mass(elem_id) < Date: Tue, 20 Aug 2024 18:30:45 -0600 Subject: [PATCH 10/33] ENH: check for <= zero density in region input --- src/Parallel-Solvers/Simulation_Parameters/Region.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Parallel-Solvers/Simulation_Parameters/Region.h b/src/Parallel-Solvers/Simulation_Parameters/Region.h index 8322c098c..14bcacc16 100644 --- a/src/Parallel-Solvers/Simulation_Parameters/Region.h +++ b/src/Parallel-Solvers/Simulation_Parameters/Region.h @@ -47,6 +47,10 @@ struct Region : Yaml::DerivedFields, Yaml::ValidatedYaml, mat_fill_t { if (sie.has_value() == ie.has_value()){ throw Yaml::ConfigurationException("Specify values for exactly one of: energy (ie) or specific energy (sie)."); } + + if (den<=0){ + throw Yaml::ConfigurationException("Error: non-positive material density was specified for a region"); + } mat_fill_t::u = u.value_or(0); mat_fill_t::v = v.value_or(0); From c8963f5ad95d75bed14b2431294777c607a7ef99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CAdrian-Diaz=E2=80=9D?= <“adriandiaz1117@gmail.com”> Date: Tue, 20 Aug 2024 18:31:20 -0600 Subject: [PATCH 11/33] WIP: internal energy objective --- .../Parallel-Explicit/Explicit_Solver.cpp | 12 + .../Internal_Energy_Minimize.h | 582 ++++++++++++++++++ .../Optimization_Options.h | 4 +- .../Simulation_Parameters.h | 8 + 4 files changed, 605 insertions(+), 1 deletion(-) create mode 100644 src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Internal_Energy_Minimize.h diff --git a/src/Parallel-Solvers/Parallel-Explicit/Explicit_Solver.cpp b/src/Parallel-Solvers/Parallel-Explicit/Explicit_Solver.cpp index 65cdb7d2a..f94d893a1 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/Explicit_Solver.cpp +++ b/src/Parallel-Solvers/Parallel-Explicit/Explicit_Solver.cpp @@ -90,6 +90,7 @@ #include "Mass_Constraint.h" #include "Moment_of_Inertia_Constraint.h" #include "Kinetic_Energy_Minimize.h" +#include "Internal_Energy_Minimize.h" #include "MMA_Objective.hpp" #include "Area_Normals.h" @@ -1378,6 +1379,17 @@ void Explicit_Solver::setup_optimization_problem(){ obj = ROL::makePtr(this, nodal_density_flag); } } + if(TO_Module_List[imodule] == TO_MODULE_TYPE::Internal_Energy_Minimize){ + //debug print + *fos << " KINETIC ENERGY OBJECTIVE EXPECTS FEA MODULE INDEX " <(this, nodal_density_flag); + obj = ROL::makePtr(sub_obj, mma_bnd, x); + } + else{ + obj = ROL::makePtr(this, nodal_density_flag); + } + } else{ // TODO: Put validation earlier *fos << "PROGRAM IS ENDING DUE TO ERROR; UNDEFINED OBJECTIVE FUNCTION REQUESTED WITH NAME \"" diff --git a/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Internal_Energy_Minimize.h b/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Internal_Energy_Minimize.h new file mode 100644 index 000000000..d0c94d6d5 --- /dev/null +++ b/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Internal_Energy_Minimize.h @@ -0,0 +1,582 @@ +/********************************************************************************************** + © 2020. Triad National Security, LLC. All rights reserved. + This program was produced under U.S. Government contract 89233218CNA000001 for Los Alamos + National Laboratory (LANL), which is operated by Triad National Security, LLC for the U.S. + Department of Energy/National Nuclear Security Administration. All rights in the program are + reserved by Triad National Security, LLC, and the U.S. Department of Energy/National Nuclear + Security Administration. The Government is granted for itself and others acting on its behalf a + nonexclusive, paid-up, irrevocable worldwide license in this material to reproduce, prepare + derivative works, distribute copies to the public, perform publicly and display publicly, and + to permit others to do so. + This program is open source under the BSD-3 License. + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright notice, this list of + conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, this list of + conditions and the following disclaimer in the documentation and/or other materials + provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors may be used + to endorse or promote products derived from this software without specific prior + written permission. + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + **********************************************************************************************/ + +#ifndef INTERNAL_ENERGY_MINIMIZE_TOPOPT_H +#define INTERNAL_ENERGY_MINIMIZE_TOPOPT_H + +#include "matar.h" +#include "elements.h" +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include "Tpetra_Details_makeColMap.hpp" +#include "Tpetra_Details_DefaultTypes.hpp" + +#include "ROL_Types.hpp" +#include +#include "ROL_Objective.hpp" +#include "Fierro_Optimization_Objective.hpp" +#include "ROL_Elementwise_Reduce.hpp" +#include "FEA_Module_SGH.h" +#include "Explicit_Solver.h" + +class InternalEnergyMinimize_TopOpt : public FierroOptimizationObjective +{ +typedef Tpetra::Map<>::local_ordinal_type LO; +typedef Tpetra::Map<>::global_ordinal_type GO; +typedef Tpetra::Map<>::node_type Node; +typedef Tpetra::Map Map; +typedef Tpetra::MultiVector MV; +typedef ROL::Vector V; +typedef ROL::TpetraMultiVector ROL_MV; + +using traits = Kokkos::ViewTraits; +using array_layout = typename traits::array_layout; +using execution_space = typename traits::execution_space; +using device_type = typename traits::device_type; +using memory_traits = typename traits::memory_traits; +using global_size_t = Tpetra::global_size_t; + +typedef Kokkos::View values_array; +typedef Kokkos::View global_indices_array; +typedef Kokkos::View indices_array; + +// typedef Kokkos::DualView::t_dev vec_array; +typedef MV::dual_view_type::t_dev vec_array; +typedef MV::dual_view_type::t_host host_vec_array; +typedef Kokkos::View const_host_vec_array; +typedef Kokkos::View const_vec_array; +typedef MV::dual_view_type dual_vec_array; + +private: + + Explicit_Solver* Explicit_Solver_Pointer_; + FEA_Module_SGH* FEM_SGH_; + ROL::Ptr ROL_Force; + ROL::Ptr ROL_Velocities; + ROL::Ptr ROL_Gradients; + Teuchos::RCP previous_gradients; + real_t initial_internal_energy; + real_t previous_objective_accumulation, objective_sign; + + bool first_init; //prevents ROL from calling init computation twice at start for the AL algorithm + + ///////////////////////////////////////////////////////////////////////////// + /// + /// \fn getVector + /// + /// \brief Retrieves ROL vector at desired location + /// + /// \param Pointer to desired ROL vector + /// + /// \return Returns ROL MV vector + /// + ///////////////////////////////////////////////////////////////////////////// + ROL::Ptr getVector(const V& x) + { + return dynamic_cast(x).getVector(); + } + + ///////////////////////////////////////////////////////////////////////////// + /// + /// \fn getVector + /// + /// \brief Retrieves ROL vector at desired location + /// + /// \param Pointer to desired ROL vector + /// + /// \return Returns const ROL MV vector + /// + ///////////////////////////////////////////////////////////////////////////// + ROL::Ptr getVector(V& x) + { + return dynamic_cast(x).getVector(); + } + +public: + bool nodal_density_flag_; + int last_comm_step, last_solve_step, current_step; + int num_dim; + size_t nvalid_modules; + size_t nlocal_nodes, num_corners, num_nodes_in_elem, rnum_elem; + DViewCArrayKokkos node_mass, node_coords; + std::vector valid_fea_modules; // modules that may interface with this objective function + FEA_MODULE_TYPE set_module_type; + // std::string my_fea_module = "SGH"; + + InternalEnergyMinimize_TopOpt(Explicit_Solver* Explicit_Solver_Pointer, bool nodal_density_flag) + { + Explicit_Solver_Pointer_ = Explicit_Solver_Pointer; + first_init = false; + valid_fea_modules.push_back(FEA_MODULE_TYPE::SGH); + valid_fea_modules.push_back(FEA_MODULE_TYPE::Dynamic_Elasticity); + nvalid_modules = valid_fea_modules.size(); + objective_sign = 1; + num_dim = Explicit_Solver_Pointer_->simparam.num_dims; + const Simulation_Parameters& simparam = Explicit_Solver_Pointer_->simparam; + for (const auto& fea_module : Explicit_Solver_Pointer_->fea_modules) { + for (int ivalid = 0; ivalid < nvalid_modules; ivalid++) { + if (fea_module->Module_Type == FEA_MODULE_TYPE::SGH) { + FEM_SGH_ = dynamic_cast(fea_module); + set_module_type = FEA_MODULE_TYPE::SGH; + node_mass = FEM_SGH_->node_mass; + node_coords = FEM_SGH_->node_coords; + nlocal_nodes = FEM_SGH_->nlocal_nodes; + num_corners = FEM_SGH_->num_corners; + num_nodes_in_elem = FEM_SGH_->num_nodes_in_elem; + rnum_elem = FEM_SGH_->rnum_elem; + } + } + } + nodal_density_flag_ = nodal_density_flag; + last_comm_step = last_solve_step = -1; + current_step = 0; + time_accumulation = true; + + previous_gradients = Teuchos::rcp(new MV(Explicit_Solver_Pointer_->map, 1)); + if(Explicit_Solver_Pointer_->simparam.optimization_options.maximize_flag){ + objective_sign = -1; + } + // ROL_Force = ROL::makePtr(FEM_->Global_Nodal_Forces); + if (set_module_type == FEA_MODULE_TYPE::SGH) { + ROL_Velocities = ROL::makePtr(FEM_SGH_->node_velocities_distributed); + } + } + + /* -------------------------------------------------------------------------------------- + Update solver state variables to synchronize with the current design variable vector, z + ----------------------------------------------------------------------------------------- */ + + void update(const ROL::Vector& z, ROL::UpdateType type, int iter = -1) + { + if (set_module_type == FEA_MODULE_TYPE::SGH) { + update_sgh(z, type, iter); + } + } + + /* -------------------------------------------------------------------------------------- + Update solver state variables to synchronize with the current design variable vector, z + ----------------------------------------------------------------------------------------- */ + + void update_sgh(const ROL::Vector& z, ROL::UpdateType type, int iter = -1) + { + // debug + std::ostream& out = std::cout; + Teuchos::RCP fos = Teuchos::fancyOStream(Teuchos::rcpFromRef(out)); + bool print_flag = false; + ROL::Ptr zp = getVector(z); //tpetra multivector wrapper on design vector + const_host_vec_array design_densities = zp->getLocalView(Tpetra::Access::ReadOnly); + + if (type == ROL::UpdateType::Initial) { + if(first_init){ + // This is the first call to update + if (Explicit_Solver_Pointer_->myrank == 0) { + *fos << "called SGH Initial" << std::endl; + } + + FEM_SGH_->comm_variables(zp); + FEM_SGH_->update_forward_solve(zp); + if(Explicit_Solver_Pointer_->myrank == 0){ + std::cout << "CURRENT TIME INTEGRAL OF INTERNAL ENERGY " << objective_accumulation << std::endl; + } + FEM_SGH_->compute_topology_optimization_adjoint_full(zp); + previous_objective_accumulation = objective_accumulation; + previous_gradients->assign(*(FEM_SGH_->cached_design_gradients_distributed)); + // initial design density data was already communicated for ghost nodes in init_design() + // decide to output current optimization state + // FEM_SGH_->Explicit_Solver_Pointer_->write_outputs(); + } + first_init = true; + } + else if (type == ROL::UpdateType::Accept) { + if (Explicit_Solver_Pointer_->myrank == 0) { + *fos << "called Accept" << std::endl; + } + + previous_objective_accumulation = objective_accumulation; + previous_gradients->assign(*(FEM_SGH_->cached_design_gradients_distributed)); + } + else if (type == ROL::UpdateType::Revert) { + // u_ was set to u=S(x) during a trial update + // and has been rejected as the new iterate + // Revert to cached value + // This is a new value of x + // communicate density variables for ghosts + if (Explicit_Solver_Pointer_->myrank == 0) { *fos << "called Revert" << std::endl; } + objective_accumulation = previous_objective_accumulation; + FEM_SGH_->cached_design_gradients_distributed->assign(*previous_gradients); + if(Explicit_Solver_Pointer_->myrank == 0){ + std::cout << "CURRENT TIME INTEGRAL OF INTERNAL ENERGY " << objective_accumulation << std::endl; + } + // FEM_SGH_->comm_variables(zp); + // // update deformation variables + // FEM_SGH_->update_forward_solve(zp); + // FEM_SGH_->compute_topology_optimization_adjoint_full(zp); + } + else if (type == ROL::UpdateType::Trial) { + // This is a new value of x + current_step++; + if(current_step%FEM_SGH_->simparam->optimization_options.optimization_output_freq==0){ + print_flag = true; + } + if (Explicit_Solver_Pointer_->myrank == 0) { + *fos << "called Trial" << std::endl; + } + // communicate density variables for ghosts + FEM_SGH_->comm_variables(zp); + // update deformation variables + FEM_SGH_->update_forward_solve(zp, print_flag); + + if(Explicit_Solver_Pointer_->myrank == 0){ + std::cout << "CURRENT TIME INTEGRAL OF INTERNAL ENERGY " << objective_accumulation << std::endl; + } + FEM_SGH_->compute_topology_optimization_adjoint_full(zp); + // decide to output current optimization state + // FEM_SGH_->Explicit_Solver_Pointer_->write_outputs(); + } + else{ // ROL::UpdateType::Temp + // This is a new value of x used for, + // e.g., finite-difference checks + if (Explicit_Solver_Pointer_->myrank == 0) { + *fos << "called Temp" << std::endl; + } + FEM_SGH_->comm_variables(zp); + FEM_SGH_->update_forward_solve(zp); + FEM_SGH_->compute_topology_optimization_adjoint_full(zp); + } + } + + /* -------------------------------------------------------------------------------------- + Compute time integral contribution for this objective function form + ----------------------------------------------------------------------------------------- */ + void step_accumulation(const real_t& dt, const size_t& cycle, const size_t& rk_level) { + + const_vec_array node_velocities_interface; + const_vec_array previous_node_velocities_interface; + bool use_solve_checkpoints = FEM_SGH_->simparam->optimization_options.use_solve_checkpoints; + if(use_solve_checkpoints){ + node_velocities_interface = FEM_SGH_->all_node_velocities_distributed->getLocalView(Tpetra::Access::ReadOnly); + previous_node_velocities_interface = FEM_SGH_->previous_node_velocities_distributed->getLocalView(Tpetra::Access::ReadOnly); + } + else{ + auto forward_solve_velocity_data = FEM_SGH_->forward_solve_velocity_data; + node_velocities_interface = (*forward_solve_velocity_data)[cycle + 1]->getLocalView(Tpetra::Access::ReadOnly); + previous_node_velocities_interface = (*forward_solve_velocity_data)[cycle]->getLocalView(Tpetra::Access::ReadOnly); + } + + double KE_sum = 0.0; + double KE_loc_sum = 0.0; + // extensive KE + if(FEM_SGH_->simparam->optimization_options.optimization_objective_regions.size()){ + int nobj_volumes = FEM_SGH_->simparam->optimization_options.optimization_objective_regions.size(); + auto optimization_objective_regions = FEM_SGH_->simparam->optimization_options.optimization_objective_regions; + const_vec_array all_initial_node_coords = FEM_SGH_->all_initial_node_coords_distributed->getLocalView(Tpetra::Access::ReadOnly); + REDUCE_SUM_CLASS(node_gid, 0, nlocal_nodes, KE_loc_sum, { + double ke = 0; + double current_node_coords[3]; + bool contained = false; + current_node_coords[0] = all_initial_node_coords(node_gid, 0); + current_node_coords[1] = all_initial_node_coords(node_gid, 1); + current_node_coords[2] = all_initial_node_coords(node_gid, 2); + for(int ivolume = 0; ivolume < nobj_volumes; ivolume++){ + if(optimization_objective_regions(ivolume).contains(current_node_coords)){ + contained = true; + } + } + if(contained){ + for (size_t dim = 0; dim < num_dim; dim++) { + // midpoint integration approximation + ke += (node_velocities_interface(node_gid, dim) + previous_node_velocities_interface(node_gid, dim)) * + (node_velocities_interface(node_gid, dim) + previous_node_velocities_interface(node_gid, dim)) / 4; // 1/2 at end + } // end for + } + + if (num_dim == 2) { + KE_loc_sum += node_mass(node_gid) * node_coords(rk_level, node_gid, 1) * ke; + } + else{ + KE_loc_sum += node_mass(node_gid) * ke; + } + }, KE_sum); + } + else{ + REDUCE_SUM_CLASS(node_gid, 0, nlocal_nodes, KE_loc_sum, { + double ke = 0; + for (size_t dim = 0; dim < num_dim; dim++) { + // midpoint integration approximation + ke += (node_velocities_interface(node_gid, dim) + previous_node_velocities_interface(node_gid, dim)) * + (node_velocities_interface(node_gid, dim) + previous_node_velocities_interface(node_gid, dim)) / 4; // 1/2 at end + } // end for + + if (num_dim == 2) { + KE_loc_sum += node_mass(node_gid) * node_coords(rk_level, node_gid, 1) * ke; + } + else{ + KE_loc_sum += node_mass(node_gid) * ke; + } + }, KE_sum); + } + Kokkos::fence(); + KE_sum = 0.5 * KE_sum; + objective_accumulation += KE_sum * dt; + } + + /* -------------------------------------------------------------------------------------- + Update objective value with the current design variable vector, z + ----------------------------------------------------------------------------------------- */ + + real_t value(const ROL::Vector& z, real_t& tol) + { + // std::cout << "Started obj value on task " <myrank << std::endl; + ROL::Ptr zp = getVector(z); + real_t c = 0.0; + + // debug print + // std::ostream &out = std::cout; + // Teuchos::RCP fos = Teuchos::fancyOStream(Teuchos::rcpFromRef(out)); + // if(FEM_->myrank==0) + // *fos << "Value function z:" << std::endl; + // zp->describe(*fos,Teuchos::VERB_EXTREME); + // *fos << std::endl; + // std::fflush(stdout); + + const_host_vec_array design_densities = zp->getLocalView(Tpetra::Access::ReadOnly); + // communicate ghosts and solve for nodal degrees of freedom as a function of the current design variables + /* + if(last_comm_step!=current_step){ + FEM_->comm_variables(zp); + last_comm_step = current_step; + } + + if(last_solve_step!=current_step){ + //std::cout << "UPDATED velocities" << std::endl; + FEM_->update_linear_solve(zp); + last_solve_step = current_step; + } + */ + // debug print of velocities + // std::ostream &out = std::cout; + // Teuchos::RCP fos = Teuchos::fancyOStream(Teuchos::rcpFromRef(out)); + // if(FEM_->myrank==0) + // *fos << "Displacement data :" << std::endl; + // FEM_->node_velocities_distributed->describe(*fos,Teuchos::VERB_EXTREME); + // *fos << std::endl; + // std::fflush(stdout); + + std::cout.precision(10); + + // std::cout << "Ended obj value on task " <myrank << std::endl; + return objective_sign*objective_accumulation; + } + + /* -------------------------------------------------------------------------------------- + Update gradient vector (g) with the current design variable vector, z + ----------------------------------------------------------------------------------------- */ + + void gradient(ROL::Vector& g, const ROL::Vector& z, real_t& tol) + { + // std::cout << "Started obj gradient on task " <myrank << std::endl; + // get Tpetra multivector pointer from the ROL vector + ROL::Ptr zp = getVector(z); //pointer to design vector + ROL::Ptr gp = getVector(g); //pointer to gradient vector + + // communicate ghosts and solve for nodal degrees of freedom as a function of the current design variables + // FEM_->gradient_print_sync=1; + // FEM_->gradient_print_sync=0; + // get local view of the data + + if (set_module_type == FEA_MODULE_TYPE::SGH) { + FEM_SGH_->compute_topology_optimization_gradient_full(zp, gp); + } + gp->scale(objective_sign); + // debug print of gradient + // std::ostream &out = std::cout; + // Teuchos::RCP fos = Teuchos::fancyOStream(Teuchos::rcpFromRef(out)); + // if(FEM_->myrank==0) + // *fos << "Gradient data :" << std::endl; + // gp->describe(*fos,Teuchos::VERB_EXTREME); + // *fos << std::endl; + // std::fflush(stdout); + // for(int i = 0; i < FEM_->nlocal_nodes; i++){ + // objective_gradients(i,0) *= -1; + // } + + // std::cout << "Objective Gradient called"<< std::endl; + // debug print of design variables + // std::ostream &out = std::cout; + // Teuchos::RCP fos = Teuchos::fancyOStream(Teuchos::rcpFromRef(out)); + // if(FEM_->myrank==0) + // *fos << "Gradient data :" << std::endl; + // gp->describe(*fos,Teuchos::VERB_EXTREME); + + // *fos << std::endl; + // std::fflush(stdout); + // std::cout << "ended obj gradient on task " <myrank << std::endl; + } + + //contributes to rate of change of adjoint vector due to term with velocity gradient of objective + void velocity_gradient_adjoint_contribution(vec_array& adjoint_rate_vector, const DViewCArrayKokkos& node_mass, + const DViewCArrayKokkos& elem_mass, const DViewCArrayKokkos& node_vel, + const DViewCArrayKokkos& node_coords, const DViewCArrayKokkos& elem_sie, + const size_t& rk_level){ + + + FOR_ALL_CLASS(node_gid, 0, nlocal_nodes, { + for (int idim = 0; idim < num_dim; idim++) { + adjoint_rate_vector(node_gid, idim) = node_mass(node_gid)*node_vel(rk_level, node_gid, idim); + } + }); // end parallel for + Kokkos::fence(); + } + + void density_gradient_term(vec_array& gradient_vector, const DViewCArrayKokkos& node_mass, + const DViewCArrayKokkos& elem_mass, const DViewCArrayKokkos& node_vel, + const DViewCArrayKokkos& node_coords, const DViewCArrayKokkos& elem_sie, + const size_t& rk_level, const real_t& global_dt = 0){ + size_t current_data_index, next_data_index; + CArrayKokkos current_element_velocities = CArrayKokkos(num_nodes_in_elem, num_dim); + CArrayKokkos current_element_adjoint = CArrayKokkos(num_nodes_in_elem, num_dim); + auto optimization_objective_regions = FEM_SGH_->simparam->optimization_options.optimization_objective_regions; + auto nodes_in_elem = FEM_SGH_->nodes_in_elem; + auto corner_value_storage = FEM_SGH_->corner_value_storage; + auto corners_in_node = FEM_SGH_->corners_in_node; + auto num_corners_in_node = FEM_SGH_->num_corners_in_node; + auto relative_element_densities = FEM_SGH_->relative_element_densities; + + // view scope + { + if(optimization_objective_regions.size()){ + int nobj_volumes = optimization_objective_regions.size(); + const_vec_array all_initial_node_coords = FEM_SGH_->all_initial_node_coords_distributed->getLocalView(Tpetra::Access::ReadOnly); + FOR_ALL_CLASS(elem_id, 0, rnum_elem, { + size_t node_id; + size_t corner_id; + real_t inner_product; + // std::cout << elem_mass(elem_id) < Date: Wed, 21 Aug 2024 00:05:16 -0600 Subject: [PATCH 12/33] WIP: internal energy objective --- .../SGH_Solver/src/FEA_Module_SGH.cpp | 2 + .../Internal_Energy_Minimize.h | 79 ++++++++----------- 2 files changed, 36 insertions(+), 45 deletions(-) diff --git a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/FEA_Module_SGH.cpp b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/FEA_Module_SGH.cpp index 1a429d02a..609086e58 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/FEA_Module_SGH.cpp +++ b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/FEA_Module_SGH.cpp @@ -1220,6 +1220,8 @@ void FEA_Module_SGH::sgh_solve() if(use_solve_checkpoints&&optimization_on){ previous_node_velocities_distributed->assign(*all_node_velocities_distributed); + previous_node_coords_distributed->assign(*all_node_coords_distributed); + previous_element_internal_energy_distributed->assign(*element_internal_energy_distributed); } // integrate solution forward in time diff --git a/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Internal_Energy_Minimize.h b/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Internal_Energy_Minimize.h index d0c94d6d5..1cff7d4b5 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Internal_Energy_Minimize.h +++ b/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Internal_Energy_Minimize.h @@ -289,74 +289,62 @@ typedef MV::dual_view_type dual_vec_array; ----------------------------------------------------------------------------------------- */ void step_accumulation(const real_t& dt, const size_t& cycle, const size_t& rk_level) { - const_vec_array node_velocities_interface; - const_vec_array previous_node_velocities_interface; + const_vec_array current_elem_sie; + const_vec_array previous_elem_sie; + size_t nlocal_elem_non_overlapping = FEM_SGH_->Explicit_Solver_Pointer_->nlocal_elem_non_overlapping; + auto nodes_in_elem = FEM_SGH_->nodes_in_elem; + auto elem_mass = FEM_SGH_->elem_mass; bool use_solve_checkpoints = FEM_SGH_->simparam->optimization_options.use_solve_checkpoints; if(use_solve_checkpoints){ - node_velocities_interface = FEM_SGH_->all_node_velocities_distributed->getLocalView(Tpetra::Access::ReadOnly); - previous_node_velocities_interface = FEM_SGH_->previous_node_velocities_distributed->getLocalView(Tpetra::Access::ReadOnly); + current_elem_sie = FEM_SGH_->element_internal_energy_distributed->getLocalView(Tpetra::Access::ReadOnly); + previous_elem_sie = FEM_SGH_->previous_element_internal_energy_distributed->getLocalView(Tpetra::Access::ReadOnly); } else{ - auto forward_solve_velocity_data = FEM_SGH_->forward_solve_velocity_data; - node_velocities_interface = (*forward_solve_velocity_data)[cycle + 1]->getLocalView(Tpetra::Access::ReadOnly); - previous_node_velocities_interface = (*forward_solve_velocity_data)[cycle]->getLocalView(Tpetra::Access::ReadOnly); + auto forward_solve_internal_energy_data = FEM_SGH_->forward_solve_internal_energy_data; + current_elem_sie = (*forward_solve_internal_energy_data)[cycle + 1]->getLocalView(Tpetra::Access::ReadOnly); + previous_elem_sie = (*forward_solve_internal_energy_data)[cycle]->getLocalView(Tpetra::Access::ReadOnly); } - double KE_sum = 0.0; - double KE_loc_sum = 0.0; + double IE_sum = 0.0; + double IE_loc_sum = 0.0; // extensive KE if(FEM_SGH_->simparam->optimization_options.optimization_objective_regions.size()){ int nobj_volumes = FEM_SGH_->simparam->optimization_options.optimization_objective_regions.size(); auto optimization_objective_regions = FEM_SGH_->simparam->optimization_options.optimization_objective_regions; const_vec_array all_initial_node_coords = FEM_SGH_->all_initial_node_coords_distributed->getLocalView(Tpetra::Access::ReadOnly); - REDUCE_SUM_CLASS(node_gid, 0, nlocal_nodes, KE_loc_sum, { + REDUCE_SUM_CLASS(elem_gid, 0, nlocal_elem_non_overlapping, IE_loc_sum, { double ke = 0; - double current_node_coords[3]; + int node_id; + double current_elem_coords[3]; bool contained = false; - current_node_coords[0] = all_initial_node_coords(node_gid, 0); - current_node_coords[1] = all_initial_node_coords(node_gid, 1); - current_node_coords[2] = all_initial_node_coords(node_gid, 2); + current_elem_coords[0] = 0; + current_elem_coords[1] = 0; + current_elem_coords[2] = 0; + for(int inode=0; inode< num_nodes_in_elem; inode++){ + node_id = nodes_in_elem(elem_gid, inode); + current_elem_coords[0] += all_initial_node_coords(node_id, 0)/num_nodes_in_elem; + current_elem_coords[1] += all_initial_node_coords(node_id, 1)/num_nodes_in_elem; + current_elem_coords[2] += all_initial_node_coords(node_id, 2)/num_nodes_in_elem; + } for(int ivolume = 0; ivolume < nobj_volumes; ivolume++){ - if(optimization_objective_regions(ivolume).contains(current_node_coords)){ + if(optimization_objective_regions(ivolume).contains(current_elem_coords)){ contained = true; } } if(contained){ - for (size_t dim = 0; dim < num_dim; dim++) { - // midpoint integration approximation - ke += (node_velocities_interface(node_gid, dim) + previous_node_velocities_interface(node_gid, dim)) * - (node_velocities_interface(node_gid, dim) + previous_node_velocities_interface(node_gid, dim)) / 4; // 1/2 at end - } // end for + IE_loc_sum += elem_mass(elem_gid) * 0.5 * (current_elem_sie(elem_gid,0)+previous_elem_sie(elem_gid,0)); } - if (num_dim == 2) { - KE_loc_sum += node_mass(node_gid) * node_coords(rk_level, node_gid, 1) * ke; - } - else{ - KE_loc_sum += node_mass(node_gid) * ke; - } - }, KE_sum); + + }, IE_sum); } else{ - REDUCE_SUM_CLASS(node_gid, 0, nlocal_nodes, KE_loc_sum, { - double ke = 0; - for (size_t dim = 0; dim < num_dim; dim++) { - // midpoint integration approximation - ke += (node_velocities_interface(node_gid, dim) + previous_node_velocities_interface(node_gid, dim)) * - (node_velocities_interface(node_gid, dim) + previous_node_velocities_interface(node_gid, dim)) / 4; // 1/2 at end - } // end for - - if (num_dim == 2) { - KE_loc_sum += node_mass(node_gid) * node_coords(rk_level, node_gid, 1) * ke; - } - else{ - KE_loc_sum += node_mass(node_gid) * ke; - } - }, KE_sum); + REDUCE_SUM_CLASS(elem_gid, 0, nlocal_elem_non_overlapping, IE_loc_sum, { + IE_loc_sum += elem_mass(elem_gid) * 0.5 * (current_elem_sie(elem_gid,0)+previous_elem_sie(elem_gid,0)); + }, IE_sum); } Kokkos::fence(); - KE_sum = 0.5 * KE_sum; - objective_accumulation += KE_sum * dt; + objective_accumulation += IE_sum * dt; } /* -------------------------------------------------------------------------------------- @@ -453,7 +441,7 @@ typedef MV::dual_view_type dual_vec_array; } //contributes to rate of change of adjoint vector due to term with velocity gradient of objective - void velocity_gradient_adjoint_contribution(vec_array& adjoint_rate_vector, const DViewCArrayKokkos& node_mass, + void sie_gradient_adjoint_contribution(vec_array& adjoint_rate_vector, const DViewCArrayKokkos& node_mass, const DViewCArrayKokkos& elem_mass, const DViewCArrayKokkos& node_vel, const DViewCArrayKokkos& node_coords, const DViewCArrayKokkos& elem_sie, const size_t& rk_level){ @@ -467,6 +455,7 @@ typedef MV::dual_view_type dual_vec_array; Kokkos::fence(); } + //contribution to gradient tally from objective w.r.t design density void density_gradient_term(vec_array& gradient_vector, const DViewCArrayKokkos& node_mass, const DViewCArrayKokkos& elem_mass, const DViewCArrayKokkos& node_vel, const DViewCArrayKokkos& node_coords, const DViewCArrayKokkos& elem_sie, From b68e2aeb01115563a6cd88be02eb3d3d7b6548d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CAdrian-Diaz=E2=80=9D?= <“adriandiaz1117@gmail.com”> Date: Wed, 21 Aug 2024 10:07:32 -0600 Subject: [PATCH 13/33] BUG: optimization if check --- src/Parallel-Solvers/Parallel-Explicit/Explicit_Solver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Parallel-Solvers/Parallel-Explicit/Explicit_Solver.cpp b/src/Parallel-Solvers/Parallel-Explicit/Explicit_Solver.cpp index f94d893a1..d84a736b1 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/Explicit_Solver.cpp +++ b/src/Parallel-Solvers/Parallel-Explicit/Explicit_Solver.cpp @@ -1379,7 +1379,7 @@ void Explicit_Solver::setup_optimization_problem(){ obj = ROL::makePtr(this, nodal_density_flag); } } - if(TO_Module_List[imodule] == TO_MODULE_TYPE::Internal_Energy_Minimize){ + else if(TO_Module_List[imodule] == TO_MODULE_TYPE::Internal_Energy_Minimize){ //debug print *fos << " KINETIC ENERGY OBJECTIVE EXPECTS FEA MODULE INDEX " < Date: Wed, 21 Aug 2024 20:45:15 -0600 Subject: [PATCH 14/33] ENH: Internal energy objective --- .../Internal_Energy_Minimize.h | 60 ++++++------------- .../Kinetic_Energy_Minimize.h | 1 - 2 files changed, 17 insertions(+), 44 deletions(-) diff --git a/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Internal_Energy_Minimize.h b/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Internal_Energy_Minimize.h index 1cff7d4b5..ff857a3ba 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Internal_Energy_Minimize.h +++ b/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Internal_Energy_Minimize.h @@ -313,7 +313,6 @@ typedef MV::dual_view_type dual_vec_array; auto optimization_objective_regions = FEM_SGH_->simparam->optimization_options.optimization_objective_regions; const_vec_array all_initial_node_coords = FEM_SGH_->all_initial_node_coords_distributed->getLocalView(Tpetra::Access::ReadOnly); REDUCE_SUM_CLASS(elem_gid, 0, nlocal_elem_non_overlapping, IE_loc_sum, { - double ke = 0; int node_id; double current_elem_coords[3]; bool contained = false; @@ -447,10 +446,8 @@ typedef MV::dual_view_type dual_vec_array; const size_t& rk_level){ - FOR_ALL_CLASS(node_gid, 0, nlocal_nodes, { - for (int idim = 0; idim < num_dim; idim++) { - adjoint_rate_vector(node_gid, idim) = node_mass(node_gid)*node_vel(rk_level, node_gid, idim); - } + FOR_ALL_CLASS(elem_gid, 0, rnum_elem, { + adjoint_rate_vector(elem_gid, 0) = elem_mass(elem_gid); }); // end parallel for Kokkos::fence(); } @@ -461,8 +458,6 @@ typedef MV::dual_view_type dual_vec_array; const DViewCArrayKokkos& node_coords, const DViewCArrayKokkos& elem_sie, const size_t& rk_level, const real_t& global_dt = 0){ size_t current_data_index, next_data_index; - CArrayKokkos current_element_velocities = CArrayKokkos(num_nodes_in_elem, num_dim); - CArrayKokkos current_element_adjoint = CArrayKokkos(num_nodes_in_elem, num_dim); auto optimization_objective_regions = FEM_SGH_->simparam->optimization_options.optimization_objective_regions; auto nodes_in_elem = FEM_SGH_->nodes_in_elem; auto corner_value_storage = FEM_SGH_->corner_value_storage; @@ -481,33 +476,27 @@ typedef MV::dual_view_type dual_vec_array; real_t inner_product; // std::cout << elem_mass(elem_id) < current_element_velocities = CArrayKokkos(num_nodes_in_elem, num_dim); - CArrayKokkos current_element_adjoint = CArrayKokkos(num_nodes_in_elem, num_dim); auto optimization_objective_regions = FEM_SGH_->simparam->optimization_options.optimization_objective_regions; auto nodes_in_elem = FEM_SGH_->nodes_in_elem; auto corner_value_storage = FEM_SGH_->corner_value_storage; From e051b1aa69d6a28544a3edd93ef736e4d7b29e47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CAdrian-Diaz=E2=80=9D?= <“adriandiaz1117@gmail.com”> Date: Thu, 22 Aug 2024 18:57:55 -0600 Subject: [PATCH 15/33] BUG: missing recast error --- .../Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp | 6 +++--- .../Topology_Optimization/Internal_Energy_Minimize.h | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp index f9f9864a7..3aba79eb2 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp +++ b/src/Parallel-Solvers/Parallel-Explicit/SGH_Solver/src/sgh_optimization.cpp @@ -68,7 +68,7 @@ // optimization #include "ROL_Solver.hpp" -#include "Kinetic_Energy_Minimize.h" +#include "Fierro_Optimization_Objective.hpp" ///////////////////////////////////////////////////////////////////////////// /// @@ -173,8 +173,8 @@ void FEA_Module_SGH::update_forward_solve(Teuchos::RCP zp, bool print_ */ // simple setup to just request KE for now; above loop to be expanded and used later for scanning modules obj_pointer = problem->getObjective(); - KineticEnergyMinimize_TopOpt& kinetic_energy_minimize_function = dynamic_cast(*obj_pointer); - kinetic_energy_minimize_function.objective_accumulation = 0; + objective_function = dynamic_cast(obj_pointer.getRawPtr()); + objective_function->objective_accumulation = 0; // interface trial density vector diff --git a/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Internal_Energy_Minimize.h b/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Internal_Energy_Minimize.h index ff857a3ba..f74208455 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Internal_Energy_Minimize.h +++ b/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Internal_Energy_Minimize.h @@ -511,7 +511,6 @@ typedef MV::dual_view_type dual_vec_array; } else{ FOR_ALL_CLASS(elem_id, 0, rnum_elem, { - size_t node_id; size_t corner_id; real_t inner_product; // std::cout << elem_mass(elem_id) < Date: Sat, 24 Aug 2024 00:28:56 -0600 Subject: [PATCH 16/33] BUG: elem_sie access bug in objective --- .../Internal_Energy_Minimize.h | 13 ++++++++----- .../Topology_Optimization/Kinetic_Energy_Minimize.h | 3 +++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Internal_Energy_Minimize.h b/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Internal_Energy_Minimize.h index f74208455..b41516140 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Internal_Energy_Minimize.h +++ b/src/Parallel-Solvers/Parallel-Explicit/Topology_Optimization/Internal_Energy_Minimize.h @@ -280,6 +280,9 @@ typedef MV::dual_view_type dual_vec_array; } FEM_SGH_->comm_variables(zp); FEM_SGH_->update_forward_solve(zp); + if(Explicit_Solver_Pointer_->myrank == 0){ + std::cout << "CURRENT TIME INTEGRAL OF INTERNAL ENERGY " << objective_accumulation << std::endl; + } FEM_SGH_->compute_topology_optimization_adjoint_full(zp); } } @@ -342,6 +345,7 @@ typedef MV::dual_view_type dual_vec_array; IE_loc_sum += elem_mass(elem_gid) * 0.5 * (current_elem_sie(elem_gid,0)+previous_elem_sie(elem_gid,0)); }, IE_sum); } + Kokkos::fence(); objective_accumulation += IE_sum * dt; } @@ -457,7 +461,6 @@ typedef MV::dual_view_type dual_vec_array; const DViewCArrayKokkos& elem_mass, const DViewCArrayKokkos& node_vel, const DViewCArrayKokkos& node_coords, const DViewCArrayKokkos& elem_sie, const size_t& rk_level, const real_t& global_dt = 0){ - size_t current_data_index, next_data_index; auto optimization_objective_regions = FEM_SGH_->simparam->optimization_options.optimization_objective_regions; auto nodes_in_elem = FEM_SGH_->nodes_in_elem; auto corner_value_storage = FEM_SGH_->corner_value_storage; @@ -496,7 +499,7 @@ typedef MV::dual_view_type dual_vec_array; } } if(contained){ - inner_product = elem_mass(elem_id) * elem_sie(elem_id); + inner_product = elem_mass(elem_id) * elem_sie(rk_level, elem_id); } } @@ -515,13 +518,13 @@ typedef MV::dual_view_type dual_vec_array; real_t inner_product; // std::cout << elem_mass(elem_id) <comm_variables(zp); FEM_SGH_->update_forward_solve(zp); + if(Explicit_Solver_Pointer_->myrank == 0){ + std::cout << "CURRENT TIME INTEGRAL OF KINETIC ENERGY " << objective_accumulation << std::endl; + } FEM_SGH_->compute_topology_optimization_adjoint_full(zp); } } From 4aad9c74df83b124c8ad0c188d0d13c710586c0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CAdrian-Diaz=E2=80=9D?= <“adriandiaz1117@gmail.com”> Date: Mon, 26 Aug 2024 21:34:20 -0600 Subject: [PATCH 17/33] ENH: taylor anvil yaml example script for optimization --- .../taylor_anvil_opt.yaml | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/taylor_anvil_opt.yaml diff --git a/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/taylor_anvil_opt.yaml b/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/taylor_anvil_opt.yaml new file mode 100644 index 000000000..116dba50a --- /dev/null +++ b/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/taylor_anvil_opt.yaml @@ -0,0 +1,96 @@ +num_dims: 3 +dynamic_options: + time_final: 20.0 + dt_min: 1.e-8 + dt_max: 1.e-2 + dt_start: 1.e-5 + cycle_stop: 2000000 + output_time_sequence_level: extreme + print_cycle: 20 + +num_dims: 3 +input_options: + mesh_file_format: ensight + mesh_file_name: mesh_z_taylorAnvil.geo + zero_index_base: false + topology_optimization_restart: false + +output_options: + timer_output_level: thorough + output_file_format: vtk + graphics_step: 5.0 + write_initial: true + write_final: false + optimization_restart_file: true + +fea_module_parameters: + - type: SGH + material_id: 0 + boundary_conditions: + # Tag X plane + - surface: + type: x_plane + plane_position: 0.0 + type: reflected + + # Tag Y plane + - surface: + type: y_plane + plane_position: 0.0 + type: reflected + + # Tag Z plane + - surface: + type: z_plane + plane_position: 0.0 + type: reflected + +materials: + - id: 0 + eos_model: ideal_gas + strength_model: none + elastic_modulus: 10 + poisson_ratio: 0.3 + maximum_limiter: true + q1: 2.0 + q2: 4.0 + q1ex: 2.0 + q2ex: 4.0 + eos_global_vars: + - 2.666666666666667 + - 1.0E-14 + - 1.0 + +regions: + - volume: + type: global + material_id: 0 + den: 1.0 + sie: 1.0e-9 + + velocity: cartesian + u: 0 + v: 0 + w: -0.5 + +optimization_options: + optimization_process: topology_optimization + optimization_objective: maximize_internal_energy + use_gradient_tally: true + use_solve_checkpoints: true + num_solve_checkpoints: 100 + disable_forward_solve_output: true + optimization_output_freq: 1 + rol_params: + subproblem_algorithm: line_search + initial_constraint_penalty: 1.e3 + step_tolerance: 1.e-3 + gradient_tolerance: 1.e-5 + constraint_tolerance: 1.e-5 + iteration_limit: 20 + density_epsilon: 0.4 + variable_outer_shell: true + constraints: + - type: mass + relation: equality + value: 0.60 From 094d80648d588182ca8acd599475325fa0d2ae9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CAdrian-Diaz=E2=80=9D?= <“adriandiaz1117@gmail.com”> Date: Wed, 28 Aug 2024 23:21:11 -0600 Subject: [PATCH 18/33] WIP: pressure vessel UI --- .../FEA_Module/Elasticity_Parameters.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Parallel-Solvers/Simulation_Parameters/FEA_Module/Elasticity_Parameters.h b/src/Parallel-Solvers/Simulation_Parameters/FEA_Module/Elasticity_Parameters.h index 71eedd88a..3bfef3e97 100644 --- a/src/Parallel-Solvers/Simulation_Parameters/FEA_Module/Elasticity_Parameters.h +++ b/src/Parallel-Solvers/Simulation_Parameters/FEA_Module/Elasticity_Parameters.h @@ -5,7 +5,7 @@ #include "yaml-serializable.h" struct Elasticity_Parameters - : virtual ImplicitModule, FEA_Module_Parameters::Register { + : virtual ImplicitModule, FEA_Module_Parameters::Register, Yaml::ValidatedYaml { bool strain_max_flag = false; bool modal_analysis = false; bool anisotropic_lattice = false; @@ -16,6 +16,7 @@ struct Elasticity_Parameters real_t constant_pressure = 0; real_t constant_stress[6]; bool constant_stress_flag = false; + bool pressure_vessel_flag = false; bool muelu_parameters_xml_file = false; std::string xml_parameters_file_name = "elasticity3D.xml"; @@ -32,8 +33,15 @@ struct Elasticity_Parameters constant_stress[3] = constant_stress[4] = constant_stress[5] = 0; } } + + void validate() { + if (pressure_vessel_flag&&!constant_pressure) { + std::cerr << "ERROR: Pressure vessel simulation requested without setting \"constant_pressure\" " << std::endl; + } + } }; IMPL_YAML_SERIALIZABLE_WITH_BASE(Elasticity_Parameters, ImplicitModule, strain_max_flag, modal_analysis, anisotropic_lattice, num_modes, smallest_modes, largest_modes, - convergence_tolerance, constant_pressure, constant_stress, muelu_parameters_xml_file, xml_parameters_file_name + convergence_tolerance, constant_pressure, constant_stress, muelu_parameters_xml_file, + xml_parameters_file_name, pressure_vessel_flag ) From 05d4b419e8092bad64707e648b8640e85666a5a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CAdrian-Diaz=E2=80=9D?= <“adriandiaz1117@gmail.com”> Date: Thu, 29 Aug 2024 14:21:32 -0600 Subject: [PATCH 19/33] DOC: remove unused params in yaml files, add new yaml example --- ...mple_opt.yaml => example_elastic_opt.yaml} | 0 .../example_implosion.yaml | 2 - .../example_sedov_sgh_opt.yaml | 2 - .../example_sgh_opt_region.yaml | 2 - .../example_sgh_opt_restart.yaml | 2 - .../Example_Yaml_Scripts/example_simple.yaml | 2 - .../implosion_vel_opt.yaml | 84 +++++++++++++++++++ 7 files changed, 84 insertions(+), 10 deletions(-) rename src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/{example_simple_opt.yaml => example_elastic_opt.yaml} (100%) create mode 100644 src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/implosion_vel_opt.yaml diff --git a/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_simple_opt.yaml b/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_elastic_opt.yaml similarity index 100% rename from src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_simple_opt.yaml rename to src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_elastic_opt.yaml diff --git a/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_implosion.yaml b/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_implosion.yaml index ea43b3273..d85f75081 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_implosion.yaml +++ b/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_implosion.yaml @@ -54,8 +54,6 @@ materials: - id: 0 eos_model: ideal_gas strength_model: none - elastic_modulus: 10 - poisson_ratio: 0.3 maximum_limiter: 1 q1: 2.0 q2: 4.0 diff --git a/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_sedov_sgh_opt.yaml b/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_sedov_sgh_opt.yaml index 6ffd94127..2d8fbe9fd 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_sedov_sgh_opt.yaml +++ b/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_sedov_sgh_opt.yaml @@ -64,8 +64,6 @@ materials: - id: 0 eos_model: ideal_gas strength_model: none - elastic_modulus: 10 - poisson_ratio: 0.3 maximum_limiter: true q1: 1.0 q2: 1.33 diff --git a/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_sgh_opt_region.yaml b/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_sgh_opt_region.yaml index 1f457dfdb..f416ee02d 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_sgh_opt_region.yaml +++ b/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_sgh_opt_region.yaml @@ -64,8 +64,6 @@ materials: - id: 0 eos_model: ideal_gas strength_model: none - elastic_modulus: 10 - poisson_ratio: 0.3 maximum_limiter: true q1: 1.0 q2: 1.33 diff --git a/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_sgh_opt_restart.yaml b/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_sgh_opt_restart.yaml index 9f5b45796..50702df5a 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_sgh_opt_restart.yaml +++ b/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_sgh_opt_restart.yaml @@ -67,8 +67,6 @@ materials: - id: 0 eos_model: ideal_gas strength_model: none - elastic_modulus: 10 - poisson_ratio: 0.3 maximum_limiter: true q1: 1.0 q2: 1.33 diff --git a/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_simple.yaml b/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_simple.yaml index 08ad95f71..8ad2b63a6 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_simple.yaml +++ b/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/example_simple.yaml @@ -61,8 +61,6 @@ materials: - id: 0 eos_model: ideal_gas strength_model: none - elastic_modulus: 10 - poisson_ratio: 0.3 q1: 1.0 q2: 1.33 q1ex: 1.0 diff --git a/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/implosion_vel_opt.yaml b/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/implosion_vel_opt.yaml new file mode 100644 index 000000000..a16f376f5 --- /dev/null +++ b/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/implosion_vel_opt.yaml @@ -0,0 +1,84 @@ +num_dims: 3 +dynamic_options: + time_final: 50.0 + dt_min: 1.e-8 + dt_max: 1.e-2 + dt_start: 1.e-5 + cycle_stop: 2000000 + +mesh_generation_options: + type: Box + origin: [0, 0, 0] + length: [1.2, 1.2, 1.2] + num_elems: [128, 128, 128] + +output_options: + timer_output_level: thorough + output_file_format: vtk + graphics_step: 10 + +fea_module_parameters: + - type: SGH + material_id: 0 + boundary_conditions: + # Tag X plane + - surface: + type: x_plane + plane_position: 0.0 + type: reflected + + # Tag Y plane + - surface: + type: y_plane + plane_position: 0.0 + type: reflected + + # Tag Z plane + - surface: + type: z_plane + plane_position: 0.0 + type: reflected + + +materials: + - id: 0 + eos_model: ideal_gas + strength_model: none + maximum_limiter: 1 + q1: 4.0 + q2: 8.0 + q1ex: 4.0 + q2ex: 8.0 + eos_global_vars: + - 1.666666666666667 + - 1.0E-14 + - 1.0 + +regions: + - volume: + type: global + material_id: 0 + den: 1.0 + sie: 1.e-9 + + velocity: spherical + speed: -0.01 + +optimization_options: + optimization_process: topology_optimization + optimization_objective: maximize_internal_energy + use_solve_checkpoints: true + num_solve_checkpoints: 100 + rol_params: + subproblem_algorithm: line_search + initial_constraint_penalty: 1.e-3 + step_tolerance: 1.e-3 + gradient_tolerance: 1.e-4 + constraint_tolerance: 1.e-5 + iteration_limit: 4 + density_epsilon: 0.4 + variable_outer_shell: true + constraints: + - type: mass + relation: equality + value: 0.60 From 8b6fd834e23a208bcdb57cb41b03a9f5cd3d9bfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CAdrian-Diaz=E2=80=9D?= <“adriandiaz1117@gmail.com”> Date: Thu, 29 Aug 2024 15:02:58 -0600 Subject: [PATCH 20/33] DOC: missing params in yaml file example --- .../Example_Yaml_Scripts/implosion_vel_opt.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/implosion_vel_opt.yaml b/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/implosion_vel_opt.yaml index a16f376f5..69b5c6b8f 100644 --- a/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/implosion_vel_opt.yaml +++ b/src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/implosion_vel_opt.yaml @@ -16,6 +16,9 @@ output_options: timer_output_level: thorough output_file_format: vtk graphics_step: 10 + write_initial: true + write_final: false + optimization_restart_file: true fea_module_parameters: - type: SGH @@ -69,6 +72,8 @@ optimization_options: optimization_objective: maximize_internal_energy use_solve_checkpoints: true num_solve_checkpoints: 100 + disable_forward_solve_output: true + optimization_output_freq: 1 rol_params: subproblem_algorithm: line_search initial_constraint_penalty: 1.e-3 From ec4b7a87486d385580c212a845261e25d434deda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CAdrian-Diaz=E2=80=9D?= <“adriandiaz1117@gmail.com”> Date: Fri, 30 Aug 2024 20:47:34 -0600 Subject: [PATCH 21/33] WIP: pressure vessel problem support --- .../FEA_Module_Elasticity.cpp | 25 +++++++++++++++--- .../FEA_Module_Thermo_Elasticity.cpp | 26 ++++++++++++++++--- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/Parallel-Solvers/Implicit-Lagrange/FEA_Physics_Modules/FEA_Module_Elasticity.cpp b/src/Parallel-Solvers/Implicit-Lagrange/FEA_Physics_Modules/FEA_Module_Elasticity.cpp index 24eed1913..32c9b27ba 100644 --- a/src/Parallel-Solvers/Implicit-Lagrange/FEA_Physics_Modules/FEA_Module_Elasticity.cpp +++ b/src/Parallel-Solvers/Implicit-Lagrange/FEA_Physics_Modules/FEA_Module_Elasticity.cpp @@ -2109,7 +2109,7 @@ void FEA_Module_Elasticity::assemble_vector(){ ViewCArray quad_coordinate_weight(pointer_quad_coordinate_weight,num_dim); ViewCArray interpolated_point(pointer_interpolated_point,num_dim); real_t force_density[3], wedge_product, Jacobian, current_density, weight_multiply, surface_normal[3], pressure, normal_displacement; - real_t resulting_term; + real_t resulting_term, vessel_term; CArray Surface_Nodes; CArrayKokkos JT_row1(num_dim); @@ -2127,7 +2127,8 @@ void FEA_Module_Elasticity::assemble_vector(){ CArrayKokkos nodal_positions(nodes_per_elem,num_dim); CArrayKokkos nodal_density(nodes_per_elem); CArrayKokkos surf_basis_values(nodes_per_elem,num_dim); - real_t constant_stress_flag = module_params->constant_stress_flag; + bool constant_stress_flag = module_params->constant_stress_flag; + bool pressure_vessel_flag = module_params->pressure_vessel_flag; //force vector initialization for(int i=0; i < num_dim*nlocal_nodes; i++) @@ -2578,7 +2579,23 @@ void FEA_Module_Elasticity::assemble_vector(){ //compute shape functions at this point for the element type elem->basis(basis_values,quad_coordinate); - + if(pressure_vessel_flag){ + current_density = 0; + if(nodal_density_flag){ + for(int node_loop=0; node_loop < elem->num_basis(); node_loop++){ + current_density += nodal_density(node_loop)*basis_values(node_loop); + } + } + //default constant element density + else{ + current_density = Element_Densities(ielem,0); + } + vessel_term = 1 - current_density; + } + else{ + vessel_term = 1; + } + //debug print //std::cout << "Current Density " << current_density << std::endl; @@ -2741,7 +2758,7 @@ void FEA_Module_Elasticity::assemble_vector(){ for(int span=0; span < Brows; span++){ resulting_term += stress_matrix(span)*B_matrix_contribution(span,icol); } - Nodal_RHS(num_dim*local_node_id + icol%num_dim,0) += weight_multiply*resulting_term*basis_values(icol/num_dim); + Nodal_RHS(num_dim*local_node_id + icol%num_dim,0) += weight_multiply*resulting_term*vessel_term*basis_values(icol/num_dim); } } }//for diff --git a/src/Parallel-Solvers/Implicit-Lagrange/FEA_Physics_Modules/FEA_Module_Thermo_Elasticity.cpp b/src/Parallel-Solvers/Implicit-Lagrange/FEA_Physics_Modules/FEA_Module_Thermo_Elasticity.cpp index 6bbde04c9..3409c2d9c 100644 --- a/src/Parallel-Solvers/Implicit-Lagrange/FEA_Physics_Modules/FEA_Module_Thermo_Elasticity.cpp +++ b/src/Parallel-Solvers/Implicit-Lagrange/FEA_Physics_Modules/FEA_Module_Thermo_Elasticity.cpp @@ -1447,7 +1447,9 @@ void FEA_Module_Thermo_Elasticity::assemble_vector(){ bool is_hex; int patch_node_count; CArray patch_local_node_ids; - real_t constant_stress_flag = module_params.constant_stress_flag; + bool constant_stress_flag = module_params.constant_stress_flag; + bool pressure_vessel_flag = module_params.pressure_vessel_flag; + //CArrayKokkos legendre_nodes_1D(num_gauss_points); //CArrayKokkos legendre_weights_1D(num_gauss_points); CArray legendre_nodes_1D(num_gauss_points); @@ -1459,7 +1461,7 @@ void FEA_Module_Thermo_Elasticity::assemble_vector(){ ViewCArray quad_coordinate_weight(pointer_quad_coordinate_weight,num_dim); ViewCArray interpolated_point(pointer_interpolated_point,num_dim); real_t force_density[3], wedge_product, Jacobian, current_density, current_temperature, weight_multiply, surface_normal[3], pressure, normal_displacement; - real_t resulting_term; + real_t resulting_term, vessel_term; CArray Surface_Nodes; CArrayKokkos JT_row1(num_dim); @@ -2206,7 +2208,23 @@ void FEA_Module_Thermo_Elasticity::assemble_vector(){ //compute shape functions at this point for the element type elem->basis(basis_values,quad_coordinate); - + + if(pressure_vessel_flag){ + current_density = 0; + if(nodal_density_flag){ + for(int node_loop=0; node_loop < elem->num_basis(); node_loop++){ + current_density += nodal_density(node_loop)*basis_values(node_loop); + } + } + //default constant element density + else{ + current_density = Element_Densities(ielem,0); + } + vessel_term = 1 - current_density; + } + else{ + vessel_term = 1; + } //debug print //std::cout << "Current Density " << current_density << std::endl; @@ -2369,7 +2387,7 @@ void FEA_Module_Thermo_Elasticity::assemble_vector(){ for(int span=0; span < Brows; span++){ resulting_term += stress_matrix(span)*B_matrix_contribution(span,icol); } - Nodal_RHS(num_dim*local_node_id + icol%num_dim,0) += weight_multiply*resulting_term*basis_values(icol/num_dim); + Nodal_RHS(num_dim*local_node_id + icol%num_dim,0) += weight_multiply*vessel_term*resulting_term*basis_values(icol/num_dim); } } }//for From 19831b89714ada6f3ee54c38c0b3cc04925b9e18 Mon Sep 17 00:00:00 2001 From: Jacob Moore Date: Wed, 28 Aug 2024 13:12:54 -0500 Subject: [PATCH 22/33] ENH: Restructuring common to seperate .cpp from .h --- single-node-refactor/src/CMakeLists.txt | 7 +- .../src/common/CMakeLists.txt | 26 + .../{ => include}/boundary_conditions.h | 0 .../common/{ => include}/dynamic_options.h | 0 .../src/common/{ => include}/geometry_new.h | 0 .../common/{ => include}/initial_conditions.h | 0 .../src/common/{ => include}/material.h | 0 .../src/common/{ => include}/mesh.h | 0 .../src/common/{ => include}/mesh_inputs.h | 0 .../src/common/{ => include}/mesh_io.h | 0 .../src/common/{ => include}/output_options.h | 0 .../src/common/{ => include}/ref_elem.h | 0 .../src/common/{ => include}/ref_surf_elem.h | 0 .../src/common/{ => include}/region.h | 0 .../src/common/{ => include}/region_fill.h | 0 .../{ => include}/simulation_parameters.h | 0 .../src/common/{ => include}/solver_inputs.h | 0 .../src/common/{ => include}/state.h | 0 .../src/common/{ => include}/string_utils.h | 0 single-node-refactor/src/common/mesh_old.h | 965 ------------------ .../src/common/simulation_state.h | 57 -- .../src/common/{ => src}/region_fill.cpp | 0 22 files changed, 30 insertions(+), 1025 deletions(-) create mode 100644 single-node-refactor/src/common/CMakeLists.txt rename single-node-refactor/src/common/{ => include}/boundary_conditions.h (100%) rename single-node-refactor/src/common/{ => include}/dynamic_options.h (100%) rename single-node-refactor/src/common/{ => include}/geometry_new.h (100%) rename single-node-refactor/src/common/{ => include}/initial_conditions.h (100%) rename single-node-refactor/src/common/{ => include}/material.h (100%) rename single-node-refactor/src/common/{ => include}/mesh.h (100%) rename single-node-refactor/src/common/{ => include}/mesh_inputs.h (100%) rename single-node-refactor/src/common/{ => include}/mesh_io.h (100%) rename single-node-refactor/src/common/{ => include}/output_options.h (100%) rename single-node-refactor/src/common/{ => include}/ref_elem.h (100%) rename single-node-refactor/src/common/{ => include}/ref_surf_elem.h (100%) rename single-node-refactor/src/common/{ => include}/region.h (100%) rename single-node-refactor/src/common/{ => include}/region_fill.h (100%) rename single-node-refactor/src/common/{ => include}/simulation_parameters.h (100%) rename single-node-refactor/src/common/{ => include}/solver_inputs.h (100%) rename single-node-refactor/src/common/{ => include}/state.h (100%) rename single-node-refactor/src/common/{ => include}/string_utils.h (100%) delete mode 100644 single-node-refactor/src/common/mesh_old.h delete mode 100644 single-node-refactor/src/common/simulation_state.h rename single-node-refactor/src/common/{ => src}/region_fill.cpp (100%) diff --git a/single-node-refactor/src/CMakeLists.txt b/single-node-refactor/src/CMakeLists.txt index ba1ba8063..24d9d7c41 100755 --- a/single-node-refactor/src/CMakeLists.txt +++ b/single-node-refactor/src/CMakeLists.txt @@ -57,8 +57,9 @@ elseif (THREADS) add_definitions(-DHAVE_THREADS=1) endif() -include_directories(common) -# add_subdirectory(Solvers/SGH_solver) +# Add common files +include_directories(common/include) +add_subdirectory(common) # Add SGH Solver include_directories(Solvers/SGH_solver_3D/include) @@ -68,5 +69,5 @@ add_subdirectory(Solvers/SGH_solver_3D) include_directories(Solvers/SGH_solver_rz/include) add_subdirectory(Solvers/SGH_solver_rz) -add_executable(Fierro main.cpp driver.cpp solver.cpp common/region_fill.cpp ${YAML_SRC_Files} ${SGH_3D_SRC_Files} ${SGH_RZ_SRC_Files}) +add_executable(Fierro main.cpp driver.cpp solver.cpp ${COMMON_Files} ${YAML_SRC_Files} ${SGH_3D_SRC_Files} ${SGH_RZ_SRC_Files}) target_link_libraries(Fierro PRIVATE matar Kokkos::kokkos) diff --git a/single-node-refactor/src/common/CMakeLists.txt b/single-node-refactor/src/common/CMakeLists.txt new file mode 100644 index 000000000..be51952df --- /dev/null +++ b/single-node-refactor/src/common/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.1.3) + +find_package(Matar REQUIRED) +find_package(Kokkos REQUIRED) + +add_definitions(-DHAVE_KOKKOS=1) + +if (CUDA) + add_definitions(-DHAVE_CUDA=1) +elseif (HIP) + add_definitions(-DHAVE_HIP=1) +elseif (OPENMP) + add_definitions(-DHAVE_OPENMP=1) +elseif (THREADS) + add_definitions(-DHAVE_THREADS=1) +endif() + +include_directories(include) +include_directories(src) + +message("\n ****** ADDING COMMON SOURCE FILES ******** \n ") + +set(COMMON_Files +${CMAKE_CURRENT_SOURCE_DIR}/src/region_fill.cpp +PARENT_SCOPE +) \ No newline at end of file diff --git a/single-node-refactor/src/common/boundary_conditions.h b/single-node-refactor/src/common/include/boundary_conditions.h similarity index 100% rename from single-node-refactor/src/common/boundary_conditions.h rename to single-node-refactor/src/common/include/boundary_conditions.h diff --git a/single-node-refactor/src/common/dynamic_options.h b/single-node-refactor/src/common/include/dynamic_options.h similarity index 100% rename from single-node-refactor/src/common/dynamic_options.h rename to single-node-refactor/src/common/include/dynamic_options.h diff --git a/single-node-refactor/src/common/geometry_new.h b/single-node-refactor/src/common/include/geometry_new.h similarity index 100% rename from single-node-refactor/src/common/geometry_new.h rename to single-node-refactor/src/common/include/geometry_new.h diff --git a/single-node-refactor/src/common/initial_conditions.h b/single-node-refactor/src/common/include/initial_conditions.h similarity index 100% rename from single-node-refactor/src/common/initial_conditions.h rename to single-node-refactor/src/common/include/initial_conditions.h diff --git a/single-node-refactor/src/common/material.h b/single-node-refactor/src/common/include/material.h similarity index 100% rename from single-node-refactor/src/common/material.h rename to single-node-refactor/src/common/include/material.h diff --git a/single-node-refactor/src/common/mesh.h b/single-node-refactor/src/common/include/mesh.h similarity index 100% rename from single-node-refactor/src/common/mesh.h rename to single-node-refactor/src/common/include/mesh.h diff --git a/single-node-refactor/src/common/mesh_inputs.h b/single-node-refactor/src/common/include/mesh_inputs.h similarity index 100% rename from single-node-refactor/src/common/mesh_inputs.h rename to single-node-refactor/src/common/include/mesh_inputs.h diff --git a/single-node-refactor/src/common/mesh_io.h b/single-node-refactor/src/common/include/mesh_io.h similarity index 100% rename from single-node-refactor/src/common/mesh_io.h rename to single-node-refactor/src/common/include/mesh_io.h diff --git a/single-node-refactor/src/common/output_options.h b/single-node-refactor/src/common/include/output_options.h similarity index 100% rename from single-node-refactor/src/common/output_options.h rename to single-node-refactor/src/common/include/output_options.h diff --git a/single-node-refactor/src/common/ref_elem.h b/single-node-refactor/src/common/include/ref_elem.h similarity index 100% rename from single-node-refactor/src/common/ref_elem.h rename to single-node-refactor/src/common/include/ref_elem.h diff --git a/single-node-refactor/src/common/ref_surf_elem.h b/single-node-refactor/src/common/include/ref_surf_elem.h similarity index 100% rename from single-node-refactor/src/common/ref_surf_elem.h rename to single-node-refactor/src/common/include/ref_surf_elem.h diff --git a/single-node-refactor/src/common/region.h b/single-node-refactor/src/common/include/region.h similarity index 100% rename from single-node-refactor/src/common/region.h rename to single-node-refactor/src/common/include/region.h diff --git a/single-node-refactor/src/common/region_fill.h b/single-node-refactor/src/common/include/region_fill.h similarity index 100% rename from single-node-refactor/src/common/region_fill.h rename to single-node-refactor/src/common/include/region_fill.h diff --git a/single-node-refactor/src/common/simulation_parameters.h b/single-node-refactor/src/common/include/simulation_parameters.h similarity index 100% rename from single-node-refactor/src/common/simulation_parameters.h rename to single-node-refactor/src/common/include/simulation_parameters.h diff --git a/single-node-refactor/src/common/solver_inputs.h b/single-node-refactor/src/common/include/solver_inputs.h similarity index 100% rename from single-node-refactor/src/common/solver_inputs.h rename to single-node-refactor/src/common/include/solver_inputs.h diff --git a/single-node-refactor/src/common/state.h b/single-node-refactor/src/common/include/state.h similarity index 100% rename from single-node-refactor/src/common/state.h rename to single-node-refactor/src/common/include/state.h diff --git a/single-node-refactor/src/common/string_utils.h b/single-node-refactor/src/common/include/string_utils.h similarity index 100% rename from single-node-refactor/src/common/string_utils.h rename to single-node-refactor/src/common/include/string_utils.h diff --git a/single-node-refactor/src/common/mesh_old.h b/single-node-refactor/src/common/mesh_old.h deleted file mode 100644 index bd6bc386a..000000000 --- a/single-node-refactor/src/common/mesh_old.h +++ /dev/null @@ -1,965 +0,0 @@ -/********************************************************************************************** -� 2020. Triad National Security, LLC. All rights reserved. -This program was produced under U.S. Government contract 89233218CNA000001 for Los Alamos -National Laboratory (LANL), which is operated by Triad National Security, LLC for the U.S. -Department of Energy/National Nuclear Security Administration. All rights in the program are -reserved by Triad National Security, LLC, and the U.S. Department of Energy/National Nuclear -Security Administration. The Government is granted for itself and others acting on its behalf a -nonexclusive, paid-up, irrevocable worldwide license in this material to reproduce, prepare -derivative works, distribute copies to the public, perform publicly and display publicly, and -to permit others to do so. -This program is open source under the BSD-3 License. -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: -1. Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, this list of -conditions and the following disclaimer in the documentation and/or other materials -provided with the distribution. -3. Neither the name of the copyright holder nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior -written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**********************************************************************************************/ -#ifndef MESH_H -#define MESH_H - -#include "matar.h" -#include "state.h" - -#define PI 3.141592653589793 - -struct boundary_condition_t; - -using namespace mtr; - -/* -========================== -Nodal indexing convention -========================== - - K - ^ J - | / - | / - | / - 7------------------6 - /| /| - / | / | - / | / | - / | / | - / | / | -4------------------5 | -| | | | ----> I -| | | | -| | | | -| | | | -| 3------------|-----2 -| / | / -| / | / -| / | / -| / | / -|/ |/ -0------------------1 - -nodes are ordered for outward normal -patch 0: [0,4,7,3] xi-minus dir -patch 1: [1,2,6,5] xi-plus dir -patch 2: [0,1,5,4] eta-minus dir -patch 3: [2,3,7,6] eta-plus dir -patch 4: [0,3,2,1] zeta-minus dir -patch 6: [4,5,6,7] zeta-plus dir - -*/ - -// sort in ascending order using bubble sort -KOKKOS_INLINE_FUNCTION -void bubble_sort(size_t arr[], const size_t num) -{ - for (size_t i = 0; i < (num - 1); i++) { - for (size_t j = 0; j < (num - i - 1); j++) { - if (arr[j] > arr[j + 1]) { - size_t temp = arr[j]; - arr[j] = arr[j + 1]; - arr[j + 1] = temp; - } // end if - } // end for j - } // end for i -} // end function - -// mesh sizes and connectivity data structures -struct Mesh_t -{ - size_t num_dims; - - size_t num_nodes; - - size_t num_elems; - size_t num_nodes_in_elem; - size_t num_patches_in_elem; - size_t num_surfs_in_elem; - size_t num_patches_in_surf; // high-order mesh class - - size_t num_corners; - - size_t num_patches; - size_t num_surfs; // high_order mesh class - - size_t num_bdy_patches; - size_t num_bdy_nodes; - size_t num_bdy_sets; - size_t num_nodes_in_patch; - - // ---- nodes ---- - - // corner ids in node - RaggedRightArrayKokkos corners_in_node; - CArrayKokkos num_corners_in_node; - - // elem ids in node - RaggedRightArrayKokkos elems_in_node; - - // node ids in node - RaggedRightArrayKokkos nodes_in_node; - CArrayKokkos num_nodes_in_node; - - // ---- elems ---- - - // node ids in elem - DCArrayKokkos nodes_in_elem; - - // corner ids in elem - CArrayKokkos corners_in_elem; - - // elem ids in elem - RaggedRightArrayKokkos elems_in_elem; - CArrayKokkos num_elems_in_elem; - - // patch ids in elem - CArrayKokkos patches_in_elem; - - // surface ids in elem - CArrayKokkos surfs_in_elem; // high-order mesh class - - // surface ids in elem - CArrayKokkos zones_in_elem; // high-order mesh class - - // ---- patches / surfaces ---- - - // node ids in a patch - CArrayKokkos nodes_in_patch; - - // element ids in a patch - CArrayKokkos elems_in_patch; - - // the two element ids sharing a surface - CArrayKokkos elems_in_surf; - - // patch ids in a surface - CArrayKokkos patches_in_surf; // high-order mesh class - - CArrayKokkos surf_in_patch; // high-order mesh class - - // ---- bdy ---- - - // bdy_patches - CArrayKokkos bdy_patches; - - // bdy nodes - CArrayKokkos bdy_nodes; - - // patch ids in bdy set - DynamicRaggedRightArrayKokkos bdy_patches_in_set; - - // node ids in bdy_patch set - RaggedRightArrayKokkos bdy_nodes_in_set; - DCArrayKokkos num_bdy_nodes_in_set; - - // initialization methods - void initialize_nodes(const size_t num_nodes_inp) - { - num_nodes = num_nodes_inp; - - return; - }; // end method - - // initialization methods - void initialize_elems(const size_t num_elems_inp, const size_t num_dims_inp) - { - num_dims = num_dims_inp; - num_nodes_in_elem = 1; - for (int dim = 0; dim < num_dims; dim++) { - num_nodes_in_elem *= 2; - } - num_elems = num_elems_inp; - nodes_in_elem = DCArrayKokkos(num_elems, num_nodes_in_elem, "mesh.nodes_in_elem"); - corners_in_elem = CArrayKokkos(num_elems, num_nodes_in_elem, "mesh.corners_in_elem"); - - return; - }; // end method - - // initialization methods - void initialize_corners(const size_t num_corners_inp) - { - num_corners = num_corners_inp; - - return; - }; // end method - - // build the corner mesh connectivity arrays - void build_corner_connectivity() - { - num_corners_in_node = CArrayKokkos(num_nodes, "mesh.num_corners_in_node"); // stride sizes - - // initializing the number of corners (node-cell pair) to be zero - FOR_ALL_CLASS(node_gid, 0, num_nodes, { - num_corners_in_node(node_gid) = 0; - }); - - for (size_t elem_gid = 0; elem_gid < num_elems; elem_gid++) { - FOR_ALL_CLASS(node_lid, 0, num_nodes_in_elem, { - // get the global_id of the node - size_t node_gid = nodes_in_elem(elem_gid, node_lid); - - // increment the number of corners attached to this point - num_corners_in_node(node_gid) = num_corners_in_node(node_gid) + 1; - }); // end FOR_ALL over nodes in element - } // end for elem_gid - - // the stride sizes are the num_corners_in_node at the node - corners_in_node = RaggedRightArrayKokkos(num_corners_in_node, "mesh.corners_in_node"); - - CArrayKokkos count_saved_corners_in_node(num_nodes, "count_saved_corners_in_node"); - - // reset num_corners to zero - FOR_ALL_CLASS(node_gid, 0, num_nodes, { - count_saved_corners_in_node(node_gid) = 0; - }); - - // he elems_in_elem data type - elems_in_node = RaggedRightArrayKokkos(num_corners_in_node, "mesh.elems_in_node"); - - // populate the elems connected to a node list and corners in a node - for (size_t elem_gid = 0; elem_gid < num_elems; elem_gid++) { - FOR_ALL_CLASS(node_lid, 0, num_nodes_in_elem, { - // get the global_id of the node - size_t node_gid = nodes_in_elem(elem_gid, node_lid); - - // the column index is the num corners saved - size_t j = count_saved_corners_in_node(node_gid); - - // Save corner index to this node_gid - size_t corner_gid = node_lid + elem_gid * num_nodes_in_elem; - corners_in_node(node_gid, j) = corner_gid; - - elems_in_node(node_gid, j) = elem_gid; // save the elem_gid - - // Save corner index to element - size_t corner_lid = node_lid; - corners_in_elem(elem_gid, corner_lid) = corner_gid; - - // increment the number of corners saved to this node_gid - count_saved_corners_in_node(node_gid) = count_saved_corners_in_node(node_gid) + 1; - }); // end FOR_ALL over nodes in element - } // end for elem_gid - - return; - } // end of build_corner_connectivity - - // build elem connectivity arrays - void build_elem_elem_connectivity() - { - // find the max number of elems around a node - size_t max_num_elems_in_node; - size_t max_num_lcl; - REDUCE_MAX_CLASS(node_gid, 0, num_nodes, max_num_lcl, { - // num_corners_in_node = num_elems_in_node - size_t max_num = num_corners_in_node(node_gid); - - if (max_num > max_num_lcl) { - max_num_lcl = max_num; - } - }, max_num_elems_in_node); // end parallel reduction on max - Kokkos::fence(); - - // a temporary ragged array to save the elems around an elem - DynamicRaggedRightArrayKokkos temp_elems_in_elem(num_nodes, num_nodes_in_elem * max_num_elems_in_node, "temp_elems_in_elem"); - - num_elems_in_elem = CArrayKokkos(num_elems, "mesh.num_elems_in_elem"); - FOR_ALL_CLASS(elem_gid, 0, num_elems, { - num_elems_in_elem(elem_gid) = 0; - }); - Kokkos::fence(); - - // find and save neighboring elem_gids of an elem - FOR_ALL_CLASS(elem_gid, 0, num_elems, { - for (int node_lid = 0; node_lid < num_nodes_in_elem; node_lid++) { - // get the gid for the node - size_t node_id = nodes_in_elem(elem_gid, node_lid); - - // loop over all elems connected to node_gid - for (int elem_lid = 0; elem_lid < num_corners_in_node(node_id); elem_lid++) { - // get the global id for the neighboring elem - size_t neighbor_elem_gid = elems_in_node(node_id, elem_lid); - - // a flag to save (=1) or not (=0) - size_t save = 1; - - // a true neighbor_elem_id is not equal to elem_gid - if (neighbor_elem_gid == elem_gid) { - save = 0; // don't save - } // end if - - // check to see if the neighbor_elem_gid has been saved already - size_t num_saved = temp_elems_in_elem.stride(elem_gid); - for (size_t i = 0; i < num_saved; i++) { - if (neighbor_elem_gid == temp_elems_in_elem(elem_gid, i)) { - save = 0; // don't save, it has been saved already - } // end if - } // end for i - - if (save == 1) { - // increment the number of neighboring elements saved - temp_elems_in_elem.stride(elem_gid)++; - - // save the neighboring elem_gid - temp_elems_in_elem(elem_gid, num_saved) = neighbor_elem_gid; - } // end if save - } // end for elem_lid in a node - } // end for node_lid in an elem - - // save the actial stride size - num_elems_in_elem(elem_gid) = temp_elems_in_elem.stride(elem_gid); - }); // end FOR_ALL elems - Kokkos::fence(); - - // compress out the extra space in the temp_elems_in_elem - elems_in_elem = RaggedRightArrayKokkos(num_elems_in_elem, "mesh.elems_in_elem"); - - FOR_ALL_CLASS(elem_gid, 0, num_elems, { - for (size_t i = 0; i < num_elems_in_elem(elem_gid); i++) { - elems_in_elem(elem_gid, i) = temp_elems_in_elem(elem_gid, i); - } // end for i - }); // end FOR_ALL elems - Kokkos::fence(); - - return; - } // end of build_elem_elem_connectivity - - // build the patches - void build_patch_connectivity() - { - size_t high_order = 0; - - // building patches - DViewCArrayKokkos node_ordering_in_elem; // node lids in a patch - - num_nodes_in_patch = 2 * (num_dims - 1); // 2 (2D) or 4 (3D) - num_patches_in_elem = 2 * num_dims; // 4 (2D) or 6 (3D) - - size_t node_lids_in_patch_in_elem[24]; - - if (num_dims == 3) { - size_t temp_node_lids[24] = { 0, 4, 7, 3, - 1, 2, 6, 5, - 0, 1, 5, 4, - 2, 3, 7, 6, - 0, 3, 2, 1, - 4, 5, 6, 7 }; - - for (size_t i = 0; i < 24; i++) { - node_lids_in_patch_in_elem[i] = temp_node_lids[i]; - } // end for i - } - else{ - // J - // | - // 3---2 - // | | -- I - // 0---1 - // - size_t temp_node_lids[8] = - { 0, 3, - 1, 2, - 0, 1, - 3, 2 }; - - for (size_t i = 0; i < 8; i++) { - node_lids_in_patch_in_elem[i] = temp_node_lids[i]; - } // end for i - } // end if on dims - - node_ordering_in_elem = DViewCArrayKokkos(&node_lids_in_patch_in_elem[0], num_patches_in_elem, num_nodes_in_patch); - - // for saviong the hash keys of the patches and then the nighboring elem_gid - CArrayKokkos hash_keys_in_elem(num_elems, num_patches_in_elem, num_nodes_in_patch, "hash_keys_in_elem"); // always 4 ids in 3D - - // for saving the adjacient patch_lid, which is the slide_lid - // CArrayKokkos neighboring_side_lids (num_elems, num_patches_in_elem); - - // allocate memory for the patches in the elem - patches_in_elem = CArrayKokkos(num_elems, num_patches_in_elem, "mesh.patches_in_elem"); - - // a temporary storaage for the patch_gids that are on the mesh boundary - CArrayKokkos temp_bdy_patches(num_elems * num_patches_in_elem, "temp_bdy_patches"); - - // step 1) calculate the hash values for each patch in the element - FOR_ALL_CLASS(elem_gid, 0, num_elems, { - for (size_t patch_lid = 0; patch_lid < num_patches_in_elem; patch_lid++) { - size_t sorted_patch_nodes[4]; // note: cannot be allocated with num_nodes_in_patch - - // first save the patch nodes - for (size_t patch_node_lid = 0; patch_node_lid < num_nodes_in_patch; patch_node_lid++) { - // get the local node index of the element for this patch and node in patch - size_t node_lid = node_ordering_in_elem(patch_lid, patch_node_lid); - - // get and save the global index of the node - sorted_patch_nodes[patch_node_lid] = nodes_in_elem(elem_gid, node_lid); - } // end for node_lid - - // sort nodes from smallest to largest - bubble_sort(sorted_patch_nodes, num_nodes_in_patch); - - // save hash_keys in the this elem - for (size_t key_lid = 0; key_lid < num_nodes_in_patch; key_lid++) { - hash_keys_in_elem(elem_gid, patch_lid, key_lid) = sorted_patch_nodes[key_lid]; // 4 node values are keys - } // for - } // end for patch_lid - }); // end FOR_ALL elem_gid - - DCArrayKokkos num_values(2); - - // 8x8x8 mesh - // num_patches = 8*8*9*3 = 1728 - // bdy_patches = 8*8*6 = 384 - // - - // step 2: walk around the elements and save the elem pairs that have the same hash_key - RUN_CLASS({ - // serial execution on GPU - - size_t patch_gid = 0; - size_t bdy_patch_gid = 0; - - for (size_t elem_gid = 0; elem_gid < num_elems; elem_gid++) { - // loop over the patches in this elem - for (size_t patch_lid = 0; patch_lid < num_patches_in_elem; patch_lid++) { - size_t exit = 0; - - // negative values mean the patch has not been saved - if (hash_keys_in_elem(elem_gid, patch_lid, 0) >= 0) { - // find the nighboring patch with the same hash_key - - for (size_t neighbor_elem_lid = 0; neighbor_elem_lid < num_elems_in_elem(elem_gid); neighbor_elem_lid++) { - // get the neighboring element global index - size_t neighbor_elem_gid = elems_in_elem(elem_gid, neighbor_elem_lid); - - for (size_t neighbor_patch_lid = 0; neighbor_patch_lid < num_patches_in_elem; neighbor_patch_lid++) { - size_t save_it = 0; - for (size_t key_lid = 0; key_lid < num_nodes_in_patch; key_lid++) { - if (hash_keys_in_elem(neighbor_elem_gid, neighbor_patch_lid, key_lid) == hash_keys_in_elem(elem_gid, patch_lid, key_lid)) { - save_it++; // if save_it == num_nodes after this loop, then it is a match - } - } // end key loop - - // this hash is from the nodes on the patch - if (save_it == num_nodes_in_patch) { - // make it negative, because we saved it - hash_keys_in_elem(elem_gid, patch_lid, 0) = -1; - hash_keys_in_elem(neighbor_elem_gid, neighbor_patch_lid, 0) = -1; - - // save the patch_lids for the adjacient sides - // neighboring_side_lids(elem_gid, patch_lid) = neighbor_patch_lid; - // neighboring_side_lids(neighbor_elem_gid, neighbor_patch_lid) = patch_lid; - - // save the patch_gid - patches_in_elem(elem_gid, patch_lid) = patch_gid; - patches_in_elem(neighbor_elem_gid, neighbor_patch_lid) = patch_gid; - - patch_gid++; - - exit = 1; - break; - } // end if - } // end for loop over a neighbors patch set - - if (exit == 1) { - break; - } - } // end for loop over elem neighbors - } // end if hash<0 - } // end for patch_lid - - // loop over the patches in this element again - // remaining postive hash key values are the boundary patches - for (size_t patch_lid = 0; patch_lid < num_patches_in_elem; patch_lid++) { - if (hash_keys_in_elem(elem_gid, patch_lid, 0) >= 0) { - hash_keys_in_elem(elem_gid, patch_lid, 0) = -1; // make it negative, because we saved it - - // neighboring_side_lids(elem_gid, patch_lid) = patch_lid; - - patches_in_elem(elem_gid, patch_lid) = patch_gid; - temp_bdy_patches(bdy_patch_gid) = patch_gid; - - patch_gid++; - bdy_patch_gid++; - } // end if - } // end for over patch_lid - } // end for over elem_gid - - // the num_values is because the values passed in are const, so a const pointer is needed - num_values(0) = patch_gid; // num_patches = patch_gid; - num_values(1) = bdy_patch_gid; // num_bdy_patches = bdy_patch_gid; - }); // end RUN - Kokkos::fence(); - - num_values.update_host(); - Kokkos::fence(); - - num_patches = num_values.host(0); - num_bdy_patches = num_values.host(1); - - // size_t mesh_1D = 60; - // size_t exact_num_patches = (mesh_1D*mesh_1D)*(mesh_1D+1)*3; - // size_t exact_num_bdy_patches = (mesh_1D*mesh_1D)*6; - // printf("num_patches = %lu, exact = %lu \n", num_patches, exact_num_patches); - // printf("num_bdy_patches = %lu exact = %lu \n", num_bdy_patches, exact_num_bdy_patches); - printf("Num patches = %lu \n", num_patches); - printf("Num boundary patches = %lu \n", num_bdy_patches); - - elems_in_patch = CArrayKokkos(num_patches, 2, "mesh.elems_in_patch"); - nodes_in_patch = CArrayKokkos(num_patches, num_nodes_in_patch, "mesh.nodes_in_patch"); - - // a temporary variable to help populate patch structures - CArrayKokkos num_elems_in_patch_saved(num_patches, "num_elems_in_patch_saved"); - - // initialize the number of elems in a patch saved to zero - FOR_ALL_CLASS(patch_gid, 0, num_patches, { - num_elems_in_patch_saved(patch_gid) = 0; - }); - - for (size_t elem_gid = 0; elem_gid < num_elems; elem_gid++) { - FOR_ALL_CLASS(patch_lid, 0, num_patches_in_elem, { - size_t patch_gid = patches_in_elem(elem_gid, patch_lid); - - size_t num_saved = num_elems_in_patch_saved(patch_gid); - - elems_in_patch(patch_gid, num_saved) = elem_gid; - - // record that an elem_gid was saved - num_elems_in_patch_saved(patch_gid)++; - - // save the nodes on this patch - for (size_t patch_node_lid = 0; patch_node_lid < num_nodes_in_patch; patch_node_lid++) { - // get the local node index of the element for this patch and node in patch - size_t node_lid = node_ordering_in_elem(patch_lid, patch_node_lid); - - // get and save the global index of the node - nodes_in_patch(patch_gid, patch_node_lid) = nodes_in_elem(elem_gid, node_lid); - } // end for node_lid - }); // end FOR_ALL patch_lid - } // end for - - // Surfaces and patches in surface - if (high_order == 1) { - num_surfs_in_elem = 2 * num_dims; // 4 (2D) or 6 (3D) - num_patches_in_surf = 1; // =Pn_order, must update for high-order mesh class - - // allocate memory for the surfaces in the elem - surfs_in_elem = CArrayKokkos(num_elems, num_surfs_in_elem, "mesh.surfs_in_elem"); - - // allocate memory for surface data structures - num_surfs = num_patches / num_patches_in_surf; - - patches_in_surf = CArrayKokkos(num_surfs, num_patches_in_surf, "mesh.patches_in_surf"); - elems_in_surf = CArrayKokkos(num_surfs, 2, "mesh.elems_in_surf"); - surf_in_patch = CArrayKokkos(num_patches, "mesh.surf_in_patch"); - - FOR_ALL_CLASS(surf_gid, 0, num_surfs, { - // loop over the patches in this surface - for (size_t patch_lid = 0; patch_lid < num_patches_in_surf; patch_lid++) { - // get patch_gid - size_t patch_gid = patch_lid + surf_gid * num_patches_in_surf; - - // save the patch_gids - patches_in_surf(surf_gid, patch_lid) = patch_gid; - - // save the surface this patch belongs to - surf_in_patch(patch_gid) = surf_gid; - } // end for - - // get first patch in the surface, and populate elem surface structures - size_t this_patch_gid = surf_gid * num_patches_in_surf; - - elems_in_surf(surf_gid, 0) = elems_in_patch(this_patch_gid, 0); // elem_gid0 - elems_in_surf(surf_gid, 1) = elems_in_patch(this_patch_gid, 1); // elem_gid1 - }); // end FOR_ALL over surfaces - - // save surfaces in elem - FOR_ALL_CLASS(elem_gid, 0, num_elems, { - for (size_t surf_lid = 0; surf_lid < num_surfs_in_elem; surf_lid++) { - // get the local patch_lid - size_t patch_lid = surf_lid * num_patches_in_surf; - - // get the patch_gids in this element - size_t patch_gid = patches_in_elem(elem_gid, patch_lid); - - // save the surface gid - surfs_in_elem(elem_gid, surf_lid) = surf_in_patch(patch_gid); - } // end surf_lid - }); - } // end of high-order mesh objects - - // ---------------- - - // allocate memory for boundary patches - bdy_patches = CArrayKokkos(num_bdy_patches, "mesh.bdy_patches"); - - FOR_ALL_CLASS(bdy_patch_gid, 0, num_bdy_patches, { - bdy_patches(bdy_patch_gid) = temp_bdy_patches(bdy_patch_gid); - }); // end FOR_ALL bdy_patch_gid - - // find and store the boundary nodes - CArrayKokkos temp_bdy_nodes(num_nodes); - CArrayKokkos hash_bdy_nodes(num_nodes); - - FOR_ALL_CLASS(node_gid, 0, num_nodes, { - hash_bdy_nodes(node_gid) = -1; - }); // end for node_gid - - // Parallel loop over boundary patches - DCArrayKokkos num_bdy_nodes_saved(1); - - RUN_CLASS({ - num_bdy_nodes_saved(0) = 0; - for (size_t bdy_patch_gid = 0; bdy_patch_gid < num_bdy_patches; bdy_patch_gid++) { - // get the global index of the patch that is on the boundary - size_t patch_gid = bdy_patches(bdy_patch_gid); - - // tag the boundary nodes - for (size_t node_lid = 0; node_lid < num_nodes_in_patch; node_lid++) { - size_t node_gid = nodes_in_patch(patch_gid, node_lid); - - if (hash_bdy_nodes(node_gid) < 0) { - hash_bdy_nodes(node_gid) = node_gid; - temp_bdy_nodes(num_bdy_nodes_saved(0)) = node_gid; - - // printf("bdy_node = %lu \n", node_gid); - num_bdy_nodes_saved(0)++; - } // end if - } // end for node_lid - } // end for loop over bdy_patch_gid - }); // end RUN - Kokkos::fence(); - - // copy value to host (CPU) - num_bdy_nodes_saved.update_host(); - Kokkos::fence(); - - // save the number of bdy_nodes to Mesh_t - num_bdy_nodes = num_bdy_nodes_saved.host(0); - - bdy_nodes = CArrayKokkos(num_bdy_nodes, "mesh.bdy_nodes"); - - FOR_ALL_CLASS(node_gid, 0, num_bdy_nodes, { - bdy_nodes(node_gid) = temp_bdy_nodes(node_gid); - }); // end for boundary node_gid - - printf("Num boundary nodes = %lu \n", num_bdy_nodes); - - return; - } // end patch connectivity method - - // build the node-node connectivity - void build_node_node_connectivity() - { - // find the max number of elems around a node - size_t max_num_elems_in_node; - size_t max_num_lcl; - REDUCE_MAX_CLASS(node_gid, 0, num_nodes, max_num_lcl, { - // num_corners_in_node = num_elems_in_node - size_t max_num = num_corners_in_node(node_gid); - - if (max_num > max_num_lcl) { - max_num_lcl = max_num; - } - }, max_num_elems_in_node); // end parallel reduction on max - Kokkos::fence(); - - // each elem corner will contribute 3 edges to the node. Those edges will likely be the same - // ones from an adjacent element so it is a safe estimate to multiply by 3 - DynamicRaggedRightArrayKokkos temp_nodes_in_nodes(num_nodes, max_num_elems_in_node * 3, "temp_nodes_in_nodes"); - - num_nodes_in_node = CArrayKokkos(num_nodes, "mesh.num_nodes_in_node"); - - // walk over the patches and save the node node connectivity - RUN_CLASS({ - if (num_dims == 3) { - for (size_t patch_gid = 0; patch_gid < num_patches; patch_gid++) { - for (size_t node_lid = 0; node_lid < num_nodes_in_patch; node_lid++) { - // the first node on the edge - size_t node_gid_0 = nodes_in_patch(patch_gid, node_lid); - - // second node on this edge - size_t node_gid_1; - - if (node_lid == num_nodes_in_patch - 1) { - node_gid_1 = nodes_in_patch(patch_gid, 0); - } - else{ - node_gid_1 = nodes_in_patch(patch_gid, node_lid + 1); - } // end if - - size_t num_saved_0 = temp_nodes_in_nodes.stride(node_gid_0); - size_t num_saved_1 = temp_nodes_in_nodes.stride(node_gid_1); - - size_t save_0 = 1; - size_t save_1 = 1; - - // check to see if the node_gid_1 was already saved - for (size_t contents_lid = 0; contents_lid < num_saved_0; contents_lid++) { - if (temp_nodes_in_nodes(node_gid_0, contents_lid) == node_gid_1) { - save_0 = 0; // don't save, it was already saved - } - } - - // check to see if the node_gid_0 was already saved - for (size_t contents_lid = 0; contents_lid < num_saved_1; contents_lid++) { - if (temp_nodes_in_nodes(node_gid_1, contents_lid) == node_gid_0) { - save_1 = 0; // don't save, it was already saved - } - } - - if (save_0 == 1) { - // increment the number of nodes in a node saved - temp_nodes_in_nodes.stride(node_gid_0)++; - - // save the second node to the first node - temp_nodes_in_nodes(node_gid_0, num_saved_0) = node_gid_1; - } - - if (save_1 == 1) { - // increment the number of nodes in a node saved - temp_nodes_in_nodes.stride(node_gid_1)++; - - // save the first node to the second node - temp_nodes_in_nodes(node_gid_1, num_saved_1) = node_gid_0; - } - - // save the strides - num_nodes_in_node(node_gid_0) = temp_nodes_in_nodes.stride(node_gid_0); - num_nodes_in_node(node_gid_1) = temp_nodes_in_nodes.stride(node_gid_1); - } // end for node in patch - } // end for patches - } // end if 3D - else{ - for (size_t patch_gid = 0; patch_gid < num_patches; patch_gid++) { - // the first node on the edge - size_t node_gid_0 = nodes_in_patch(patch_gid, 0); - - // second node on this edge - size_t node_gid_1 = nodes_in_patch(patch_gid, 1); - - size_t num_saved_0 = temp_nodes_in_nodes.stride(node_gid_0); - size_t num_saved_1 = temp_nodes_in_nodes.stride(node_gid_1); - - // increment the number of nodes in a node saved - temp_nodes_in_nodes.stride(node_gid_0)++; - temp_nodes_in_nodes.stride(node_gid_1)++; - - // save the second node to the first node - temp_nodes_in_nodes(node_gid_0, num_saved_0) = node_gid_1; - - // save the first node to the second node - temp_nodes_in_nodes(node_gid_1, num_saved_1) = node_gid_0; - - // save the strides - num_nodes_in_node(node_gid_0) = temp_nodes_in_nodes.stride(node_gid_0); - num_nodes_in_node(node_gid_1) = temp_nodes_in_nodes.stride(node_gid_1); - } // end for patches - } // end if 2D - }); // end RUN - Kokkos::fence(); - - nodes_in_node = RaggedRightArrayKokkos(num_nodes_in_node, "mesh.nodes_in_node"); - - // save the connectivity - FOR_ALL_CLASS(node_gid, 0, num_nodes, { - size_t num_saved = 0; - for (size_t node_lid = 0; node_lid < num_nodes_in_node(node_gid); node_lid++) { - nodes_in_node(node_gid, num_saved) = temp_nodes_in_nodes(node_gid, num_saved); - - // increment the number of nodes in node saved - num_saved++; - } // end for node_lid - }); // end parallel for over nodes - } // end of node node connectivity - - ///////////////////////////////////////////////////////////////////////////// - /// - /// \fn build_connectivity - /// - /// \brief Calls multiple build connectivity function - /// - ///////////////////////////////////////////////////////////////////////////// - void build_connectivity() - { - build_corner_connectivity(); - build_elem_elem_connectivity(); - build_patch_connectivity(); - build_node_node_connectivity(); - } - - ///////////////////////////////////////////////////////////////////////////// - /// - /// \fn init_bdy_sets - /// - /// \brief Initializes memory for boundary sets - /// - ///////////////////////////////////////////////////////////////////////////// - void init_bdy_sets(size_t num_bcs) - { - if (num_bcs == 0) { - printf("ERROR: number of boundary sets = 0, set it = 1"); - num_bcs = 1; - } - num_bdy_sets = num_bcs; - bdy_patches_in_set = DynamicRaggedRightArrayKokkos(num_bcs, num_bdy_patches, "mesh.bdy_patches_in_set"); - - return; - } // end of init_bdy_sets method - - ///////////////////////////////////////////////////////////////////////////// - /// - /// \fn build_boundry_node_sets - /// - /// REMOVE TO SETUP - /// - ///////////////////////////////////////////////////////////////////////////// - void build_boundry_node_sets(const CArrayKokkos& boundary, - Mesh_t& mesh) - { - // build boundary nodes in each boundary set - mesh.num_bdy_nodes_in_set = DCArrayKokkos(mesh.num_bdy_sets, "mesh.num_bdy_nodes_in_set"); - CArrayKokkos temp_count_num_bdy_nodes_in_set(mesh.num_bdy_sets, mesh.num_nodes, "temp_count_num_bdy_nodes_in_set"); - - DynamicRaggedRightArrayKokkos temp_nodes_in_set(mesh.num_bdy_sets, mesh.num_bdy_patches * mesh.num_nodes_in_patch, "temp_nodes_in_set"); - - // Parallel loop over boundary sets on device - FOR_ALL(bdy_set, 0, mesh.num_bdy_sets, { - // finde the number of patches_in_set - size_t num_bdy_patches_in_set = mesh.bdy_patches_in_set.stride(bdy_set); - - // Loop over boundary patches in boundary set - for (size_t bdy_patch_gid = 0; bdy_patch_gid < num_bdy_patches_in_set; bdy_patch_gid++) { - // get the global id for this boundary patch - size_t patch_gid = mesh.bdy_patches_in_set(bdy_set, bdy_patch_gid); - - // apply boundary condition at nodes on boundary - for (size_t node_lid = 0; node_lid < mesh.num_nodes_in_patch; node_lid++) { - size_t node_gid = mesh.nodes_in_patch(patch_gid, node_lid); - - temp_count_num_bdy_nodes_in_set(bdy_set, node_gid) = -1; - } // end for node_lid - } // end for bdy_patch_gid - - // Loop over boundary patches in boundary set - for (size_t bdy_patch_gid = 0; bdy_patch_gid < num_bdy_patches_in_set; bdy_patch_gid++) { - // get the global id for this boundary patch - size_t patch_gid = mesh.bdy_patches_in_set(bdy_set, bdy_patch_gid); - - // apply boundary condition at nodes on boundary - for (size_t node_lid = 0; node_lid < mesh.num_nodes_in_patch; node_lid++) { - size_t node_gid = mesh.nodes_in_patch(patch_gid, node_lid); - - if (temp_count_num_bdy_nodes_in_set(bdy_set, node_gid) == -1) { - size_t num_saved = mesh.num_bdy_nodes_in_set(bdy_set); - - mesh.num_bdy_nodes_in_set(bdy_set)++; - - // replace -1 with node_gid to denote the node was already saved - temp_count_num_bdy_nodes_in_set(bdy_set, node_gid) = node_gid; - - // increment the number of saved nodes, create memory - temp_nodes_in_set.stride(bdy_set)++; - temp_nodes_in_set(bdy_set, num_saved) = node_gid; - } // end if - } // end for node_lid - } // end for bdy_patch_gid - }); // end FOR_ALL bdy_set - Kokkos::fence(); - - // allocate the RaggedRight bdy_nodes_in_set array - mesh.bdy_nodes_in_set = RaggedRightArrayKokkos(mesh.num_bdy_nodes_in_set); - - FOR_ALL(bdy_set, 0, mesh.num_bdy_sets, { - // Loop over boundary patches in boundary set - for (size_t bdy_node_lid = 0; bdy_node_lid < mesh.num_bdy_nodes_in_set(bdy_set); bdy_node_lid++) { - // save the bdy_node_gid - mesh.bdy_nodes_in_set(bdy_set, bdy_node_lid) = temp_nodes_in_set(bdy_set, bdy_node_lid); - } // end for - }); // end FOR_ALL bdy_set - - // update the host side for the number nodes in a bdy_set - mesh.num_bdy_nodes_in_set.update_host(); - - return; - } // end method to build boundary nodes -}; // end Mesh_t - -void ensight(const Mesh_t& mesh, - const DCArrayKokkos& node_coords, - const DCArrayKokkos& node_vel, - const DCArrayKokkos& node_mass, - const DCArrayKokkos& elem_den, - const DCArrayKokkos& elem_pres, - const DCArrayKokkos& elem_stress, - const DCArrayKokkos& elem_sspd, - const DCArrayKokkos& elem_sie, - const DCArrayKokkos& elem_vol, - const DCArrayKokkos& elem_mass, - const DCArrayKokkos& elem_mat_id, - CArray& graphics_times, - size_t& graphics_id, - const double time_value); - -void state_file(const Mesh_t& mesh, - const DCArrayKokkos& node_coords, - const DCArrayKokkos& node_vel, - const DCArrayKokkos& node_mass, - const DCArrayKokkos& elem_den, - const DCArrayKokkos& elem_pres, - const DCArrayKokkos& elem_stress, - const DCArrayKokkos& elem_sspd, - const DCArrayKokkos& elem_sie, - const DCArrayKokkos& elem_vol, - const DCArrayKokkos& elem_mass, - const DCArrayKokkos& elem_mat_id, - const double time_value); - -void user_model_init(const DCArrayKokkos& file_state_vars, - const size_t num_state_vars, - const size_t mat_id, - const size_t num_elems); - -KOKKOS_FUNCTION -void decompose_vel_grad(ViewCArrayKokkos& D_tensor, - ViewCArrayKokkos& W_tensor, - const ViewCArrayKokkos& vel_grad, - const ViewCArrayKokkos& elem_node_gids, - const size_t elem_gid, - const DCArrayKokkos& node_coords, - const DCArrayKokkos& node_vel, - const double vol); - -#endif diff --git a/single-node-refactor/src/common/simulation_state.h b/single-node-refactor/src/common/simulation_state.h deleted file mode 100644 index 83e8abf97..000000000 --- a/single-node-refactor/src/common/simulation_state.h +++ /dev/null @@ -1,57 +0,0 @@ -/********************************************************************************************** -� 2020. Triad National Security, LLC. All rights reserved. -This program was produced under U.S. Government contract 89233218CNA000001 for Los Alamos -National Laboratory (LANL), which is operated by Triad National Security, LLC for the U.S. -Department of Energy/National Nuclear Security Administration. All rights in the program are -reserved by Triad National Security, LLC, and the U.S. Department of Energy/National Nuclear -Security Administration. The Government is granted for itself and others acting on its behalf a -nonexclusive, paid-up, irrevocable worldwide license in this material to reproduce, prepare -derivative works, distribute copies to the public, perform publicly and display publicly, and -to permit others to do so. -This program is open source under the BSD-3 License. -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: -1. Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, this list of -conditions and the following disclaimer in the documentation and/or other materials -provided with the distribution. -3. Neither the name of the copyright holder nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior -written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**********************************************************************************************/ - -#ifndef FIERRO_SIM_STATE_H -#define FIERRO_SIM_STATE_H -#include -#include "matar.h" - -#include "state.h" - -///////////////////////////////////////////////////////////////////////////// -/// -/// \struct simulation_state_t -/// -/// \brief Struct for holding state entities for Fierro, currently unused... -/// -///////////////////////////////////////////////////////////////////////////// -struct simulation_state_t -{ - // MaterialPoint_t MaterialPoints; - // node_t node; - // corner_t corner; - // zone_t zone; -}; // simulation_state_t - -#endif // end Header Guard \ No newline at end of file diff --git a/single-node-refactor/src/common/region_fill.cpp b/single-node-refactor/src/common/src/region_fill.cpp similarity index 100% rename from single-node-refactor/src/common/region_fill.cpp rename to single-node-refactor/src/common/src/region_fill.cpp From ed88b8c0c21fcfedc96710dc18f0299ae032363e Mon Sep 17 00:00:00 2001 From: Jacob Moore Date: Wed, 28 Aug 2024 13:35:46 -0500 Subject: [PATCH 23/33] ENH: Cleanup geometry --- .../src/common/CMakeLists.txt | 1 + .../src/common/include/geometry_new.h | 559 +------------ .../src/common/src/geometry_new.cpp | 750 ++++++++++++++++++ 3 files changed, 771 insertions(+), 539 deletions(-) create mode 100644 single-node-refactor/src/common/src/geometry_new.cpp diff --git a/single-node-refactor/src/common/CMakeLists.txt b/single-node-refactor/src/common/CMakeLists.txt index be51952df..c8824f6e1 100644 --- a/single-node-refactor/src/common/CMakeLists.txt +++ b/single-node-refactor/src/common/CMakeLists.txt @@ -22,5 +22,6 @@ message("\n ****** ADDING COMMON SOURCE FILES ******** \n ") set(COMMON_Files ${CMAKE_CURRENT_SOURCE_DIR}/src/region_fill.cpp +${CMAKE_CURRENT_SOURCE_DIR}/src/geometry_new.cpp PARENT_SCOPE ) \ No newline at end of file diff --git a/single-node-refactor/src/common/include/geometry_new.h b/single-node-refactor/src/common/include/geometry_new.h index 01164cb35..e8277d45b 100644 --- a/single-node-refactor/src/common/include/geometry_new.h +++ b/single-node-refactor/src/common/include/geometry_new.h @@ -67,201 +67,11 @@ namespace geometry /// \param View of the elements node ids /// ///////////////////////////////////////////////////////////////////////////// -KOKKOS_INLINE_FUNCTION +KOKKOS_FUNCTION void get_bmatrix(const ViewCArrayKokkos& B_matrix, const size_t elem_gid, const DCArrayKokkos& node_coords, - const ViewCArrayKokkos& elem_node_gids) -{ - const size_t num_nodes = 8; - - double x_array[8]; - double y_array[8]; - double z_array[8]; - - // x, y, z coordinates of elem vertices - auto x = ViewCArrayKokkos(x_array, num_nodes); - auto y = ViewCArrayKokkos(y_array, num_nodes); - auto z = ViewCArrayKokkos(z_array, num_nodes); - - // get the coordinates of the nodes(rk,elem,node) in this element - for (int node_lid = 0; node_lid < num_nodes; node_lid++) { - x(node_lid) = node_coords(1, elem_node_gids(node_lid), 0); - y(node_lid) = node_coords(1, elem_node_gids(node_lid), 1); - z(node_lid) = node_coords(1, elem_node_gids(node_lid), 2); - } // end for - - - double twelth = 1. / 12.; - - B_matrix(0, 0) = (+y(1) * (-z(3) - z(2) + z(4) + z(5) ) - + y(3) * (+z(1) - z(2) ) - + y(2) * (+z(1) + z(3) - z(4) - z(6) ) - + y(4) * (-z(1) + z(2) - z(5) + z(6) ) - + y(5) * (-z(1) + z(4) ) - + y(6) * (+z(2) - z(4) ) ) * twelth; - - B_matrix(1, 0) = (+y(0) * (+z(3) + z(2) - z(4) - z(5) ) - + y(3) * (-z(0) - z(2) + z(5) + z(7) ) - + y(2) * (-z(0) + z(3) ) - + y(4) * (+z(0) - z(5) ) - + y(5) * (+z(0) - z(3) + z(4) - z(7) ) - + y(7) * (-z(3) + z(5) ) ) * twelth; - - B_matrix(2, 0) = (+y(0) * (-z(1) - z(3) + z(4) + z(6) ) - + y(1) * (+z(0) - z(3) ) - + y(3) * (+z(0) + z(1) - z(7) - z(6) ) - + y(4) * (-z(0) + z(6) ) - + y(7) * (+z(3) - z(6) ) - + y(6) * (-z(0) + z(3) - z(4) + z(7) ) ) * twelth; - - B_matrix(3, 0) = (+y(0) * (-z(1) + z(2) ) - + y(1) * (+z(0) + z(2) - z(5) - z(7) ) - + y(2) * (-z(0) - z(1) + z(7) + z(6) ) - + y(5) * (+z(1) - z(7) ) - + y(7) * (+z(1) - z(2) + z(5) - z(6) ) - + y(6) * (-z(2) + z(7) ) ) * twelth; - - B_matrix(4, 0) = (+y(0) * (+z(1) - z(2) + z(5) - z(6) ) - + y(1) * (-z(0) + z(5) ) - + y(2) * (+z(0) - z(6) ) - + y(5) * (-z(0) - z(1) + z(7) + z(6) ) - + y(7) * (-z(5) + z(6) ) - + y(6) * (+z(0) + z(2) - z(5) - z(7) ) ) * twelth; - - B_matrix(5, 0) = (+y(0) * (+z(1) - z(4) ) - + y(1) * (-z(0) + z(3) - z(4) + z(7) ) - + y(3) * (-z(1) + z(7) ) - + y(4) * (+z(0) + z(1) - z(7) - z(6) ) - + y(7) * (-z(1) - z(3) + z(4) + z(6) ) - + y(6) * (+z(4) - z(7) ) ) * twelth; - - B_matrix(6, 0) = (+y(0) * (-z(2) + z(4) ) - + y(3) * (+z(2) - z(7) ) - + y(2) * (+z(0) - z(3) + z(4) - z(7) ) - + y(4) * (-z(0) - z(2) + z(5) + z(7) ) - + y(5) * (-z(4) + z(7) ) - + y(7) * (+z(3) + z(2) - z(4) - z(5) ) ) * twelth; - - B_matrix(7, 0) = (+y(1) * (+z(3) - z(5) ) - + y(3) * (-z(1) + z(2) - z(5) + z(6) ) - + y(2) * (-z(3) + z(6) ) - + y(4) * (+z(5) - z(6) ) - + y(5) * (+z(1) + z(3) - z(4) - z(6) ) - + y(6) * (-z(3) - z(2) + z(4) + z(5) ) ) * twelth; - - B_matrix(0, 1) = (+z(1) * (-x(3) - x(2) + x(4) + x(5) ) - + z(3) * (+x(1) - x(2) ) - + z(2) * (+x(1) + x(3) - x(4) - x(6) ) - + z(4) * (-x(1) + x(2) - x(5) + x(6) ) - + z(5) * (-x(1) + x(4) ) - + z(6) * (+x(2) - x(4) ) ) * twelth; - - B_matrix(1, 1) = (+z(0) * (+x(3) + x(2) - x(4) - x(5) ) - + z(3) * (-x(0) - x(2) + x(5) + x(7) ) - + z(2) * (-x(0) + x(3) ) - + z(4) * (+x(0) - x(5) ) - + z(5) * (+x(0) - x(3) + x(4) - x(7) ) - + z(7) * (-x(3) + x(5) ) ) * twelth; - - B_matrix(2, 1) = (+z(0) * (-x(1) - x(3) + x(4) + x(6) ) - + z(1) * (+x(0) - x(3) ) - + z(3) * (+x(0) + x(1) - x(7) - x(6) ) - + z(4) * (-x(0) + x(6) ) - + z(7) * (+x(3) - x(6) ) - + z(6) * (-x(0) + x(3) - x(4) + x(7) ) ) * twelth; - - B_matrix(3, 1) = (+z(0) * (-x(1) + x(2) ) - + z(1) * (+x(0) + x(2) - x(5) - x(7) ) - + z(2) * (-x(0) - x(1) + x(7) + x(6) ) - + z(5) * (+x(1) - x(7) ) - + z(7) * (+x(1) - x(2) + x(5) - x(6) ) - + z(6) * (-x(2) + x(7) ) ) * twelth; - - B_matrix(4, 1) = (+z(0) * (+x(1) - x(2) + x(5) - x(6) ) - + z(1) * (-x(0) + x(5) ) - + z(2) * (+x(0) - x(6) ) - + z(5) * (-x(0) - x(1) + x(7) + x(6) ) - + z(7) * (-x(5) + x(6) ) - + z(6) * (+x(0) + x(2) - x(5) - x(7) ) ) * twelth; - - B_matrix(5, 1) = (+z(0) * (+x(1) - x(4) ) - + z(1) * (-x(0) + x(3) - x(4) + x(7) ) - + z(3) * (-x(1) + x(7) ) - + z(4) * (+x(0) + x(1) - x(7) - x(6) ) - + z(7) * (-x(1) - x(3) + x(4) + x(6) ) - + z(6) * (+x(4) - x(7) ) ) * twelth; - - B_matrix(6, 1) = (+z(0) * (-x(2) + x(4) ) - + z(3) * (+x(2) - x(7) ) - + z(2) * (+x(0) - x(3) + x(4) - x(7) ) - + z(4) * (-x(0) - x(2) + x(5) + x(7) ) - + z(5) * (-x(4) + x(7) ) - + z(7) * (+x(3) + x(2) - x(4) - x(5) ) ) * twelth; - - B_matrix(7, 1) = (+z(1) * (+x(3) - x(5) ) - + z(3) * (-x(1) + x(2) - x(5) + x(6) ) - + z(2) * (-x(3) + x(6) ) - + z(4) * (+x(5) - x(6) ) - + z(5) * (+x(1) + x(3) - x(4) - x(6) ) - + z(6) * (-x(3) - x(2) + x(4) + x(5) ) ) * twelth; - - B_matrix(0, 2) = (+x(1) * (-y(3) - y(2) + y(4) + y(5) ) - + x(3) * (+y(1) - y(2) ) - + x(2) * (+y(1) + y(3) - y(4) - y(6) ) - + x(4) * (-y(1) + y(2) - y(5) + y(6) ) - + x(5) * (-y(1) + y(4) ) - + x(6) * (+y(2) - y(4) ) ) * twelth; - - B_matrix(1, 2) = (+x(0) * (+y(3) + y(2) - y(4) - y(5) ) - + x(3) * (-y(0) - y(2) + y(5) + y(7) ) - + x(2) * (-y(0) + y(3) ) - + x(4) * (+y(0) - y(5) ) - + x(5) * (+y(0) - y(3) + y(4) - y(7) ) - + x(7) * (-y(3) + y(5) ) ) * twelth; - - B_matrix(2, 2) = (+x(0) * (-y(1) - y(3) + y(4) + y(6) ) - + x(1) * (+y(0) - y(3) ) - + x(3) * (+y(0) + y(1) - y(7) - y(6) ) - + x(4) * (-y(0) + y(6) ) - + x(7) * (+y(3) - y(6) ) - + x(6) * (-y(0) + y(3) - y(4) + y(7) ) ) * twelth; - - B_matrix(3, 2) = (+x(0) * (-y(1) + y(2) ) - + x(1) * (+y(0) + y(2) - y(5) - y(7) ) - + x(2) * (-y(0) - y(1) + y(7) + y(6) ) - + x(5) * (+y(1) - y(7) ) - + x(7) * (+y(1) - y(2) + y(5) - y(6) ) - + x(6) * (-y(2) + y(7) ) ) * twelth; - - B_matrix(4, 2) = (+x(0) * (+y(1) - y(2) + y(5) - y(6) ) - + x(1) * (-y(0) + y(5) ) - + x(2) * (+y(0) - y(6) ) - + x(5) * (-y(0) - y(1) + y(7) + y(6) ) - + x(7) * (-y(5) + y(6) ) - + x(6) * (+y(0) + y(2) - y(5) - y(7) ) ) * twelth; - - B_matrix(5, 2) = (+x(0) * (+y(1) - y(4) ) - + x(1) * (-y(0) + y(3) - y(4) + y(7) ) - + x(3) * (-y(1) + y(7) ) - + x(4) * (+y(0) + y(1) - y(7) - y(6) ) - + x(7) * (-y(1) - y(3) + y(4) + y(6) ) - + x(6) * (+y(4) - y(7) ) ) * twelth; - - B_matrix(6, 2) = (+x(0) * (-y(2) + y(4) ) - + x(3) * (+y(2) - y(7) ) - + x(2) * (+y(0) - y(3) + y(4) - y(7) ) - + x(4) * (-y(0) - y(2) + y(5) + y(7) ) - + x(5) * (-y(4) + y(7) ) - + x(7) * (+y(3) + y(2) - y(4) - y(5) ) ) * twelth; - - B_matrix(7, 2) = (+x(1) * (+y(3) - y(5) ) - + x(3) * (-y(1) + y(2) - y(5) + y(6) ) - + x(2) * (-y(3) + y(6) ) - + x(4) * (+y(5) - y(6) ) - + x(5) * (+y(1) + y(3) - y(4) - y(6) ) - + x(6) * (-y(3) - y(2) + y(4) + y(5) ) ) * twelth; -} // end subroutine + const ViewCArrayKokkos& elem_node_gids); ///////////////////////////////////////////////////////////////////////////// /// @@ -275,39 +85,11 @@ void get_bmatrix(const ViewCArrayKokkos& B_matrix, /// \param Global ids of the nodes in this element /// ///////////////////////////////////////////////////////////////////////////// -KOKKOS_INLINE_FUNCTION +KOKKOS_FUNCTION void get_vol_quad(const DCArrayKokkos& elem_vol, const size_t elem_gid, const DCArrayKokkos& node_coords, - const ViewCArrayKokkos& elem_node_gids) -{ - elem_vol(elem_gid) = 0.0; - - const size_t num_nodes = 4; - - double x_array[4]; - double y_array[4]; - - // x, y coordinates of elem vertices - auto x = ViewCArrayKokkos(x_array, num_nodes); - auto y = ViewCArrayKokkos(y_array, num_nodes); - - // get the coordinates of the nodes(rk,elem,node) in this element - for (int node_lid = 0; node_lid < num_nodes; node_lid++) { - x(node_lid) = node_coords(1, elem_node_gids(node_lid), 0); - y(node_lid) = node_coords(1, elem_node_gids(node_lid), 1); - } // end for - - /* ensight node order 0 1 2 3 - Flanaghan node order 3 4 1 2 - */ - elem_vol(elem_gid) = - ( (y(2) + y(3) + y(0)) * ((y(2) - y(3)) * (x(0) - x(3)) - (y(0) - y(3)) * (x(2) - x(3)) ) - + (y(0) + y(1) + y(2)) * ((y(0) - y(1)) * (x(2) - x(1)) - (y(2) - y(1)) * (x(0) - x(1))) ) / 6.0; - - elem_vol(elem_gid) = fmax(elem_vol(elem_gid), 1.0E-14); - return; -} // end subroutine + const ViewCArrayKokkos& elem_node_gids); ///////////////////////////////////////////////////////////////////////////// /// @@ -321,50 +103,11 @@ void get_vol_quad(const DCArrayKokkos& elem_vol, /// \param Runge Kutta time integration level /// ///////////////////////////////////////////////////////////////////////////// -KOKKOS_INLINE_FUNCTION +KOKKOS_FUNCTION void get_vol_hex(const DCArrayKokkos& elem_vol, const size_t elem_gid, const DCArrayKokkos& node_coords, - const ViewCArrayKokkos& elem_node_gids) -{ - const size_t num_nodes = 8; - - double x_array[8]; - double y_array[8]; - double z_array[8]; - - // x, y, z coordinates of elem vertices - auto x = ViewCArrayKokkos(x_array, num_nodes); - auto y = ViewCArrayKokkos(y_array, num_nodes); - auto z = ViewCArrayKokkos(z_array, num_nodes); - - // get the coordinates of the nodes(rk,elem,node) in this element - for (int node_lid = 0; node_lid < num_nodes; node_lid++) { - x(node_lid) = node_coords(1, elem_node_gids(node_lid), 0); - y(node_lid) = node_coords(1, elem_node_gids(node_lid), 1); - z(node_lid) = node_coords(1, elem_node_gids(node_lid), 2); - } // end for - - double twelth = 1. / 12.; - - // element volume - elem_vol(elem_gid) = - (x(1) * (y(2) * (-z(0) + z(3)) + y(4) * (z(0) - z(5)) + y(0) * (z(3) + z(2) - z(4) - z(5)) + y(7) * (-z(3) + z(5)) + y(5) * (z(0) - z(3) + z(4) - z(7)) + y(3) * (-z(0) - z(2) + z(5) + z(7))) + - x(6) * (y(0) * (-z(2) + z(4)) + y(7) * (z(3) + z(2) - z(4) - z(5)) + y(3) * (z(2) - z(7)) + y(2) * (z(0) - z(3) + z(4) - z(7)) + y(5) * (-z(4) + z(7)) + y(4) * (-z(0) - z(2) + z(5) + z(7))) + - x(2) * (y(1) * (z(0) - z(3)) + y(6) * (-z(0) + z(3) - z(4) + z(7)) + y(7) * (z(3) - z(6)) + y(3) * (z(0) + z(1) - z(7) - z(6)) + y(4) * (-z(0) + z(6)) + y(0) * (-z(1) - z(3) + z(4) + z(6))) + - x(5) * (y(0) * (z(1) - z(4)) + y(6) * (z(4) - z(7)) + y(3) * (-z(1) + z(7)) + y(1) * (-z(0) + z(3) - z(4) + z(7)) + y(4) * (z(0) + z(1) - z(7) - z(6)) + y(7) * (-z(1) - z(3) + z(4) + z(6))) + - x(7) * (y(1) * (z(3) - z(5)) + y(6) * (-z(3) - z(2) + z(4) + z(5)) + y(5) * (z(1) + z(3) - z(4) - z(6)) + y(4) * (z(5) - z(6)) + y(2) * (-z(3) + z(6)) + y(3) * (-z(1) + z(2) - z(5) + z(6))) + - x(0) * (y(3) * (z(1) - z(2)) + y(6) * (z(2) - z(4)) + y(5) * (-z(1) + z(4)) + y(1) * (-z(3) - z(2) + z(4) + z(5)) + y(2) * (z(1) + z(3) - z(4) - z(6)) + y(4) * (-z(1) + z(2) - z(5) + z(6))) + - x(3) * (y(0) * (-z(1) + z(2)) + y(5) * (z(1) - z(7)) + y(1) * (z(0) + z(2) - z(5) - z(7)) + y(6) * (-z(2) + z(7)) + y(7) * (z(1) - z(2) + z(5) - z(6)) + y(2) * (-z(0) - z(1) + z(7) + z(6))) + - x(4) * - (y(1) * (-z(0) + z(5)) + y(6) * (z(0) + z(2) - z(5) - z(7)) + y(2) * (z(0) - z(6)) + y(0) * (z(1) - z(2) + z(5) - z(6)) + y(7) * (-z(5) + z(6)) + y(5) * (-z(0) - z(1) + z(7) + z(6)))) * - twelth; - - // std::cout<<"Calculating volume for hex = "<& elem_node_gids); ///////////////////////////////////////////////////////////////////////////// /// @@ -373,31 +116,9 @@ void get_vol_hex(const DCArrayKokkos& elem_vol, /// \brief Compute Volume of each finite element /// ///////////////////////////////////////////////////////////////////////////// -inline void get_vol(const DCArrayKokkos& elem_vol, +void get_vol(const DCArrayKokkos& elem_vol, const DCArrayKokkos& node_coords, - const Mesh_t& mesh) -{ - const size_t num_dims = mesh.num_dims; - - if (num_dims == 2) { - FOR_ALL(elem_gid, 0, mesh.num_elems, { - // cut out the node_gids for this element - ViewCArrayKokkos elem_node_gids(&mesh.nodes_in_elem(elem_gid, 0), 4); - get_vol_quad(elem_vol, elem_gid, node_coords, elem_node_gids); - }); - Kokkos::fence(); - } - else{ - FOR_ALL(elem_gid, 0, mesh.num_elems, { - // cut out the node_gids for this element - ViewCArrayKokkos elem_node_gids(&mesh.nodes_in_elem(elem_gid, 0), 8); - get_vol_hex(elem_vol, elem_gid, node_coords, elem_node_gids); - }); - Kokkos::fence(); - } // end if - - return; -} // end subroutine + const Mesh_t& mesh); ///////////////////////////////////////////////////////////////////////////// /// @@ -411,67 +132,11 @@ inline void get_vol(const DCArrayKokkos& elem_vol, /// \param Global indices of the nodes of this element /// ///////////////////////////////////////////////////////////////////////////// -KOKKOS_INLINE_FUNCTION +KOKKOS_FUNCTION void get_bmatrix2D(const ViewCArrayKokkos& B_matrix, const size_t elem_gid, const DCArrayKokkos& node_coords, - const ViewCArrayKokkos& elem_node_gids) -{ - const size_t num_nodes = 4; - - double x_array[4]; - double y_array[4]; - - // x, y coordinates of elem vertices - auto x = ViewCArrayKokkos(x_array, num_nodes); - auto y = ViewCArrayKokkos(y_array, num_nodes); - - // get the coordinates of the nodes(rk,elem,node) in this element - for (int node_lid = 0; node_lid < num_nodes; node_lid++) { - x(node_lid) = node_coords(1, elem_node_gids(node_lid), 0); - y(node_lid) = node_coords(1, elem_node_gids(node_lid), 1); - } // end for - - /* ensight node order 0 1 2 3 - Flanaghan node order 3 4 1 2 - */ - - B_matrix(0, 0) = -0.5 * (y(3) - y(1)); - - B_matrix(1, 0) = -0.5 * (y(0) - y(2)); - - B_matrix(2, 0) = -0.5 * (y(1) - y(3)); - - B_matrix(3, 0) = -0.5 * (y(2) - y(0)); - - B_matrix(0, 1) = -0.5 * (x(1) - x(3)); - - B_matrix(1, 1) = -0.5 * (x(2) - x(0)); - - B_matrix(2, 1) = -0.5 * (x(3) - x(1)); - - B_matrix(3, 1) = -0.5 * (x(0) - x(2)); - - // - /* - The Flanagan and Belytschko paper has: - x y - node 1: 0.5*(y2 - y4) , 0.5*(x4 - x2) - node 2: 0.5*(y3 - y1) , 0.5*(x1 - x3) - node 3: 0.5*(y4 - y2) , 0.5*(x2 - x4) - node 4: 0.5*(y1 - y3) , 0.5*(x3 - x1) - - Ensight order would be - - node 2: 0.5*(y3 - y1) , 0.5*(x1 - x3) - node 3: 0.5*(y0 - y2) , 0.5*(x2 - x0) - node 0: 0.5*(y1 - y3) , 0.5*(x3 - x1) - node 1: 0.5*(y2 - y0) , 0.5*(x0 - x2) - - */ - - return; -} // end subroutine + const ViewCArrayKokkos& elem_node_gids); ///////////////////////////////////////////////////////////////////////////// /// @@ -486,37 +151,10 @@ void get_bmatrix2D(const ViewCArrayKokkos& B_matrix, /// \return Elements face area (double) /// ///////////////////////////////////////////////////////////////////////////// -KOKKOS_INLINE_FUNCTION +KOKKOS_FUNCTION double get_area_quad(const size_t elem_gid, const DCArrayKokkos& node_coords, - const ViewCArrayKokkos& elem_node_gids) -{ - double elem_area = 0.0; - - const size_t num_nodes = 4; - - double x_array[4]; - double y_array[4]; - - // x, y coordinates of elem vertices - auto x = ViewCArrayKokkos(x_array, num_nodes); - auto y = ViewCArrayKokkos(y_array, num_nodes); - - // get the coordinates of the nodes(rk,elem,node) in this element - for (int node_lid = 0; node_lid < num_nodes; node_lid++) { - x(node_lid) = node_coords(1, elem_node_gids(node_lid), 0); - y(node_lid) = node_coords(1, elem_node_gids(node_lid), 1); - } // end for - - /* ensight node order 0 1 2 3 - Flanaghan node order 3 4 1 2 - */ - - // element facial area - elem_area = 0.5 * ((x(0) - x(2)) * (y(1) - y(3)) + (x(3) - x(1)) * (y(0) - y(2))); - - return elem_area; -} // end subroutine + const ViewCArrayKokkos& elem_node_gids); ///////////////////////////////////////////////////////////////////////////// /// @@ -534,29 +172,13 @@ double get_area_quad(const size_t elem_gid, /// \return Triangle area (double) /// ///////////////////////////////////////////////////////////////////////////// -KOKKOS_INLINE_FUNCTION +KOKKOS_FUNCTION double heron(const double x1, const double y1, const double x2, const double y2, const double x3, - const double y3) -{ - double S, a, b, c, area; - - S = 0.0; - a = sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); - S += a; - b = sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2)); - S += b; - c = sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1)); - S += c; - - S *= 0.5; - area = sqrt(S * (S - a) * (S - b) * (S - c)); - - return area; -} + const double y3); ///////////////////////////////////////////////////////////////////////////// /// @@ -570,49 +192,12 @@ double heron(const double x1, /// \param Node global IDs associated with this element /// ///////////////////////////////////////////////////////////////////////////// -KOKKOS_INLINE_FUNCTION +KOKKOS_FUNCTION void get_area_weights2D(const ViewCArrayKokkos& corner_areas, const size_t elem_gid, const DCArrayKokkos& node_coords, - const ViewCArrayKokkos& elem_node_gids) -{ - const size_t num_nodes = 4; + const ViewCArrayKokkos& elem_node_gids); - double x_array[4]; - double y_array[4]; - - double rc, zc; - double A12, A23, A34, A41; - - // x, y coordinates of elem vertices - ViewCArrayKokkos x(x_array, num_nodes); - ViewCArrayKokkos y(y_array, num_nodes); - - // get the coordinates of the nodes(rk,elem,node) in this element - rc = zc = 0.0; - for (int node_lid = 0; node_lid < num_nodes; node_lid++) { - x(node_lid) = node_coords(1, elem_node_gids(node_lid), 0); - y(node_lid) = node_coords(1, elem_node_gids(node_lid), 1); - rc += 0.25 * y(node_lid); - zc += 0.25 * x(node_lid); - } // end for - - /* ensight node order 0 1 2 3 - Barlow node order 1 2 3 4 - */ - - A12 = heron(x(0), y(0), zc, rc, x(1), y(1)); - A23 = heron(x(1), y(1), zc, rc, x(2), y(2)); - A34 = heron(x(2), y(2), zc, rc, x(3), y(3)); - A41 = heron(x(3), y(3), zc, rc, x(0), y(0)); - - corner_areas(0) = (5. * A41 + 5. * A12 + A23 + A34) / 12.; - corner_areas(1) = (A41 + 5. * A12 + 5. * A23 + A34) / 12.; - corner_areas(2) = (A41 + A12 + 5. * A23 + 5. * A34) / 12.; - corner_areas(3) = (5. * A41 + A12 + A23 + 5. * A34) / 12.; - - return; -} // end subroutine } // end namespace ///////////////////////////////////////////////////////////////////////////// @@ -628,79 +213,12 @@ void get_area_weights2D(const ViewCArrayKokkos& corner_areas, /// \param Nodal coordinates /// ///////////////////////////////////////////////////////////////////////////// -KOKKOS_INLINE_FUNCTION +KOKKOS_FUNCTION size_t check_bdy(const size_t patch_gid, const int this_bc_tag, const double val, const Mesh_t& mesh, - const DCArrayKokkos& node_coords) -{ - size_t num_dims = mesh.num_dims; - - // default bool is not on the boundary - size_t is_on_bdy = 0; - - // the patch coordinates - double these_patch_coords[3]; // Note: cannot allocated array with num_dims - - // loop over the nodes on the patch - for (size_t patch_node_lid = 0; patch_node_lid < mesh.num_nodes_in_patch; patch_node_lid++) { - // get the nodal_gid for this node in the patch - size_t node_gid = mesh.nodes_in_patch(patch_gid, patch_node_lid); - - for (size_t dim = 0; dim < num_dims; dim++) { - these_patch_coords[dim] = node_coords(1, node_gid, dim); // (rk, node_gid, dim) - } // end for dim - - // a x-plane - if (this_bc_tag == 0) { - if (fabs(these_patch_coords[0] - val) <= 1.0e-7) { - is_on_bdy += 1; - } - } // end if on type - // a y-plane - else if (this_bc_tag == 1) { - if (fabs(these_patch_coords[1] - val) <= 1.0e-7) { - is_on_bdy += 1; - } - } // end if on type - // a z-plane - else if (this_bc_tag == 2) { - if (fabs(these_patch_coords[2] - val) <= 1.0e-7) { - is_on_bdy += 1; - } - } // end if on type - // cylinderical shell where radius = sqrt(x^2 + y^2) - else if (this_bc_tag == 3) { - real_t R = sqrt(these_patch_coords[0] * these_patch_coords[0] + - these_patch_coords[1] * these_patch_coords[1]); - - if (fabs(R - val) <= 1.0e-7) { - is_on_bdy += 1; - } - } // end if on type - // spherical shell where radius = sqrt(x^2 + y^2 + z^2) - else if (this_bc_tag == 4) { - real_t R = sqrt(these_patch_coords[0] * these_patch_coords[0] + - these_patch_coords[1] * these_patch_coords[1] + - these_patch_coords[2] * these_patch_coords[2]); - - if (fabs(R - val) <= 1.0e-7) { - is_on_bdy += 1; - } - } // end if on type - } // end for nodes in the patch - - // if all nodes in the patch are on the geometry - if (is_on_bdy == mesh.num_nodes_in_patch) { - is_on_bdy = 1; - } - else{ - is_on_bdy = 0; - } - - return is_on_bdy; -} // end method to check bdy + const DCArrayKokkos& node_coords); ///////////////////////////////////////////////////////////////////////////// /// @@ -713,45 +231,8 @@ size_t check_bdy(const size_t patch_gid, /// \param Nodal coordinates /// ///////////////////////////////////////////////////////////////////////////// -inline void tag_bdys(const BoundaryCondition_t& boundary, +void tag_bdys(const BoundaryCondition_t& boundary, Mesh_t& mesh, - const DCArrayKokkos& node_coords) -{ - // if (bdy_set == mesh.num_bdy_sets){ - // printf(" ERROR: number of boundary sets must be increased by %zu", - // bdy_set-mesh.num_bdy_sets+1); - // exit(0); - // } // end if - - FOR_ALL(bdy_set, 0, mesh.num_bdy_sets, { - // tag boundaries - int bc_tag_id = boundary.BoundaryConditionSetup(bdy_set).geometry; - double val = boundary.BoundaryConditionSetup(bdy_set).value; - - // save the boundary patches to this set that are on the plane, spheres, etc. - for (size_t bdy_patch_lid = 0; bdy_patch_lid < mesh.num_bdy_patches; bdy_patch_lid++) { - // save the patch index - size_t bdy_patch_gid = mesh.bdy_patches(bdy_patch_lid); - - // check to see if this patch is on the specified plane - size_t is_on_bdy = check_bdy(bdy_patch_gid, - bc_tag_id, - val, - mesh, - node_coords); // no=0, yes=1 - - if (is_on_bdy == 1) { - size_t index = mesh.bdy_patches_in_set.stride(bdy_set); - - // increment the number of boundary patches saved - mesh.bdy_patches_in_set.stride(bdy_set)++; - - mesh.bdy_patches_in_set(bdy_set, index) = bdy_patch_gid; - } // end if - } // end for bdy_patch - }); // end FOR_ALL bdy_sets - - return; -} // end tag + const DCArrayKokkos& node_coords); #endif \ No newline at end of file diff --git a/single-node-refactor/src/common/src/geometry_new.cpp b/single-node-refactor/src/common/src/geometry_new.cpp new file mode 100644 index 000000000..967e2bdb2 --- /dev/null +++ b/single-node-refactor/src/common/src/geometry_new.cpp @@ -0,0 +1,750 @@ +/********************************************************************************************** +� 2020. Triad National Security, LLC. All rights reserved. +This program was produced under U.S. Government contract 89233218CNA000001 for Los Alamos +National Laboratory (LANL), which is operated by Triad National Security, LLC for the U.S. +Department of Energy/National Nuclear Security Administration. All rights in the program are +reserved by Triad National Security, LLC, and the U.S. Department of Energy/National Nuclear +Security Administration. The Government is granted for itself and others acting on its behalf a +nonexclusive, paid-up, irrevocable worldwide license in this material to reproduce, prepare +derivative works, distribute copies to the public, perform publicly and display publicly, and +to permit others to do so. +This program is open source under the BSD-3 License. +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: +1. Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, this list of +conditions and the following disclaimer in the documentation and/or other materials +provided with the distribution. +3. Neither the name of the copyright holder nor the names of its contributors may be used +to endorse or promote products derived from this software without specific prior +written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**********************************************************************************************/ + +///////////////////////////////////////////////////////////////////////////////////// +// ********** WARNING WARNING WARNING: TO BE REPLACED BY ELEMENTS ****************/// +///////////////////////////////////////////////////////////////////////////////////// + + +#include "geometry_new.h" + +///////////////////////////////////////////////////////////////////////////// +/// +/// \fn get_bmatrix +/// +/// \brief This function calculate the finite element B matrix: +/// +/// B_p = J^{-T} \cdot (\nabla_{xi} \phi_p w, where: +/// \phi_p is the basis function for vertex p +/// w is the 1 gauss point for the cell (everything is evaluated at this point) +/// J^{-T} is the inverse transpose of the Jacobi matrix +/// \nabla_{xi} is the gradient operator in the reference coordinates +/// B_p is the OUTWARD corner area normal at node p +/// +/// \param B matrix +/// \param Global index of the element +/// \param View of nodal position data +/// \param View of the elements node ids +/// +///////////////////////////////////////////////////////////////////////////// +KOKKOS_FUNCTION +void geometry::get_bmatrix(const ViewCArrayKokkos& B_matrix, + const size_t elem_gid, + const DCArrayKokkos& node_coords, + const ViewCArrayKokkos& elem_node_gids) +{ + const size_t num_nodes = 8; + + double x_array[8]; + double y_array[8]; + double z_array[8]; + + // x, y, z coordinates of elem vertices + auto x = ViewCArrayKokkos(x_array, num_nodes); + auto y = ViewCArrayKokkos(y_array, num_nodes); + auto z = ViewCArrayKokkos(z_array, num_nodes); + + // get the coordinates of the nodes(rk,elem,node) in this element + for (int node_lid = 0; node_lid < num_nodes; node_lid++) { + x(node_lid) = node_coords(1, elem_node_gids(node_lid), 0); + y(node_lid) = node_coords(1, elem_node_gids(node_lid), 1); + z(node_lid) = node_coords(1, elem_node_gids(node_lid), 2); + } // end for + + + double twelth = 1. / 12.; + + B_matrix(0, 0) = (+y(1) * (-z(3) - z(2) + z(4) + z(5) ) + + y(3) * (+z(1) - z(2) ) + + y(2) * (+z(1) + z(3) - z(4) - z(6) ) + + y(4) * (-z(1) + z(2) - z(5) + z(6) ) + + y(5) * (-z(1) + z(4) ) + + y(6) * (+z(2) - z(4) ) ) * twelth; + + B_matrix(1, 0) = (+y(0) * (+z(3) + z(2) - z(4) - z(5) ) + + y(3) * (-z(0) - z(2) + z(5) + z(7) ) + + y(2) * (-z(0) + z(3) ) + + y(4) * (+z(0) - z(5) ) + + y(5) * (+z(0) - z(3) + z(4) - z(7) ) + + y(7) * (-z(3) + z(5) ) ) * twelth; + + B_matrix(2, 0) = (+y(0) * (-z(1) - z(3) + z(4) + z(6) ) + + y(1) * (+z(0) - z(3) ) + + y(3) * (+z(0) + z(1) - z(7) - z(6) ) + + y(4) * (-z(0) + z(6) ) + + y(7) * (+z(3) - z(6) ) + + y(6) * (-z(0) + z(3) - z(4) + z(7) ) ) * twelth; + + B_matrix(3, 0) = (+y(0) * (-z(1) + z(2) ) + + y(1) * (+z(0) + z(2) - z(5) - z(7) ) + + y(2) * (-z(0) - z(1) + z(7) + z(6) ) + + y(5) * (+z(1) - z(7) ) + + y(7) * (+z(1) - z(2) + z(5) - z(6) ) + + y(6) * (-z(2) + z(7) ) ) * twelth; + + B_matrix(4, 0) = (+y(0) * (+z(1) - z(2) + z(5) - z(6) ) + + y(1) * (-z(0) + z(5) ) + + y(2) * (+z(0) - z(6) ) + + y(5) * (-z(0) - z(1) + z(7) + z(6) ) + + y(7) * (-z(5) + z(6) ) + + y(6) * (+z(0) + z(2) - z(5) - z(7) ) ) * twelth; + + B_matrix(5, 0) = (+y(0) * (+z(1) - z(4) ) + + y(1) * (-z(0) + z(3) - z(4) + z(7) ) + + y(3) * (-z(1) + z(7) ) + + y(4) * (+z(0) + z(1) - z(7) - z(6) ) + + y(7) * (-z(1) - z(3) + z(4) + z(6) ) + + y(6) * (+z(4) - z(7) ) ) * twelth; + + B_matrix(6, 0) = (+y(0) * (-z(2) + z(4) ) + + y(3) * (+z(2) - z(7) ) + + y(2) * (+z(0) - z(3) + z(4) - z(7) ) + + y(4) * (-z(0) - z(2) + z(5) + z(7) ) + + y(5) * (-z(4) + z(7) ) + + y(7) * (+z(3) + z(2) - z(4) - z(5) ) ) * twelth; + + B_matrix(7, 0) = (+y(1) * (+z(3) - z(5) ) + + y(3) * (-z(1) + z(2) - z(5) + z(6) ) + + y(2) * (-z(3) + z(6) ) + + y(4) * (+z(5) - z(6) ) + + y(5) * (+z(1) + z(3) - z(4) - z(6) ) + + y(6) * (-z(3) - z(2) + z(4) + z(5) ) ) * twelth; + + B_matrix(0, 1) = (+z(1) * (-x(3) - x(2) + x(4) + x(5) ) + + z(3) * (+x(1) - x(2) ) + + z(2) * (+x(1) + x(3) - x(4) - x(6) ) + + z(4) * (-x(1) + x(2) - x(5) + x(6) ) + + z(5) * (-x(1) + x(4) ) + + z(6) * (+x(2) - x(4) ) ) * twelth; + + B_matrix(1, 1) = (+z(0) * (+x(3) + x(2) - x(4) - x(5) ) + + z(3) * (-x(0) - x(2) + x(5) + x(7) ) + + z(2) * (-x(0) + x(3) ) + + z(4) * (+x(0) - x(5) ) + + z(5) * (+x(0) - x(3) + x(4) - x(7) ) + + z(7) * (-x(3) + x(5) ) ) * twelth; + + B_matrix(2, 1) = (+z(0) * (-x(1) - x(3) + x(4) + x(6) ) + + z(1) * (+x(0) - x(3) ) + + z(3) * (+x(0) + x(1) - x(7) - x(6) ) + + z(4) * (-x(0) + x(6) ) + + z(7) * (+x(3) - x(6) ) + + z(6) * (-x(0) + x(3) - x(4) + x(7) ) ) * twelth; + + B_matrix(3, 1) = (+z(0) * (-x(1) + x(2) ) + + z(1) * (+x(0) + x(2) - x(5) - x(7) ) + + z(2) * (-x(0) - x(1) + x(7) + x(6) ) + + z(5) * (+x(1) - x(7) ) + + z(7) * (+x(1) - x(2) + x(5) - x(6) ) + + z(6) * (-x(2) + x(7) ) ) * twelth; + + B_matrix(4, 1) = (+z(0) * (+x(1) - x(2) + x(5) - x(6) ) + + z(1) * (-x(0) + x(5) ) + + z(2) * (+x(0) - x(6) ) + + z(5) * (-x(0) - x(1) + x(7) + x(6) ) + + z(7) * (-x(5) + x(6) ) + + z(6) * (+x(0) + x(2) - x(5) - x(7) ) ) * twelth; + + B_matrix(5, 1) = (+z(0) * (+x(1) - x(4) ) + + z(1) * (-x(0) + x(3) - x(4) + x(7) ) + + z(3) * (-x(1) + x(7) ) + + z(4) * (+x(0) + x(1) - x(7) - x(6) ) + + z(7) * (-x(1) - x(3) + x(4) + x(6) ) + + z(6) * (+x(4) - x(7) ) ) * twelth; + + B_matrix(6, 1) = (+z(0) * (-x(2) + x(4) ) + + z(3) * (+x(2) - x(7) ) + + z(2) * (+x(0) - x(3) + x(4) - x(7) ) + + z(4) * (-x(0) - x(2) + x(5) + x(7) ) + + z(5) * (-x(4) + x(7) ) + + z(7) * (+x(3) + x(2) - x(4) - x(5) ) ) * twelth; + + B_matrix(7, 1) = (+z(1) * (+x(3) - x(5) ) + + z(3) * (-x(1) + x(2) - x(5) + x(6) ) + + z(2) * (-x(3) + x(6) ) + + z(4) * (+x(5) - x(6) ) + + z(5) * (+x(1) + x(3) - x(4) - x(6) ) + + z(6) * (-x(3) - x(2) + x(4) + x(5) ) ) * twelth; + + B_matrix(0, 2) = (+x(1) * (-y(3) - y(2) + y(4) + y(5) ) + + x(3) * (+y(1) - y(2) ) + + x(2) * (+y(1) + y(3) - y(4) - y(6) ) + + x(4) * (-y(1) + y(2) - y(5) + y(6) ) + + x(5) * (-y(1) + y(4) ) + + x(6) * (+y(2) - y(4) ) ) * twelth; + + B_matrix(1, 2) = (+x(0) * (+y(3) + y(2) - y(4) - y(5) ) + + x(3) * (-y(0) - y(2) + y(5) + y(7) ) + + x(2) * (-y(0) + y(3) ) + + x(4) * (+y(0) - y(5) ) + + x(5) * (+y(0) - y(3) + y(4) - y(7) ) + + x(7) * (-y(3) + y(5) ) ) * twelth; + + B_matrix(2, 2) = (+x(0) * (-y(1) - y(3) + y(4) + y(6) ) + + x(1) * (+y(0) - y(3) ) + + x(3) * (+y(0) + y(1) - y(7) - y(6) ) + + x(4) * (-y(0) + y(6) ) + + x(7) * (+y(3) - y(6) ) + + x(6) * (-y(0) + y(3) - y(4) + y(7) ) ) * twelth; + + B_matrix(3, 2) = (+x(0) * (-y(1) + y(2) ) + + x(1) * (+y(0) + y(2) - y(5) - y(7) ) + + x(2) * (-y(0) - y(1) + y(7) + y(6) ) + + x(5) * (+y(1) - y(7) ) + + x(7) * (+y(1) - y(2) + y(5) - y(6) ) + + x(6) * (-y(2) + y(7) ) ) * twelth; + + B_matrix(4, 2) = (+x(0) * (+y(1) - y(2) + y(5) - y(6) ) + + x(1) * (-y(0) + y(5) ) + + x(2) * (+y(0) - y(6) ) + + x(5) * (-y(0) - y(1) + y(7) + y(6) ) + + x(7) * (-y(5) + y(6) ) + + x(6) * (+y(0) + y(2) - y(5) - y(7) ) ) * twelth; + + B_matrix(5, 2) = (+x(0) * (+y(1) - y(4) ) + + x(1) * (-y(0) + y(3) - y(4) + y(7) ) + + x(3) * (-y(1) + y(7) ) + + x(4) * (+y(0) + y(1) - y(7) - y(6) ) + + x(7) * (-y(1) - y(3) + y(4) + y(6) ) + + x(6) * (+y(4) - y(7) ) ) * twelth; + + B_matrix(6, 2) = (+x(0) * (-y(2) + y(4) ) + + x(3) * (+y(2) - y(7) ) + + x(2) * (+y(0) - y(3) + y(4) - y(7) ) + + x(4) * (-y(0) - y(2) + y(5) + y(7) ) + + x(5) * (-y(4) + y(7) ) + + x(7) * (+y(3) + y(2) - y(4) - y(5) ) ) * twelth; + + B_matrix(7, 2) = (+x(1) * (+y(3) - y(5) ) + + x(3) * (-y(1) + y(2) - y(5) + y(6) ) + + x(2) * (-y(3) + y(6) ) + + x(4) * (+y(5) - y(6) ) + + x(5) * (+y(1) + y(3) - y(4) - y(6) ) + + x(6) * (-y(3) - y(2) + y(4) + y(5) ) ) * twelth; +} // end get_bmatrix + +///////////////////////////////////////////////////////////////////////////// +/// +/// \fn get_vol_quad +/// +/// \brief True volume of a quad in RZ coords +/// +/// \param Element volume +/// \param Global index of the element +/// \param Nodal coordinates +/// \param Global ids of the nodes in this element +/// +///////////////////////////////////////////////////////////////////////////// +KOKKOS_FUNCTION +void geometry::get_vol_quad(const DCArrayKokkos& elem_vol, + const size_t elem_gid, + const DCArrayKokkos& node_coords, + const ViewCArrayKokkos& elem_node_gids) +{ + elem_vol(elem_gid) = 0.0; + + const size_t num_nodes = 4; + + double x_array[4]; + double y_array[4]; + + // x, y coordinates of elem vertices + auto x = ViewCArrayKokkos(x_array, num_nodes); + auto y = ViewCArrayKokkos(y_array, num_nodes); + + // get the coordinates of the nodes(rk,elem,node) in this element + for (int node_lid = 0; node_lid < num_nodes; node_lid++) { + x(node_lid) = node_coords(1, elem_node_gids(node_lid), 0); + y(node_lid) = node_coords(1, elem_node_gids(node_lid), 1); + } // end for + + /* ensight node order 0 1 2 3 + Flanaghan node order 3 4 1 2 + */ + elem_vol(elem_gid) = + ( (y(2) + y(3) + y(0)) * ((y(2) - y(3)) * (x(0) - x(3)) - (y(0) - y(3)) * (x(2) - x(3)) ) + + (y(0) + y(1) + y(2)) * ((y(0) - y(1)) * (x(2) - x(1)) - (y(2) - y(1)) * (x(0) - x(1))) ) / 6.0; + + elem_vol(elem_gid) = fmax(elem_vol(elem_gid), 1.0E-14); + return; +} // end get_vol_quad + +///////////////////////////////////////////////////////////////////////////// +/// +/// \fn get_vol_hex +/// +/// \brief Exact volume for a hex element +/// +/// \param View of element volume data +/// \param Global element index +/// \param View into nodal position data +/// \param Runge Kutta time integration level +/// +///////////////////////////////////////////////////////////////////////////// +KOKKOS_FUNCTION +void geometry::get_vol_hex(const DCArrayKokkos& elem_vol, + const size_t elem_gid, + const DCArrayKokkos& node_coords, + const ViewCArrayKokkos& elem_node_gids) +{ + const size_t num_nodes = 8; + + double x_array[8]; + double y_array[8]; + double z_array[8]; + + // x, y, z coordinates of elem vertices + auto x = ViewCArrayKokkos(x_array, num_nodes); + auto y = ViewCArrayKokkos(y_array, num_nodes); + auto z = ViewCArrayKokkos(z_array, num_nodes); + + // get the coordinates of the nodes(rk,elem,node) in this element + for (int node_lid = 0; node_lid < num_nodes; node_lid++) { + x(node_lid) = node_coords(1, elem_node_gids(node_lid), 0); + y(node_lid) = node_coords(1, elem_node_gids(node_lid), 1); + z(node_lid) = node_coords(1, elem_node_gids(node_lid), 2); + } // end for + + double twelth = 1. / 12.; + + // element volume + elem_vol(elem_gid) = + (x(1) * (y(2) * (-z(0) + z(3)) + y(4) * (z(0) - z(5)) + y(0) * (z(3) + z(2) - z(4) - z(5)) + y(7) * (-z(3) + z(5)) + y(5) * (z(0) - z(3) + z(4) - z(7)) + y(3) * (-z(0) - z(2) + z(5) + z(7))) + + x(6) * (y(0) * (-z(2) + z(4)) + y(7) * (z(3) + z(2) - z(4) - z(5)) + y(3) * (z(2) - z(7)) + y(2) * (z(0) - z(3) + z(4) - z(7)) + y(5) * (-z(4) + z(7)) + y(4) * (-z(0) - z(2) + z(5) + z(7))) + + x(2) * (y(1) * (z(0) - z(3)) + y(6) * (-z(0) + z(3) - z(4) + z(7)) + y(7) * (z(3) - z(6)) + y(3) * (z(0) + z(1) - z(7) - z(6)) + y(4) * (-z(0) + z(6)) + y(0) * (-z(1) - z(3) + z(4) + z(6))) + + x(5) * (y(0) * (z(1) - z(4)) + y(6) * (z(4) - z(7)) + y(3) * (-z(1) + z(7)) + y(1) * (-z(0) + z(3) - z(4) + z(7)) + y(4) * (z(0) + z(1) - z(7) - z(6)) + y(7) * (-z(1) - z(3) + z(4) + z(6))) + + x(7) * (y(1) * (z(3) - z(5)) + y(6) * (-z(3) - z(2) + z(4) + z(5)) + y(5) * (z(1) + z(3) - z(4) - z(6)) + y(4) * (z(5) - z(6)) + y(2) * (-z(3) + z(6)) + y(3) * (-z(1) + z(2) - z(5) + z(6))) + + x(0) * (y(3) * (z(1) - z(2)) + y(6) * (z(2) - z(4)) + y(5) * (-z(1) + z(4)) + y(1) * (-z(3) - z(2) + z(4) + z(5)) + y(2) * (z(1) + z(3) - z(4) - z(6)) + y(4) * (-z(1) + z(2) - z(5) + z(6))) + + x(3) * (y(0) * (-z(1) + z(2)) + y(5) * (z(1) - z(7)) + y(1) * (z(0) + z(2) - z(5) - z(7)) + y(6) * (-z(2) + z(7)) + y(7) * (z(1) - z(2) + z(5) - z(6)) + y(2) * (-z(0) - z(1) + z(7) + z(6))) + + x(4) * + (y(1) * (-z(0) + z(5)) + y(6) * (z(0) + z(2) - z(5) - z(7)) + y(2) * (z(0) - z(6)) + y(0) * (z(1) - z(2) + z(5) - z(6)) + y(7) * (-z(5) + z(6)) + y(5) * (-z(0) - z(1) + z(7) + z(6)))) * + twelth; + + // std::cout<<"Calculating volume for hex = "<& elem_vol, + const DCArrayKokkos& node_coords, + const Mesh_t& mesh) +{ + const size_t num_dims = mesh.num_dims; + + if (num_dims == 2) { + FOR_ALL(elem_gid, 0, mesh.num_elems, { + // cut out the node_gids for this element + ViewCArrayKokkos elem_node_gids(&mesh.nodes_in_elem(elem_gid, 0), 4); + get_vol_quad(elem_vol, elem_gid, node_coords, elem_node_gids); + }); + Kokkos::fence(); + } + else{ + FOR_ALL(elem_gid, 0, mesh.num_elems, { + // cut out the node_gids for this element + ViewCArrayKokkos elem_node_gids(&mesh.nodes_in_elem(elem_gid, 0), 8); + get_vol_hex(elem_vol, elem_gid, node_coords, elem_node_gids); + }); + Kokkos::fence(); + } // end if + + return; +} // end get_vol + + +///////////////////////////////////////////////////////////////////////////// +/// +/// \fn get_bmatrix2D +/// +/// \brief Calculate the 2D finite element B matrix +/// +/// \param B Matrix +/// \param Global index of the element +/// \param Nodal coordinates +/// \param Global indices of the nodes of this element +/// +///////////////////////////////////////////////////////////////////////////// +KOKKOS_FUNCTION +void geometry::get_bmatrix2D(const ViewCArrayKokkos& B_matrix, + const size_t elem_gid, + const DCArrayKokkos& node_coords, + const ViewCArrayKokkos& elem_node_gids) +{ + const size_t num_nodes = 4; + + double x_array[4]; + double y_array[4]; + + // x, y coordinates of elem vertices + auto x = ViewCArrayKokkos(x_array, num_nodes); + auto y = ViewCArrayKokkos(y_array, num_nodes); + + // get the coordinates of the nodes(rk,elem,node) in this element + for (int node_lid = 0; node_lid < num_nodes; node_lid++) { + x(node_lid) = node_coords(1, elem_node_gids(node_lid), 0); + y(node_lid) = node_coords(1, elem_node_gids(node_lid), 1); + } // end for + + /* ensight node order 0 1 2 3 + Flanaghan node order 3 4 1 2 + */ + + B_matrix(0, 0) = -0.5 * (y(3) - y(1)); + + B_matrix(1, 0) = -0.5 * (y(0) - y(2)); + + B_matrix(2, 0) = -0.5 * (y(1) - y(3)); + + B_matrix(3, 0) = -0.5 * (y(2) - y(0)); + + B_matrix(0, 1) = -0.5 * (x(1) - x(3)); + + B_matrix(1, 1) = -0.5 * (x(2) - x(0)); + + B_matrix(2, 1) = -0.5 * (x(3) - x(1)); + + B_matrix(3, 1) = -0.5 * (x(0) - x(2)); + + // + /* + The Flanagan and Belytschko paper has: + x y + node 1: 0.5*(y2 - y4) , 0.5*(x4 - x2) + node 2: 0.5*(y3 - y1) , 0.5*(x1 - x3) + node 3: 0.5*(y4 - y2) , 0.5*(x2 - x4) + node 4: 0.5*(y1 - y3) , 0.5*(x3 - x1) + + Ensight order would be + + node 2: 0.5*(y3 - y1) , 0.5*(x1 - x3) + node 3: 0.5*(y0 - y2) , 0.5*(x2 - x0) + node 0: 0.5*(y1 - y3) , 0.5*(x3 - x1) + node 1: 0.5*(y2 - y0) , 0.5*(x0 - x2) + + */ + + return; +} // end get_bmatrix2D + + +///////////////////////////////////////////////////////////////////////////// +/// +/// \fn get_area_quad +/// +/// \brief Calculate the area of a elements face +/// +/// \param Global index of the element +/// \param Nodal coordinates +/// \param Global ids of the nodes in this element +/// +/// \return Elements face area (double) +/// +///////////////////////////////////////////////////////////////////////////// +KOKKOS_FUNCTION +double geometry::get_area_quad(const size_t elem_gid, + const DCArrayKokkos& node_coords, + const ViewCArrayKokkos& elem_node_gids) +{ + double elem_area = 0.0; + + const size_t num_nodes = 4; + + double x_array[4]; + double y_array[4]; + + // x, y coordinates of elem vertices + auto x = ViewCArrayKokkos(x_array, num_nodes); + auto y = ViewCArrayKokkos(y_array, num_nodes); + + // get the coordinates of the nodes(rk,elem,node) in this element + for (int node_lid = 0; node_lid < num_nodes; node_lid++) { + x(node_lid) = node_coords(1, elem_node_gids(node_lid), 0); + y(node_lid) = node_coords(1, elem_node_gids(node_lid), 1); + } // end for + + /* ensight node order 0 1 2 3 + Flanaghan node order 3 4 1 2 + */ + + // element facial area + elem_area = 0.5 * ((x(0) - x(2)) * (y(1) - y(3)) + (x(3) - x(1)) * (y(0) - y(2))); + + return elem_area; +} // end get_area_quad + +///////////////////////////////////////////////////////////////////////////// +/// +/// \fn heron +/// +/// \brief Calculate the area of a triangle using the heron algorithm +/// +/// \param Node 1 X coordinate +/// \param Node 1 Y coordinate +/// \param Node 2 X coordinate +/// \param Node 2 Y coordinate +/// \param Node 3 X coordinate +/// \param Node 3 Y coordinate +/// +/// \return Triangle area (double) +/// +///////////////////////////////////////////////////////////////////////////// +KOKKOS_FUNCTION +double geometry::heron(const double x1, + const double y1, + const double x2, + const double y2, + const double x3, + const double y3) +{ + double S, a, b, c, area; + + S = 0.0; + a = sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); + S += a; + b = sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2)); + S += b; + c = sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1)); + S += c; + + S *= 0.5; + area = sqrt(S * (S - a) * (S - b) * (S - c)); + + return area; +} // end heron + + +///////////////////////////////////////////////////////////////////////////// +/// +/// \fn get_area_weights2D +/// +/// \brief Calculate the corner weighted area +/// +/// \param Corner areas +/// \param Element global index +/// \param Nodal coordinates +/// \param Node global IDs associated with this element +/// +///////////////////////////////////////////////////////////////////////////// +KOKKOS_FUNCTION +void geometry::get_area_weights2D(const ViewCArrayKokkos& corner_areas, + const size_t elem_gid, + const DCArrayKokkos& node_coords, + const ViewCArrayKokkos& elem_node_gids) +{ + const size_t num_nodes = 4; + + double x_array[4]; + double y_array[4]; + + double rc, zc; + double A12, A23, A34, A41; + + // x, y coordinates of elem vertices + ViewCArrayKokkos x(x_array, num_nodes); + ViewCArrayKokkos y(y_array, num_nodes); + + // get the coordinates of the nodes(rk,elem,node) in this element + rc = zc = 0.0; + for (int node_lid = 0; node_lid < num_nodes; node_lid++) { + x(node_lid) = node_coords(1, elem_node_gids(node_lid), 0); + y(node_lid) = node_coords(1, elem_node_gids(node_lid), 1); + rc += 0.25 * y(node_lid); + zc += 0.25 * x(node_lid); + } // end for + + /* ensight node order 0 1 2 3 + Barlow node order 1 2 3 4 + */ + + A12 = heron(x(0), y(0), zc, rc, x(1), y(1)); + A23 = heron(x(1), y(1), zc, rc, x(2), y(2)); + A34 = heron(x(2), y(2), zc, rc, x(3), y(3)); + A41 = heron(x(3), y(3), zc, rc, x(0), y(0)); + + corner_areas(0) = (5. * A41 + 5. * A12 + A23 + A34) / 12.; + corner_areas(1) = (A41 + 5. * A12 + 5. * A23 + A34) / 12.; + corner_areas(2) = (A41 + A12 + 5. * A23 + 5. * A34) / 12.; + corner_areas(3) = (5. * A41 + A12 + A23 + 5. * A34) / 12.; + + return; +} // end get_area_weights2D + + +///////////////////////////////////////////////////////////////////////////// +/// +/// \fn check_bdy +/// +/// \brief routine for checking to see if a vertex is on a boundary +/// +/// \param Global id of a patch +/// \param Boundary condition tag (bc_tag = 0 xplane, 1 yplane, 2 zplane, 3 cylinder, 4 is shell) +/// \param Plane value +/// \param Simulation mesh +/// \param Nodal coordinates +/// +///////////////////////////////////////////////////////////////////////////// +KOKKOS_FUNCTION +size_t check_bdy(const size_t patch_gid, + const int this_bc_tag, + const double val, + const Mesh_t& mesh, + const DCArrayKokkos& node_coords) +{ + size_t num_dims = mesh.num_dims; + + // default bool is not on the boundary + size_t is_on_bdy = 0; + + // the patch coordinates + double these_patch_coords[3]; // Note: cannot allocated array with num_dims + + // loop over the nodes on the patch + for (size_t patch_node_lid = 0; patch_node_lid < mesh.num_nodes_in_patch; patch_node_lid++) { + // get the nodal_gid for this node in the patch + size_t node_gid = mesh.nodes_in_patch(patch_gid, patch_node_lid); + + for (size_t dim = 0; dim < num_dims; dim++) { + these_patch_coords[dim] = node_coords(1, node_gid, dim); // (rk, node_gid, dim) + } // end for dim + + // a x-plane + if (this_bc_tag == 0) { + if (fabs(these_patch_coords[0] - val) <= 1.0e-7) { + is_on_bdy += 1; + } + } // end if on type + // a y-plane + else if (this_bc_tag == 1) { + if (fabs(these_patch_coords[1] - val) <= 1.0e-7) { + is_on_bdy += 1; + } + } // end if on type + // a z-plane + else if (this_bc_tag == 2) { + if (fabs(these_patch_coords[2] - val) <= 1.0e-7) { + is_on_bdy += 1; + } + } // end if on type + // cylinderical shell where radius = sqrt(x^2 + y^2) + else if (this_bc_tag == 3) { + real_t R = sqrt(these_patch_coords[0] * these_patch_coords[0] + + these_patch_coords[1] * these_patch_coords[1]); + + if (fabs(R - val) <= 1.0e-7) { + is_on_bdy += 1; + } + } // end if on type + // spherical shell where radius = sqrt(x^2 + y^2 + z^2) + else if (this_bc_tag == 4) { + real_t R = sqrt(these_patch_coords[0] * these_patch_coords[0] + + these_patch_coords[1] * these_patch_coords[1] + + these_patch_coords[2] * these_patch_coords[2]); + + if (fabs(R - val) <= 1.0e-7) { + is_on_bdy += 1; + } + } // end if on type + } // end for nodes in the patch + + // if all nodes in the patch are on the geometry + if (is_on_bdy == mesh.num_nodes_in_patch) { + is_on_bdy = 1; + } + else{ + is_on_bdy = 0; + } + + return is_on_bdy; +} // end method to check bdy + + +///////////////////////////////////////////////////////////////////////////// +/// +/// \fn tag_bdys +/// +/// \brief set planes for tagging sub sets of boundary patches +/// +/// \param Boundary condition +/// \param Simulation mesh +/// \param Nodal coordinates +/// +///////////////////////////////////////////////////////////////////////////// +void tag_bdys(const BoundaryCondition_t& boundary, + Mesh_t& mesh, + const DCArrayKokkos& node_coords) +{ + // if (bdy_set == mesh.num_bdy_sets){ + // printf(" ERROR: number of boundary sets must be increased by %zu", + // bdy_set-mesh.num_bdy_sets+1); + // exit(0); + // } // end if + + FOR_ALL(bdy_set, 0, mesh.num_bdy_sets, { + // tag boundaries + int bc_tag_id = boundary.BoundaryConditionSetup(bdy_set).geometry; + double val = boundary.BoundaryConditionSetup(bdy_set).value; + + // save the boundary patches to this set that are on the plane, spheres, etc. + for (size_t bdy_patch_lid = 0; bdy_patch_lid < mesh.num_bdy_patches; bdy_patch_lid++) { + // save the patch index + size_t bdy_patch_gid = mesh.bdy_patches(bdy_patch_lid); + + // check to see if this patch is on the specified plane + size_t is_on_bdy = check_bdy(bdy_patch_gid, + bc_tag_id, + val, + mesh, + node_coords); // no=0, yes=1 + + if (is_on_bdy == 1) { + size_t index = mesh.bdy_patches_in_set.stride(bdy_set); + + // increment the number of boundary patches saved + mesh.bdy_patches_in_set.stride(bdy_set)++; + + mesh.bdy_patches_in_set(bdy_set, index) = bdy_patch_gid; + } // end if + } // end for bdy_patch + }); // end FOR_ALL bdy_sets + + return; +} // end tag \ No newline at end of file From 8e39ef27437fbfe080d8973a391be372bf5cbe6c Mon Sep 17 00:00:00 2001 From: Jacob Moore Date: Wed, 28 Aug 2024 13:41:43 -0500 Subject: [PATCH 24/33] ENH: Tidy up mesh (removed unused function definition) --- single-node-refactor/src/common/include/mesh.h | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/single-node-refactor/src/common/include/mesh.h b/single-node-refactor/src/common/include/mesh.h index 2d5dac76c..8a84ba624 100644 --- a/single-node-refactor/src/common/include/mesh.h +++ b/single-node-refactor/src/common/include/mesh.h @@ -1530,14 +1530,4 @@ struct Mesh_t } // end method to build boundary nodes }; // end Mesh_t -KOKKOS_FUNCTION -void decompose_vel_grad(ViewCArrayKokkos& D_tensor, - ViewCArrayKokkos& W_tensor, - const ViewCArrayKokkos& vel_grad, - const ViewCArrayKokkos& elem_node_gids, - const size_t elem_gid, - const DCArrayKokkos& node_coords, - const DCArrayKokkos& node_vel, - const double vol); - #endif \ No newline at end of file From 94eb2fdf93267c2c3395fdf7697108e9b017d471 Mon Sep 17 00:00:00 2001 From: Jacob Moore Date: Wed, 28 Aug 2024 13:58:36 -0500 Subject: [PATCH 25/33] ENH: Silence cuda warnings --- .../src/Solvers/SGH_solver_3D/src/sgh_execute.cpp | 7 ++----- .../src/Solvers/SGH_solver_rz/src/properties_rz.cpp | 6 ------ .../src/Solvers/SGH_solver_rz/src/sgh_execute_rz.cpp | 12 +++--------- single-node-refactor/src/common/include/mesh_io.h | 12 +++++------- single-node-refactor/src/common/src/region_fill.cpp | 6 ------ single-node-refactor/src/solver.cpp | 2 +- 6 files changed, 11 insertions(+), 34 deletions(-) diff --git a/single-node-refactor/src/Solvers/SGH_solver_3D/src/sgh_execute.cpp b/single-node-refactor/src/Solvers/SGH_solver_3D/src/sgh_execute.cpp index 166649ab7..48d15cd65 100644 --- a/single-node-refactor/src/Solvers/SGH_solver_3D/src/sgh_execute.cpp +++ b/single-node-refactor/src/Solvers/SGH_solver_3D/src/sgh_execute.cpp @@ -64,7 +64,7 @@ void SGH3D::execute(SimulationParameters_t& SimulationParamaters, double graphics_dt_ival = SimulationParamaters.output_options.graphics_time_step; int graphics_cyc_ival = SimulationParamaters.output_options.graphics_iteration_step; - double time_initial = SimulationParamaters.dynamic_options.time_initial; + // double time_initial = SimulationParamaters.dynamic_options.time_initial; double time_final = SimulationParamaters.dynamic_options.time_final; double dt_min = SimulationParamaters.dynamic_options.dt_min; double dt_max = SimulationParamaters.dynamic_options.dt_max; @@ -81,13 +81,10 @@ void SGH3D::execute(SimulationParameters_t& SimulationParamaters, // Create mesh writer MeshWriter mesh_writer; // Note: Pull to driver after refactoring evolution - // --- num vars ---- - size_t num_dims = 3; - + // --- Graphics vars ---- CArray graphics_times = CArray(20000); graphics_times(0) = 0.0; double graphics_time = 0.0; // the times for writing graphics dump - size_t graphics_id = 0; CArrayKokkos node_extensive_mass(mesh.num_nodes); diff --git a/single-node-refactor/src/Solvers/SGH_solver_rz/src/properties_rz.cpp b/single-node-refactor/src/Solvers/SGH_solver_rz/src/properties_rz.cpp index de820bc4c..c67215b6c 100644 --- a/single-node-refactor/src/Solvers/SGH_solver_rz/src/properties_rz.cpp +++ b/single-node-refactor/src/Solvers/SGH_solver_rz/src/properties_rz.cpp @@ -120,9 +120,6 @@ void SGHRZ::update_state_rz( // Note, with the SGH method, they are equal size_t mat_point_lid = mat_elem_lid; - // for this method, gauss point is equal to elem_gid - size_t gauss_gid = elem_gid; - // --- Pressure --- Materials.MaterialFunctions(mat_id).calc_pressure( MaterialPoints_pres, @@ -241,9 +238,6 @@ void SGHRZ::update_state_rz( // Note, with the SGH method, they are equal size_t mat_point_lid = mat_elem_lid; - // for this method, gauss point is equal to elem_gid - size_t gauss_gid = elem_gid; - // --- Element erosion model --- Materials.MaterialFunctions(mat_id).erode( MaterialPoints_eroded, diff --git a/single-node-refactor/src/Solvers/SGH_solver_rz/src/sgh_execute_rz.cpp b/single-node-refactor/src/Solvers/SGH_solver_rz/src/sgh_execute_rz.cpp index 7507d9bf2..44c41d7d7 100644 --- a/single-node-refactor/src/Solvers/SGH_solver_rz/src/sgh_execute_rz.cpp +++ b/single-node-refactor/src/Solvers/SGH_solver_rz/src/sgh_execute_rz.cpp @@ -58,13 +58,13 @@ void SGHRZ::execute(SimulationParameters_t& SimulationParamaters, std::cout << "In execute function in SGHRZ solver" << std::endl; double fuzz = SimulationParamaters.dynamic_options.fuzz; - double tiny = SimulationParamaters.dynamic_options.tiny; + // double tiny = SimulationParamaters.dynamic_options.tiny; double small = SimulationParamaters.dynamic_options.small; double graphics_dt_ival = SimulationParamaters.output_options.graphics_time_step; int graphics_cyc_ival = SimulationParamaters.output_options.graphics_iteration_step; - double time_initial = SimulationParamaters.dynamic_options.time_initial; + // double time_initial = SimulationParamaters.dynamic_options.time_initial; double time_final = SimulationParamaters.dynamic_options.time_final; double dt_min = SimulationParamaters.dynamic_options.dt_min; double dt_max = SimulationParamaters.dynamic_options.dt_max; @@ -81,19 +81,13 @@ void SGHRZ::execute(SimulationParameters_t& SimulationParamaters, // Create mesh writer MeshWriter mesh_writer; // Note: Pull to driver after refactoring evolution - // --- num vars ---- - + // --- graphics vars ---- CArray graphics_times = CArray(20000); graphics_times(0) = 0.0; double graphics_time = 0.0; // the times for writing graphics dump - size_t graphics_id = 0; double cached_pregraphics_dt = dt_start; - - // printf("Writing outputs to file at %f \n", time_value); - // mesh_writer.write_mesh(mesh, MaterialPoints, node, corner, SimulationParamaters, time_value, graphics_times); - CArrayKokkos node_extensive_mass(mesh.num_nodes); // calculate the extensive node mass, its key to 2D diff --git a/single-node-refactor/src/common/include/mesh_io.h b/single-node-refactor/src/common/include/mesh_io.h index a47bbdf17..7a71eea6e 100644 --- a/single-node-refactor/src/common/include/mesh_io.h +++ b/single-node-refactor/src/common/include/mesh_io.h @@ -845,16 +845,16 @@ class MeshBuilder const double dz = lz/((double)num_zones_k); // len/(num_zones_k) const int num_elems = num_elems_i*num_elems_j*num_elems_k; - const int num_zones = num_zones_i*num_zones_j*num_zones_k; // accounts for Pn + // const int num_zones = num_zones_i*num_zones_j*num_zones_k; // accounts for Pn std::vector origin(num_dim); // SimulationParamaters.mesh_input.origin.update_host(); for (int i = 0; i < num_dim; i++) { origin[i] = SimulationParamaters.mesh_input.origin[i]; } // --- 3D parameters --- - const int num_faces_in_zone = 6; // number of faces in zone - const int num_points_in_zone = 8; // number of points in zone - const int num_points_in_face = 4; // number of points in a face + // const int num_faces_in_zone = 6; // number of faces in zone + // const int num_points_in_zone = 8; // number of points in zone + // const int num_points_in_face = 4; // number of points in a face // p_order = 1, 2, 3, 4, 5 // num_nodes = 2, 3, 4, 5, 6 @@ -863,13 +863,11 @@ class MeshBuilder // --- elem --- - int elem_id = 0; auto elem_coords = CArray (num_elems, num_dim); auto elem_point_list = CArray (num_elems, num_points_in_elem); // --- point --- - int point_id = 0; int num_points = num_points_i * num_points_j * num_points_k; auto pt_coords = CArray (num_points, num_dim); @@ -1695,7 +1693,7 @@ class MeshWriter int Pn_order = mesh.Pn; int order[3] = { Pn_order, Pn_order, Pn_order }; - const int num_1D_points = Pn_order+1; + // const int num_1D_points = Pn_order+1; // write all global point numbers for this elem for (size_t elem_gid = 0; elem_gid < mesh.num_elems; elem_gid++) { diff --git a/single-node-refactor/src/common/src/region_fill.cpp b/single-node-refactor/src/common/src/region_fill.cpp index 4df0abbe2..b9f01bfbe 100644 --- a/single-node-refactor/src/common/src/region_fill.cpp +++ b/single-node-refactor/src/common/src/region_fill.cpp @@ -84,16 +84,11 @@ void user_voxel_init(DCArrayKokkos& elem_values, } // end if size_t i; // used for writing information to file - size_t point_id; // the global id for the point - size_t elem_id; // the global id for the elem - size_t this_point; // a local id for a point in a elem (0:7 for a Hexahedral elem) size_t num_points_i; size_t num_points_j; size_t num_points_k; - size_t num_dims = 3; - std::string token; bool found = false; @@ -129,7 +124,6 @@ void user_voxel_init(DCArrayKokkos& elem_values, found = false; - int num_points = num_points_i * num_points_j * num_points_k; CArray pt_coords_x(num_points_i); CArray pt_coords_y(num_points_j); CArray pt_coords_z(num_points_k); diff --git a/single-node-refactor/src/solver.cpp b/single-node-refactor/src/solver.cpp index d028970e5..341e6dedc 100644 --- a/single-node-refactor/src/solver.cpp +++ b/single-node-refactor/src/solver.cpp @@ -81,6 +81,6 @@ double Solver::CPU_Time() ///////////////////////////////////////////////////////////////////////////// void Solver::init_clock() { - double current_cpu = 0; + // double current_cpu = 0; initial_CPU_time = CPU_Time(); } From a26fdf67c93577962fadbd1e803d64d506dbbe7b Mon Sep 17 00:00:00 2001 From: Jacob Moore Date: Wed, 28 Aug 2024 14:11:30 -0500 Subject: [PATCH 26/33] ENH: Pull RZ functions from 3D solver --- .../SGH_solver_3D/include/sgh_solver_3D.h | 12 --- .../Solvers/SGH_solver_3D/src/sgh_execute.cpp | 84 +------------------ .../SGH_solver_rz/src/sgh_execute_rz.cpp | 2 +- .../src/common/include/mesh_io.h | 5 +- 4 files changed, 6 insertions(+), 97 deletions(-) diff --git a/single-node-refactor/src/Solvers/SGH_solver_3D/include/sgh_solver_3D.h b/single-node-refactor/src/Solvers/SGH_solver_3D/include/sgh_solver_3D.h index 8240e6d98..93d9f4e79 100644 --- a/single-node-refactor/src/Solvers/SGH_solver_3D/include/sgh_solver_3D.h +++ b/single-node-refactor/src/Solvers/SGH_solver_3D/include/sgh_solver_3D.h @@ -329,18 +329,6 @@ class SGH3D : public Solver const double rk_alpha); }; -void calc_extensive_node_mass(const CArrayKokkos& node_extensive_mass, - const DCArrayKokkos& node_coords, - const DCArrayKokkos& node_mass, - const double num_dims, - const double num_nodes); - -void calc_node_areal_mass(const Mesh_t& mesh, - const DCArrayKokkos& node_coords, - const DCArrayKokkos& node_mass, - CArrayKokkos node_extensive_mass, - double tiny); - double sum_domain_internal_energy(const DCArrayKokkos& MaterialPoints_mass, const DCArrayKokkos& MaterialPoints_sie, const size_t num_mat_points); diff --git a/single-node-refactor/src/Solvers/SGH_solver_3D/src/sgh_execute.cpp b/single-node-refactor/src/Solvers/SGH_solver_3D/src/sgh_execute.cpp index 48d15cd65..b375ee883 100644 --- a/single-node-refactor/src/Solvers/SGH_solver_3D/src/sgh_execute.cpp +++ b/single-node-refactor/src/Solvers/SGH_solver_3D/src/sgh_execute.cpp @@ -58,7 +58,7 @@ void SGH3D::execute(SimulationParameters_t& SimulationParamaters, std::cout << "In execute function in SGH3D solver" << std::endl; double fuzz = SimulationParamaters.dynamic_options.fuzz; - double tiny = SimulationParamaters.dynamic_options.tiny; + // double tiny = SimulationParamaters.dynamic_options.tiny; double small = SimulationParamaters.dynamic_options.small; double graphics_dt_ival = SimulationParamaters.output_options.graphics_time_step; @@ -86,8 +86,6 @@ void SGH3D::execute(SimulationParameters_t& SimulationParamaters, graphics_times(0) = 0.0; double graphics_time = 0.0; // the times for writing graphics dump - CArrayKokkos node_extensive_mass(mesh.num_nodes); - std::cout << "Applying initial boundary conditions" << std::endl; boundary_velocity(mesh, BoundaryConditions, State.node.vel, time_value); // Time value = 0.0; @@ -98,13 +96,6 @@ void SGH3D::execute(SimulationParameters_t& SimulationParamaters, double cached_pregraphics_dt = fuzz; - // calculate the extensive node mass, its key to 2D - calc_extensive_node_mass(node_extensive_mass, - State.node.coords, - State.node.mass, - mesh.num_dims, - mesh.num_nodes); - // the number of materials specified by the user input const size_t num_mats = Materials.num_mats; @@ -412,7 +403,7 @@ void SGH3D::execute(SimulationParameters_t& SimulationParamaters, printf("Time=0: KE = %f, IE = %f, TE = %f \n", KE_t0, IE_t0, TE_t0); printf("Time=End: KE = %f, IE = %f, TE = %f \n", KE_tend, IE_tend, TE_tend); - printf("total energy change = %e \n\n", TE_tend - TE_t0); + printf("total energy change = %.15e \n\n", TE_tend - TE_t0); // domain mass for each material (they are at material points) double mass_domain_all_mats_tend = 0.0; @@ -515,69 +506,6 @@ double max_Eigen3D(const ViewCArrayKokkos tensor) return abs_max_val; } -///////////////////////////////////////////////////////////////////////////// -/// -/// \fn max_Eigen2D -/// -/// \brief Get the maximum eigenvalues of a given tensor -/// -/// \param Input tensor -/// -///////////////////////////////////////////////////////////////////////////// -KOKKOS_FUNCTION -double max_Eigen2D(const ViewCArrayKokkos tensor) -{ - // Compute largest eigenvalue of a 2x2 tensor - // Algorithm only works if tensor is symmetric - size_t dim = tensor.dims(0); - double trace, det; - - trace = tensor(0, 0) + tensor(1, 1); - det = tensor(0, 0) * tensor(1, 1) - tensor(0, 1) * tensor(1, 0); - - double eig1, eig2; - - eig1 = (trace / 2.) + sqrt(0.25 * trace * trace - det); - eig2 = (trace / 2.) - sqrt(0.25 * trace * trace - det); - - double abs_max_val = fmax(fabs(eig1), fabs(eig2)); - return abs_max_val; -} // end 2D max eignen value - -///////////////////////////////////////////////////////////////////////////// -/// -/// \fn calc_extensive_node_mass -/// -/// \brief -/// -/// -/// -/// \param -/// \param -/// \param -/// -/// \return -/// -///////////////////////////////////////////////////////////////////////////// -void calc_extensive_node_mass(const CArrayKokkos& node_extensive_mass, - const DCArrayKokkos& node_coords, - const DCArrayKokkos& node_mass, - double num_dims, - double num_nodes) -{ - // save the nodal mass - FOR_ALL(node_gid, 0, num_nodes, { - double radius = 1.0; - - if (num_dims == 2) { - radius = node_coords(1, node_gid, 1); - } - - node_extensive_mass(node_gid) = node_mass(node_gid) * radius; - }); // end parallel for -} // end function - // a function to tally the internal energy double sum_domain_internal_energy(const DCArrayKokkos& MaterialPoints_mass, const DCArrayKokkos& MaterialPoints_sie, @@ -627,12 +555,8 @@ double sum_domain_kinetic_energy(const Mesh_t& mesh, ke += node_vel(1, node_gid, dim) * node_vel(1, node_gid, dim); // 1/2 at end } // end for - if (mesh.num_dims == 2) { - KE_loc_sum += node_mass(node_gid) * node_coords(1, node_gid, 1) * ke; - } - else{ - KE_loc_sum += node_mass(node_gid) * ke; - } + KE_loc_sum += node_mass(node_gid) * ke; + }, KE_sum); Kokkos::fence(); diff --git a/single-node-refactor/src/Solvers/SGH_solver_rz/src/sgh_execute_rz.cpp b/single-node-refactor/src/Solvers/SGH_solver_rz/src/sgh_execute_rz.cpp index 44c41d7d7..c71c8001f 100644 --- a/single-node-refactor/src/Solvers/SGH_solver_rz/src/sgh_execute_rz.cpp +++ b/single-node-refactor/src/Solvers/SGH_solver_rz/src/sgh_execute_rz.cpp @@ -58,7 +58,7 @@ void SGHRZ::execute(SimulationParameters_t& SimulationParamaters, std::cout << "In execute function in SGHRZ solver" << std::endl; double fuzz = SimulationParamaters.dynamic_options.fuzz; - // double tiny = SimulationParamaters.dynamic_options.tiny; + double tiny = SimulationParamaters.dynamic_options.tiny; double small = SimulationParamaters.dynamic_options.small; double graphics_dt_ival = SimulationParamaters.output_options.graphics_time_step; diff --git a/single-node-refactor/src/common/include/mesh_io.h b/single-node-refactor/src/common/include/mesh_io.h index 7a71eea6e..b07107116 100644 --- a/single-node-refactor/src/common/include/mesh_io.h +++ b/single-node-refactor/src/common/include/mesh_io.h @@ -153,12 +153,9 @@ class MeshReader // Check mesh file extension // and read based on extension read_ensight_mesh(mesh, State.GaussPoints, State.node, State.corner, num_dims, rk_num_bins); + } - // void write_mesh(Mesh_t& mesh, - // State_t& State, - // SimulationParameters_t& SimulationParamaters, - ///////////////////////////////////////////////////////////////////////////// /// /// \fn read_ensight_mesh From fcc48624c7d2110887133f98c199c3b36b96e95c Mon Sep 17 00:00:00 2001 From: Jacob Moore Date: Wed, 28 Aug 2024 14:15:29 -0500 Subject: [PATCH 27/33] ENH: Add basic abaqus mesh reader --- .../src/common/include/mesh_io.h | 221 +++++++++++++++++- 1 file changed, 216 insertions(+), 5 deletions(-) diff --git a/single-node-refactor/src/common/include/mesh_io.h b/single-node-refactor/src/common/include/mesh_io.h index b07107116..998216022 100644 --- a/single-node-refactor/src/common/include/mesh_io.h +++ b/single-node-refactor/src/common/include/mesh_io.h @@ -44,6 +44,10 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include +#include +#include +#include ///////////////////////////////////////////////////////////////////////////// /// @@ -104,6 +108,18 @@ int get_id_device(int i, int j, int k, int num_i, int num_j) ///////////////////////////////////////////////////////////////////////////// class MeshReader { +private: + // Handy structs for parsing input meshes + struct Node { + int id; + double x, y, z; + }; + + struct Element { + int id; + std::vector connectivity; + }; + public: char* mesh_file_ = NULL; @@ -146,14 +162,37 @@ class MeshReader int rk_num_bins) { if (mesh_file_ == NULL) { - printf("No mesh given\n"); - exit(0); + throw std::runtime_error("**** No mesh path given for read_mesh ****"); } // Check mesh file extension // and read based on extension - read_ensight_mesh(mesh, State.GaussPoints, State.node, State.corner, num_dims, rk_num_bins); - + std::string filePathStr(mesh_file_); + std::string extension; + + size_t pos = filePathStr.rfind('.'); + if (pos != std::string::npos) { + extension = filePathStr.substr(pos + 1); + } else { + extension = ""; + } + + std::cout << "File extension is: " << extension << std::endl; + + if(extension == "geo"){ // Ensight meshfile extension + read_ensight_mesh(mesh, State.GaussPoints, State.node, State.corner, num_dims, rk_num_bins); + } + else if(extension == "inp"){ // Abaqus meshfile extension + read_Abaqus_mesh(mesh, State, num_dims, rk_num_bins); + } + else if(extension == "vtk"){ // vtk file format + throw std::runtime_error("**** VTK mesh reader not yet implemented ****"); + // read_VTK_mesh(mesh, State, num_dims, rk_num_bins); + } + else{ + throw std::runtime_error("**** Mesh file extension not understood ****"); + } + } ///////////////////////////////////////////////////////////////////////////// @@ -309,7 +348,179 @@ class MeshReader mesh.build_connectivity(); return; - } + } // end read ensight mesh + + ///////////////////////////////////////////////////////////////////////////// + /// + /// \fn read_ensight_mesh + /// + /// \brief Read .geo mesh file + /// + /// \param Simulation mesh + /// \param Simulation state + /// \param Node state struct + /// \param Number of dimensions + /// \param Number of RK bins + /// + ///////////////////////////////////////////////////////////////////////////// + void read_Abaqus_mesh(Mesh_t& mesh, + State_t& State, + int num_dims, + int rk_num_bins) + { + + std::cout<<"Reading abaqus input file for mesh"< nodes; + std::vector elements; + + std::string line; + bool readingNodes = false; + bool readingElements = false; + + int nodeCount = 0; + int elemCount = 0; + + while (std::getline(inputFile, line)) { + if (line.find("*Node") != std::string::npos) { + readingNodes = true; + std::cout<<"Found *Node"<> node.id && std::getline(iss, token, ',') && iss >> node.x && + std::getline(iss, token, ',') && iss >> node.y && + std::getline(iss, token, ',') && iss >> node.z)) { + std::cerr << "Failed to parse line: " << line << std::endl; + continue; // Skip this line if parsing failed + } + nodes.push_back(node); + } + + if (line.find("*Element") != std::string::npos) { + readingElements = true; + std::cout<<"Found *Element*"<> element.id)){ + std::cout << "Failed to parse line: " << line << std::endl; + continue; // Skip this line if parsing failed + } + + while ((std::getline(iss, token, ','))) { + // Now extract the integer, ignoring any trailing whitespace + int val; + iss >> val; + element.connectivity.push_back(val); + } + + // Convert from abaqus to IJK mesh + int convert_abq_to_ijk[8]; + convert_abq_to_ijk[0] = 0; + convert_abq_to_ijk[1] = 1; + convert_abq_to_ijk[2] = 3; + convert_abq_to_ijk[3] = 2; + convert_abq_to_ijk[4] = 4; + convert_abq_to_ijk[5] = 5; + convert_abq_to_ijk[6] = 7; + convert_abq_to_ijk[7] = 6; + + int tmp_ijk_indx[8]; + + for (int node_lid = 0; node_lid < 8; node_lid++) { + tmp_ijk_indx[node_lid] = element.connectivity[convert_abq_to_ijk[node_lid]]; + } + + for (int node_lid = 0; node_lid < 8; node_lid++){ + element.connectivity[node_lid] = tmp_ijk_indx[node_lid]; + } + + elements.push_back(element); + } + } + + inputFile.close(); + + size_t num_nodes = nodes.size(); + + printf("Number if nodes read in %lu\n", num_nodes); + + // initialize node variables + mesh.initialize_nodes(num_nodes); + State.node.initialize(rk_num_bins, num_nodes, num_dims); + + + // Copy nodes to mesh + for(int node_gid = 0; node_gid < num_nodes; node_gid++){ + State.node.coords.host(0, node_gid, 0) = nodes[node_gid].x; + State.node.coords.host(0, node_gid, 1) = nodes[node_gid].y; + State.node.coords.host(0, node_gid, 2) = nodes[node_gid].z; + } + + // save the node coords to the current RK value + for (size_t node_gid = 0; node_gid < num_nodes; node_gid++) { + for (int rk = 1; rk < rk_num_bins; rk++) { + for (int dim = 0; dim < num_dims; dim++) { + State.node.coords.host(rk, node_gid, dim) = State.node.coords.host(0, node_gid, dim); + } // end for dim + } // end for rk + } // end parallel for + + // Update device nodal positions + State.node.coords.update_device(); + + + // --- read in the elements in the mesh --- + size_t num_elem = elements.size(); + printf("Number of elements read in %lu\n", num_elem); + + // initialize elem variables + mesh.initialize_elems(num_elem, num_dims); + State.GaussPoints.initialize(rk_num_bins, num_elem, 3); // always 3D here, even for 2D + + + // for each cell read the list of associated nodes + for (int elem_gid = 0; elem_gid < num_elem; elem_gid++) { + for (int node_lid = 0; node_lid < 8; node_lid++) { + mesh.nodes_in_elem.host(elem_gid, node_lid) = elements[elem_gid].connectivity[node_lid]; + + // shift to start node index space at 0 + mesh.nodes_in_elem.host(elem_gid, node_lid) -= 1; + } + } + + // update device side + mesh.nodes_in_elem.update_device(); + + // initialize corner variables + int num_corners = num_elem * mesh.num_nodes_in_elem; + mesh.initialize_corners(num_corners); + State.corner.initialize(num_corners, num_dims); + + // Build connectivity + mesh.build_connectivity(); + } // end read abaqus mesh }; ///////////////////////////////////////////////////////////////////////////// From 405bc33de8dd8bc5db9beaa16fac148f32bc2448 Mon Sep 17 00:00:00 2001 From: Jacob Moore Date: Wed, 28 Aug 2024 14:39:04 -0500 Subject: [PATCH 28/33] ENH: Adding Abaqus mesh reader and testing --- .../standard_inputs/Abaqus_read.yaml | 134 ++ .../standard_inputs/meshes/abaqus.inp | 1559 +++++++++++++++++ .../state/mat_pt_state_t_1.0000e+00.txt | 642 +++++++ .../regression_tests/test_refactor.py | 4 +- .../src/common/include/mesh_io.h | 11 +- 5 files changed, 2345 insertions(+), 5 deletions(-) create mode 100644 single-node-refactor/regression_tests/standard_inputs/Abaqus_read.yaml create mode 100644 single-node-refactor/regression_tests/standard_inputs/meshes/abaqus.inp create mode 100644 single-node-refactor/regression_tests/standard_results/Abaqus_read/state/mat_pt_state_t_1.0000e+00.txt diff --git a/single-node-refactor/regression_tests/standard_inputs/Abaqus_read.yaml b/single-node-refactor/regression_tests/standard_inputs/Abaqus_read.yaml new file mode 100644 index 000000000..b9d527322 --- /dev/null +++ b/single-node-refactor/regression_tests/standard_inputs/Abaqus_read.yaml @@ -0,0 +1,134 @@ +# num_dims: 3 + +dynamic_options: + time_final: 1.0 + dt_min: 1.e-8 + dt_max: 1.e-2 + dt_start: 1.e-5 + cycle_stop: 50000 + +mesh_options: + source: file + file_path: /var/tmp/repos/Fierro/single-node-refactor/regression_tests/standard_inputs/meshes/abaqus.inp + num_dims: 3 + +# mesh_options: +# source: generate +# num_dims: 3 +# type: box +# origin: [-4.0,-4.0, 0.0] +# length: [8.0, 8.0, 10.0] +# num_elems: [20, 20, 10] + +output_options: + timer_output_level: thorough + output_file_format: state + graphics_time_step: 1.0 + # graphics_iteration_step: 10 + +solver_options: + - solver: + method: SGH3D + # solver_vars: + # - blah + # - blah + # - blah + +boundary_conditions: + # Tag X plane + - boundary_condition: + solver: SGH3D + geometry: x_plane + direction: x_dir + value: -4.0 + type: reflected_velocity + + - boundary_condition: + solver: SGH3D + geometry: x_plane + direction: x_dir + value: 4.0 + type: reflected_velocity + + + # Tag Y plane + - boundary_condition: + solver: SGH3D + geometry: y_plane + direction: y_dir + value: -4.0 + type: reflected_velocity + + - boundary_condition: + solver: SGH3D + geometry: y_plane + direction: y_dir + value: 4.0 + type: reflected_velocity + + # Tag z plane + - boundary_condition: + solver: SGH3D + geometry: z_plane + direction: z_dir + value: 0.0 + type: reflected_velocity + + + +materials: + - material: + id: 0 + eos_model_type: decoupled + eos_model: gamma_law_gas + # strength_model: none + q1: 1.0 + q2: 1.333 + q1ex: 1.0 + q2ex: 1.333 + eos_global_vars: + - 1.666666666666667 + - 1.0E-14 + - 1.0 + +regions: + - fill_volume: + type: global + material_id: 0 + den: 1.0 + sie: 1.e-10 + velocity: cartesian + u: 0.0 + v: 0.0 + w: 0.0 + + # energy source initial conditions + # - fill_volume: + # type: sphere + # origin: [0.0, 0.0, 0.0] + # radius1: 0.0 + # radius2: 1.0 + # material_id: 0 + # den: 1.0 + # # ie: 0.25833839995946534 + # sie: 61.67375002 # 963.652344 + # velocity: cartesian + # u: 0.0 + # v: 0.0 + # w: 0.0 + + - fill_volume: + type: box + x1: -4.0 + x2: 4.0 + y1: -4.0 + y2: 4.0 + z1: 0.0 + z2: 1.0 + material_id: 0 + den: 1.0 + sie: 61.67375002 + velocity: cartesian + u: 0.0 + v: 0.0 + w: 0.0 \ No newline at end of file diff --git a/single-node-refactor/regression_tests/standard_inputs/meshes/abaqus.inp b/single-node-refactor/regression_tests/standard_inputs/meshes/abaqus.inp new file mode 100644 index 000000000..15dacc294 --- /dev/null +++ b/single-node-refactor/regression_tests/standard_inputs/meshes/abaqus.inp @@ -0,0 +1,1559 @@ +*Heading + test +** Job name: Job-1 Model name: Model-1 +** Generated by: Abaqus/CAE 2023 +*Preprint, echo=NO, model=NO, history=NO, contact=NO +** +** PARTS +** +*Part, name=Part-1 +*Node + 1, -4., -4., 10. + 2, -4., -3., 10. + 3, -4., -2., 10. + 4, -4., -1., 10. + 5, -4., 0., 10. + 6, -4., 1., 10. + 7, -4., 2., 10. + 8, -4., 3., 10. + 9, -4., 4., 10. + 10, -4., -4., 9. + 11, -4., -3., 9. + 12, -4., -2., 9. + 13, -4., -1., 9. + 14, -4., 0., 9. + 15, -4., 1., 9. + 16, -4., 2., 9. + 17, -4., 3., 9. + 18, -4., 4., 9. + 19, -4., -4., 8. + 20, -4., -3., 8. + 21, -4., -2., 8. + 22, -4., -1., 8. + 23, -4., 0., 8. + 24, -4., 1., 8. + 25, -4., 2., 8. + 26, -4., 3., 8. + 27, -4., 4., 8. + 28, -4., -4., 7. + 29, -4., -3., 7. + 30, -4., -2., 7. + 31, -4., -1., 7. + 32, -4., 0., 7. + 33, -4., 1., 7. + 34, -4., 2., 7. + 35, -4., 3., 7. + 36, -4., 4., 7. + 37, -4., -4., 6. + 38, -4., -3., 6. + 39, -4., -2., 6. + 40, -4., -1., 6. + 41, -4., 0., 6. + 42, -4., 1., 6. + 43, -4., 2., 6. + 44, -4., 3., 6. + 45, -4., 4., 6. + 46, -4., -4., 5. + 47, -4., -3., 5. + 48, -4., -2., 5. + 49, -4., -1., 5. + 50, -4., 0., 5. + 51, -4., 1., 5. + 52, -4., 2., 5. + 53, -4., 3., 5. + 54, -4., 4., 5. + 55, -4., -4., 4. + 56, -4., -3., 4. + 57, -4., -2., 4. + 58, -4., -1., 4. + 59, -4., 0., 4. + 60, -4., 1., 4. + 61, -4., 2., 4. + 62, -4., 3., 4. + 63, -4., 4., 4. + 64, -4., -4., 3. + 65, -4., -3., 3. + 66, -4., -2., 3. + 67, -4., -1., 3. + 68, -4., 0., 3. + 69, -4., 1., 3. + 70, -4., 2., 3. + 71, -4., 3., 3. + 72, -4., 4., 3. + 73, -4., -4., 2. + 74, -4., -3., 2. + 75, -4., -2., 2. + 76, -4., -1., 2. + 77, -4., 0., 2. + 78, -4., 1., 2. + 79, -4., 2., 2. + 80, -4., 3., 2. + 81, -4., 4., 2. + 82, -4., -4., 1. + 83, -4., -3., 1. + 84, -4., -2., 1. + 85, -4., -1., 1. + 86, -4., 0., 1. + 87, -4., 1., 1. + 88, -4., 2., 1. + 89, -4., 3., 1. + 90, -4., 4., 1. + 91, -4., -4., 0. + 92, -4., -3., 0. + 93, -4., -2., 0. + 94, -4., -1., 0. + 95, -4., 0., 0. + 96, -4., 1., 0. + 97, -4., 2., 0. + 98, -4., 3., 0. + 99, -4., 4., 0. + 100, -3., -4., 10. + 101, -3., -3., 10. + 102, -3., -2., 10. + 103, -3., -1., 10. + 104, -3., 0., 10. + 105, -3., 1., 10. + 106, -3., 2., 10. + 107, -3., 3., 10. + 108, -3., 4., 10. + 109, -3., -4., 9. + 110, -3., -3., 9. + 111, -3., -2., 9. + 112, -3., -1., 9. + 113, -3., 0., 9. + 114, -3., 1., 9. + 115, -3., 2., 9. + 116, -3., 3., 9. + 117, -3., 4., 9. + 118, -3., -4., 8. + 119, -3., -3., 8. + 120, -3., -2., 8. + 121, -3., -1., 8. + 122, -3., 0., 8. + 123, -3., 1., 8. + 124, -3., 2., 8. + 125, -3., 3., 8. + 126, -3., 4., 8. + 127, -3., -4., 7. + 128, -3., -3., 7. + 129, -3., -2., 7. + 130, -3., -1., 7. + 131, -3., 0., 7. + 132, -3., 1., 7. + 133, -3., 2., 7. + 134, -3., 3., 7. + 135, -3., 4., 7. + 136, -3., -4., 6. + 137, -3., -3., 6. + 138, -3., -2., 6. + 139, -3., -1., 6. + 140, -3., 0., 6. + 141, -3., 1., 6. + 142, -3., 2., 6. + 143, -3., 3., 6. + 144, -3., 4., 6. + 145, -3., -4., 5. + 146, -3., -3., 5. + 147, -3., -2., 5. + 148, -3., -1., 5. + 149, -3., 0., 5. + 150, -3., 1., 5. + 151, -3., 2., 5. + 152, -3., 3., 5. + 153, -3., 4., 5. + 154, -3., -4., 4. + 155, -3., -3., 4. + 156, -3., -2., 4. + 157, -3., -1., 4. + 158, -3., 0., 4. + 159, -3., 1., 4. + 160, -3., 2., 4. + 161, -3., 3., 4. + 162, -3., 4., 4. + 163, -3., -4., 3. + 164, -3., -3., 3. + 165, -3., -2., 3. + 166, -3., -1., 3. + 167, -3., 0., 3. + 168, -3., 1., 3. + 169, -3., 2., 3. + 170, -3., 3., 3. + 171, -3., 4., 3. + 172, -3., -4., 2. + 173, -3., -3., 2. + 174, -3., -2., 2. + 175, -3., -1., 2. + 176, -3., 0., 2. + 177, -3., 1., 2. + 178, -3., 2., 2. + 179, -3., 3., 2. + 180, -3., 4., 2. + 181, -3., -4., 1. + 182, -3., -3., 1. + 183, -3., -2., 1. + 184, -3., -1., 1. + 185, -3., 0., 1. + 186, -3., 1., 1. + 187, -3., 2., 1. + 188, -3., 3., 1. + 189, -3., 4., 1. + 190, -3., -4., 0. + 191, -3., -3., 0. + 192, -3., -2., 0. + 193, -3., -1., 0. + 194, -3., 0., 0. + 195, -3., 1., 0. + 196, -3., 2., 0. + 197, -3., 3., 0. + 198, -3., 4., 0. + 199, -2., -4., 10. + 200, -2., -3., 10. + 201, -2., -2., 10. + 202, -2., -1., 10. + 203, -2., 0., 10. + 204, -2., 1., 10. + 205, -2., 2., 10. + 206, -2., 3., 10. + 207, -2., 4., 10. + 208, -2., -4., 9. + 209, -2., -3., 9. + 210, -2., -2., 9. + 211, -2., -1., 9. + 212, -2., 0., 9. + 213, -2., 1., 9. + 214, -2., 2., 9. + 215, -2., 3., 9. + 216, -2., 4., 9. + 217, -2., -4., 8. + 218, -2., -3., 8. + 219, -2., -2., 8. + 220, -2., -1., 8. + 221, -2., 0., 8. + 222, -2., 1., 8. + 223, -2., 2., 8. + 224, -2., 3., 8. + 225, -2., 4., 8. + 226, -2., -4., 7. + 227, -2., -3., 7. + 228, -2., -2., 7. + 229, -2., -1., 7. + 230, -2., 0., 7. + 231, -2., 1., 7. + 232, -2., 2., 7. + 233, -2., 3., 7. + 234, -2., 4., 7. + 235, -2., -4., 6. + 236, -2., -3., 6. + 237, -2., -2., 6. + 238, -2., -1., 6. + 239, -2., 0., 6. + 240, -2., 1., 6. + 241, -2., 2., 6. + 242, -2., 3., 6. + 243, -2., 4., 6. + 244, -2., -4., 5. + 245, -2., -3., 5. + 246, -2., -2., 5. + 247, -2., -1., 5. + 248, -2., 0., 5. + 249, -2., 1., 5. + 250, -2., 2., 5. + 251, -2., 3., 5. + 252, -2., 4., 5. + 253, -2., -4., 4. + 254, -2., -3., 4. + 255, -2., -2., 4. + 256, -2., -1., 4. + 257, -2., 0., 4. + 258, -2., 1., 4. + 259, -2., 2., 4. + 260, -2., 3., 4. + 261, -2., 4., 4. + 262, -2., -4., 3. + 263, -2., -3., 3. + 264, -2., -2., 3. + 265, -2., -1., 3. + 266, -2., 0., 3. + 267, -2., 1., 3. + 268, -2., 2., 3. + 269, -2., 3., 3. + 270, -2., 4., 3. + 271, -2., -4., 2. + 272, -2., -3., 2. + 273, -2., -2., 2. + 274, -2., -1., 2. + 275, -2., 0., 2. + 276, -2., 1., 2. + 277, -2., 2., 2. + 278, -2., 3., 2. + 279, -2., 4., 2. + 280, -2., -4., 1. + 281, -2., -3., 1. + 282, -2., -2., 1. + 283, -2., -1., 1. + 284, -2., 0., 1. + 285, -2., 1., 1. + 286, -2., 2., 1. + 287, -2., 3., 1. + 288, -2., 4., 1. + 289, -2., -4., 0. + 290, -2., -3., 0. + 291, -2., -2., 0. + 292, -2., -1., 0. + 293, -2., 0., 0. + 294, -2., 1., 0. + 295, -2., 2., 0. + 296, -2., 3., 0. + 297, -2., 4., 0. + 298, -1., -4., 10. + 299, -1., -3., 10. + 300, -1., -2., 10. + 301, -1., -1., 10. + 302, -1., 0., 10. + 303, -1., 1., 10. + 304, -1., 2., 10. + 305, -1., 3., 10. + 306, -1., 4., 10. + 307, -1., -4., 9. + 308, -1., -3., 9. + 309, -1., -2., 9. + 310, -1., -1., 9. + 311, -1., 0., 9. + 312, -1., 1., 9. + 313, -1., 2., 9. + 314, -1., 3., 9. + 315, -1., 4., 9. + 316, -1., -4., 8. + 317, -1., -3., 8. + 318, -1., -2., 8. + 319, -1., -1., 8. + 320, -1., 0., 8. + 321, -1., 1., 8. + 322, -1., 2., 8. + 323, -1., 3., 8. + 324, -1., 4., 8. + 325, -1., -4., 7. + 326, -1., -3., 7. + 327, -1., -2., 7. + 328, -1., -1., 7. + 329, -1., 0., 7. + 330, -1., 1., 7. + 331, -1., 2., 7. + 332, -1., 3., 7. + 333, -1., 4., 7. + 334, -1., -4., 6. + 335, -1., -3., 6. + 336, -1., -2., 6. + 337, -1., -1., 6. + 338, -1., 0., 6. + 339, -1., 1., 6. + 340, -1., 2., 6. + 341, -1., 3., 6. + 342, -1., 4., 6. + 343, -1., -4., 5. + 344, -1., -3., 5. + 345, -1., -2., 5. + 346, -1., -1., 5. + 347, -1., 0., 5. + 348, -1., 1., 5. + 349, -1., 2., 5. + 350, -1., 3., 5. + 351, -1., 4., 5. + 352, -1., -4., 4. + 353, -1., -3., 4. + 354, -1., -2., 4. + 355, -1., -1., 4. + 356, -1., 0., 4. + 357, -1., 1., 4. + 358, -1., 2., 4. + 359, -1., 3., 4. + 360, -1., 4., 4. + 361, -1., -4., 3. + 362, -1., -3., 3. + 363, -1., -2., 3. + 364, -1., -1., 3. + 365, -1., 0., 3. + 366, -1., 1., 3. + 367, -1., 2., 3. + 368, -1., 3., 3. + 369, -1., 4., 3. + 370, -1., -4., 2. + 371, -1., -3., 2. + 372, -1., -2., 2. + 373, -1., -1., 2. + 374, -1., 0., 2. + 375, -1., 1., 2. + 376, -1., 2., 2. + 377, -1., 3., 2. + 378, -1., 4., 2. + 379, -1., -4., 1. + 380, -1., -3., 1. + 381, -1., -2., 1. + 382, -1., -1., 1. + 383, -1., 0., 1. + 384, -1., 1., 1. + 385, -1., 2., 1. + 386, -1., 3., 1. + 387, -1., 4., 1. + 388, -1., -4., 0. + 389, -1., -3., 0. + 390, -1., -2., 0. + 391, -1., -1., 0. + 392, -1., 0., 0. + 393, -1., 1., 0. + 394, -1., 2., 0. + 395, -1., 3., 0. + 396, -1., 4., 0. + 397, 0., -4., 10. + 398, 0., -3., 10. + 399, 0., -2., 10. + 400, 0., -1., 10. + 401, 0., 0., 10. + 402, 0., 1., 10. + 403, 0., 2., 10. + 404, 0., 3., 10. + 405, 0., 4., 10. + 406, 0., -4., 9. + 407, 0., -3., 9. + 408, 0., -2., 9. + 409, 0., -1., 9. + 410, 0., 0., 9. + 411, 0., 1., 9. + 412, 0., 2., 9. + 413, 0., 3., 9. + 414, 0., 4., 9. + 415, 0., -4., 8. + 416, 0., -3., 8. + 417, 0., -2., 8. + 418, 0., -1., 8. + 419, 0., 0., 8. + 420, 0., 1., 8. + 421, 0., 2., 8. + 422, 0., 3., 8. + 423, 0., 4., 8. + 424, 0., -4., 7. + 425, 0., -3., 7. + 426, 0., -2., 7. + 427, 0., -1., 7. + 428, 0., 0., 7. + 429, 0., 1., 7. + 430, 0., 2., 7. + 431, 0., 3., 7. + 432, 0., 4., 7. + 433, 0., -4., 6. + 434, 0., -3., 6. + 435, 0., -2., 6. + 436, 0., -1., 6. + 437, 0., 0., 6. + 438, 0., 1., 6. + 439, 0., 2., 6. + 440, 0., 3., 6. + 441, 0., 4., 6. + 442, 0., -4., 5. + 443, 0., -3., 5. + 444, 0., -2., 5. + 445, 0., -1., 5. + 446, 0., 0., 5. + 447, 0., 1., 5. + 448, 0., 2., 5. + 449, 0., 3., 5. + 450, 0., 4., 5. + 451, 0., -4., 4. + 452, 0., -3., 4. + 453, 0., -2., 4. + 454, 0., -1., 4. + 455, 0., 0., 4. + 456, 0., 1., 4. + 457, 0., 2., 4. + 458, 0., 3., 4. + 459, 0., 4., 4. + 460, 0., -4., 3. + 461, 0., -3., 3. + 462, 0., -2., 3. + 463, 0., -1., 3. + 464, 0., 0., 3. + 465, 0., 1., 3. + 466, 0., 2., 3. + 467, 0., 3., 3. + 468, 0., 4., 3. + 469, 0., -4., 2. + 470, 0., -3., 2. + 471, 0., -2., 2. + 472, 0., -1., 2. + 473, 0., 0., 2. + 474, 0., 1., 2. + 475, 0., 2., 2. + 476, 0., 3., 2. + 477, 0., 4., 2. + 478, 0., -4., 1. + 479, 0., -3., 1. + 480, 0., -2., 1. + 481, 0., -1., 1. + 482, 0., 0., 1. + 483, 0., 1., 1. + 484, 0., 2., 1. + 485, 0., 3., 1. + 486, 0., 4., 1. + 487, 0., -4., 0. + 488, 0., -3., 0. + 489, 0., -2., 0. + 490, 0., -1., 0. + 491, 0., 0., 0. + 492, 0., 1., 0. + 493, 0., 2., 0. + 494, 0., 3., 0. + 495, 0., 4., 0. + 496, 1., -4., 10. + 497, 1., -3., 10. + 498, 1., -2., 10. + 499, 1., -1., 10. + 500, 1., 0., 10. + 501, 1., 1., 10. + 502, 1., 2., 10. + 503, 1., 3., 10. + 504, 1., 4., 10. + 505, 1., -4., 9. + 506, 1., -3., 9. + 507, 1., -2., 9. + 508, 1., -1., 9. + 509, 1., 0., 9. + 510, 1., 1., 9. + 511, 1., 2., 9. + 512, 1., 3., 9. + 513, 1., 4., 9. + 514, 1., -4., 8. + 515, 1., -3., 8. + 516, 1., -2., 8. + 517, 1., -1., 8. + 518, 1., 0., 8. + 519, 1., 1., 8. + 520, 1., 2., 8. + 521, 1., 3., 8. + 522, 1., 4., 8. + 523, 1., -4., 7. + 524, 1., -3., 7. + 525, 1., -2., 7. + 526, 1., -1., 7. + 527, 1., 0., 7. + 528, 1., 1., 7. + 529, 1., 2., 7. + 530, 1., 3., 7. + 531, 1., 4., 7. + 532, 1., -4., 6. + 533, 1., -3., 6. + 534, 1., -2., 6. + 535, 1., -1., 6. + 536, 1., 0., 6. + 537, 1., 1., 6. + 538, 1., 2., 6. + 539, 1., 3., 6. + 540, 1., 4., 6. + 541, 1., -4., 5. + 542, 1., -3., 5. + 543, 1., -2., 5. + 544, 1., -1., 5. + 545, 1., 0., 5. + 546, 1., 1., 5. + 547, 1., 2., 5. + 548, 1., 3., 5. + 549, 1., 4., 5. + 550, 1., -4., 4. + 551, 1., -3., 4. + 552, 1., -2., 4. + 553, 1., -1., 4. + 554, 1., 0., 4. + 555, 1., 1., 4. + 556, 1., 2., 4. + 557, 1., 3., 4. + 558, 1., 4., 4. + 559, 1., -4., 3. + 560, 1., -3., 3. + 561, 1., -2., 3. + 562, 1., -1., 3. + 563, 1., 0., 3. + 564, 1., 1., 3. + 565, 1., 2., 3. + 566, 1., 3., 3. + 567, 1., 4., 3. + 568, 1., -4., 2. + 569, 1., -3., 2. + 570, 1., -2., 2. + 571, 1., -1., 2. + 572, 1., 0., 2. + 573, 1., 1., 2. + 574, 1., 2., 2. + 575, 1., 3., 2. + 576, 1., 4., 2. + 577, 1., -4., 1. + 578, 1., -3., 1. + 579, 1., -2., 1. + 580, 1., -1., 1. + 581, 1., 0., 1. + 582, 1., 1., 1. + 583, 1., 2., 1. + 584, 1., 3., 1. + 585, 1., 4., 1. + 586, 1., -4., 0. + 587, 1., -3., 0. + 588, 1., -2., 0. + 589, 1., -1., 0. + 590, 1., 0., 0. + 591, 1., 1., 0. + 592, 1., 2., 0. + 593, 1., 3., 0. + 594, 1., 4., 0. + 595, 2., -4., 10. + 596, 2., -3., 10. + 597, 2., -2., 10. + 598, 2., -1., 10. + 599, 2., 0., 10. + 600, 2., 1., 10. + 601, 2., 2., 10. + 602, 2., 3., 10. + 603, 2., 4., 10. + 604, 2., -4., 9. + 605, 2., -3., 9. + 606, 2., -2., 9. + 607, 2., -1., 9. + 608, 2., 0., 9. + 609, 2., 1., 9. + 610, 2., 2., 9. + 611, 2., 3., 9. + 612, 2., 4., 9. + 613, 2., -4., 8. + 614, 2., -3., 8. + 615, 2., -2., 8. + 616, 2., -1., 8. + 617, 2., 0., 8. + 618, 2., 1., 8. + 619, 2., 2., 8. + 620, 2., 3., 8. + 621, 2., 4., 8. + 622, 2., -4., 7. + 623, 2., -3., 7. + 624, 2., -2., 7. + 625, 2., -1., 7. + 626, 2., 0., 7. + 627, 2., 1., 7. + 628, 2., 2., 7. + 629, 2., 3., 7. + 630, 2., 4., 7. + 631, 2., -4., 6. + 632, 2., -3., 6. + 633, 2., -2., 6. + 634, 2., -1., 6. + 635, 2., 0., 6. + 636, 2., 1., 6. + 637, 2., 2., 6. + 638, 2., 3., 6. + 639, 2., 4., 6. + 640, 2., -4., 5. + 641, 2., -3., 5. + 642, 2., -2., 5. + 643, 2., -1., 5. + 644, 2., 0., 5. + 645, 2., 1., 5. + 646, 2., 2., 5. + 647, 2., 3., 5. + 648, 2., 4., 5. + 649, 2., -4., 4. + 650, 2., -3., 4. + 651, 2., -2., 4. + 652, 2., -1., 4. + 653, 2., 0., 4. + 654, 2., 1., 4. + 655, 2., 2., 4. + 656, 2., 3., 4. + 657, 2., 4., 4. + 658, 2., -4., 3. + 659, 2., -3., 3. + 660, 2., -2., 3. + 661, 2., -1., 3. + 662, 2., 0., 3. + 663, 2., 1., 3. + 664, 2., 2., 3. + 665, 2., 3., 3. + 666, 2., 4., 3. + 667, 2., -4., 2. + 668, 2., -3., 2. + 669, 2., -2., 2. + 670, 2., -1., 2. + 671, 2., 0., 2. + 672, 2., 1., 2. + 673, 2., 2., 2. + 674, 2., 3., 2. + 675, 2., 4., 2. + 676, 2., -4., 1. + 677, 2., -3., 1. + 678, 2., -2., 1. + 679, 2., -1., 1. + 680, 2., 0., 1. + 681, 2., 1., 1. + 682, 2., 2., 1. + 683, 2., 3., 1. + 684, 2., 4., 1. + 685, 2., -4., 0. + 686, 2., -3., 0. + 687, 2., -2., 0. + 688, 2., -1., 0. + 689, 2., 0., 0. + 690, 2., 1., 0. + 691, 2., 2., 0. + 692, 2., 3., 0. + 693, 2., 4., 0. + 694, 3., -4., 10. + 695, 3., -3., 10. + 696, 3., -2., 10. + 697, 3., -1., 10. + 698, 3., 0., 10. + 699, 3., 1., 10. + 700, 3., 2., 10. + 701, 3., 3., 10. + 702, 3., 4., 10. + 703, 3., -4., 9. + 704, 3., -3., 9. + 705, 3., -2., 9. + 706, 3., -1., 9. + 707, 3., 0., 9. + 708, 3., 1., 9. + 709, 3., 2., 9. + 710, 3., 3., 9. + 711, 3., 4., 9. + 712, 3., -4., 8. + 713, 3., -3., 8. + 714, 3., -2., 8. + 715, 3., -1., 8. + 716, 3., 0., 8. + 717, 3., 1., 8. + 718, 3., 2., 8. + 719, 3., 3., 8. + 720, 3., 4., 8. + 721, 3., -4., 7. + 722, 3., -3., 7. + 723, 3., -2., 7. + 724, 3., -1., 7. + 725, 3., 0., 7. + 726, 3., 1., 7. + 727, 3., 2., 7. + 728, 3., 3., 7. + 729, 3., 4., 7. + 730, 3., -4., 6. + 731, 3., -3., 6. + 732, 3., -2., 6. + 733, 3., -1., 6. + 734, 3., 0., 6. + 735, 3., 1., 6. + 736, 3., 2., 6. + 737, 3., 3., 6. + 738, 3., 4., 6. + 739, 3., -4., 5. + 740, 3., -3., 5. + 741, 3., -2., 5. + 742, 3., -1., 5. + 743, 3., 0., 5. + 744, 3., 1., 5. + 745, 3., 2., 5. + 746, 3., 3., 5. + 747, 3., 4., 5. + 748, 3., -4., 4. + 749, 3., -3., 4. + 750, 3., -2., 4. + 751, 3., -1., 4. + 752, 3., 0., 4. + 753, 3., 1., 4. + 754, 3., 2., 4. + 755, 3., 3., 4. + 756, 3., 4., 4. + 757, 3., -4., 3. + 758, 3., -3., 3. + 759, 3., -2., 3. + 760, 3., -1., 3. + 761, 3., 0., 3. + 762, 3., 1., 3. + 763, 3., 2., 3. + 764, 3., 3., 3. + 765, 3., 4., 3. + 766, 3., -4., 2. + 767, 3., -3., 2. + 768, 3., -2., 2. + 769, 3., -1., 2. + 770, 3., 0., 2. + 771, 3., 1., 2. + 772, 3., 2., 2. + 773, 3., 3., 2. + 774, 3., 4., 2. + 775, 3., -4., 1. + 776, 3., -3., 1. + 777, 3., -2., 1. + 778, 3., -1., 1. + 779, 3., 0., 1. + 780, 3., 1., 1. + 781, 3., 2., 1. + 782, 3., 3., 1. + 783, 3., 4., 1. + 784, 3., -4., 0. + 785, 3., -3., 0. + 786, 3., -2., 0. + 787, 3., -1., 0. + 788, 3., 0., 0. + 789, 3., 1., 0. + 790, 3., 2., 0. + 791, 3., 3., 0. + 792, 3., 4., 0. + 793, 4., -4., 10. + 794, 4., -3., 10. + 795, 4., -2., 10. + 796, 4., -1., 10. + 797, 4., 0., 10. + 798, 4., 1., 10. + 799, 4., 2., 10. + 800, 4., 3., 10. + 801, 4., 4., 10. + 802, 4., -4., 9. + 803, 4., -3., 9. + 804, 4., -2., 9. + 805, 4., -1., 9. + 806, 4., 0., 9. + 807, 4., 1., 9. + 808, 4., 2., 9. + 809, 4., 3., 9. + 810, 4., 4., 9. + 811, 4., -4., 8. + 812, 4., -3., 8. + 813, 4., -2., 8. + 814, 4., -1., 8. + 815, 4., 0., 8. + 816, 4., 1., 8. + 817, 4., 2., 8. + 818, 4., 3., 8. + 819, 4., 4., 8. + 820, 4., -4., 7. + 821, 4., -3., 7. + 822, 4., -2., 7. + 823, 4., -1., 7. + 824, 4., 0., 7. + 825, 4., 1., 7. + 826, 4., 2., 7. + 827, 4., 3., 7. + 828, 4., 4., 7. + 829, 4., -4., 6. + 830, 4., -3., 6. + 831, 4., -2., 6. + 832, 4., -1., 6. + 833, 4., 0., 6. + 834, 4., 1., 6. + 835, 4., 2., 6. + 836, 4., 3., 6. + 837, 4., 4., 6. + 838, 4., -4., 5. + 839, 4., -3., 5. + 840, 4., -2., 5. + 841, 4., -1., 5. + 842, 4., 0., 5. + 843, 4., 1., 5. + 844, 4., 2., 5. + 845, 4., 3., 5. + 846, 4., 4., 5. + 847, 4., -4., 4. + 848, 4., -3., 4. + 849, 4., -2., 4. + 850, 4., -1., 4. + 851, 4., 0., 4. + 852, 4., 1., 4. + 853, 4., 2., 4. + 854, 4., 3., 4. + 855, 4., 4., 4. + 856, 4., -4., 3. + 857, 4., -3., 3. + 858, 4., -2., 3. + 859, 4., -1., 3. + 860, 4., 0., 3. + 861, 4., 1., 3. + 862, 4., 2., 3. + 863, 4., 3., 3. + 864, 4., 4., 3. + 865, 4., -4., 2. + 866, 4., -3., 2. + 867, 4., -2., 2. + 868, 4., -1., 2. + 869, 4., 0., 2. + 870, 4., 1., 2. + 871, 4., 2., 2. + 872, 4., 3., 2. + 873, 4., 4., 2. + 874, 4., -4., 1. + 875, 4., -3., 1. + 876, 4., -2., 1. + 877, 4., -1., 1. + 878, 4., 0., 1. + 879, 4., 1., 1. + 880, 4., 2., 1. + 881, 4., 3., 1. + 882, 4., 4., 1. + 883, 4., -4., 0. + 884, 4., -3., 0. + 885, 4., -2., 0. + 886, 4., -1., 0. + 887, 4., 0., 0. + 888, 4., 1., 0. + 889, 4., 2., 0. + 890, 4., 3., 0. + 891, 4., 4., 0. +*Element, type=C3D8R + 1, 100, 101, 110, 109, 1, 2, 11, 10 + 2, 101, 102, 111, 110, 2, 3, 12, 11 + 3, 102, 103, 112, 111, 3, 4, 13, 12 + 4, 103, 104, 113, 112, 4, 5, 14, 13 + 5, 104, 105, 114, 113, 5, 6, 15, 14 + 6, 105, 106, 115, 114, 6, 7, 16, 15 + 7, 106, 107, 116, 115, 7, 8, 17, 16 + 8, 107, 108, 117, 116, 8, 9, 18, 17 + 9, 109, 110, 119, 118, 10, 11, 20, 19 + 10, 110, 111, 120, 119, 11, 12, 21, 20 + 11, 111, 112, 121, 120, 12, 13, 22, 21 + 12, 112, 113, 122, 121, 13, 14, 23, 22 + 13, 113, 114, 123, 122, 14, 15, 24, 23 + 14, 114, 115, 124, 123, 15, 16, 25, 24 + 15, 115, 116, 125, 124, 16, 17, 26, 25 + 16, 116, 117, 126, 125, 17, 18, 27, 26 + 17, 118, 119, 128, 127, 19, 20, 29, 28 + 18, 119, 120, 129, 128, 20, 21, 30, 29 + 19, 120, 121, 130, 129, 21, 22, 31, 30 + 20, 121, 122, 131, 130, 22, 23, 32, 31 + 21, 122, 123, 132, 131, 23, 24, 33, 32 + 22, 123, 124, 133, 132, 24, 25, 34, 33 + 23, 124, 125, 134, 133, 25, 26, 35, 34 + 24, 125, 126, 135, 134, 26, 27, 36, 35 + 25, 127, 128, 137, 136, 28, 29, 38, 37 + 26, 128, 129, 138, 137, 29, 30, 39, 38 + 27, 129, 130, 139, 138, 30, 31, 40, 39 + 28, 130, 131, 140, 139, 31, 32, 41, 40 + 29, 131, 132, 141, 140, 32, 33, 42, 41 + 30, 132, 133, 142, 141, 33, 34, 43, 42 + 31, 133, 134, 143, 142, 34, 35, 44, 43 + 32, 134, 135, 144, 143, 35, 36, 45, 44 + 33, 136, 137, 146, 145, 37, 38, 47, 46 + 34, 137, 138, 147, 146, 38, 39, 48, 47 + 35, 138, 139, 148, 147, 39, 40, 49, 48 + 36, 139, 140, 149, 148, 40, 41, 50, 49 + 37, 140, 141, 150, 149, 41, 42, 51, 50 + 38, 141, 142, 151, 150, 42, 43, 52, 51 + 39, 142, 143, 152, 151, 43, 44, 53, 52 + 40, 143, 144, 153, 152, 44, 45, 54, 53 + 41, 145, 146, 155, 154, 46, 47, 56, 55 + 42, 146, 147, 156, 155, 47, 48, 57, 56 + 43, 147, 148, 157, 156, 48, 49, 58, 57 + 44, 148, 149, 158, 157, 49, 50, 59, 58 + 45, 149, 150, 159, 158, 50, 51, 60, 59 + 46, 150, 151, 160, 159, 51, 52, 61, 60 + 47, 151, 152, 161, 160, 52, 53, 62, 61 + 48, 152, 153, 162, 161, 53, 54, 63, 62 + 49, 154, 155, 164, 163, 55, 56, 65, 64 + 50, 155, 156, 165, 164, 56, 57, 66, 65 + 51, 156, 157, 166, 165, 57, 58, 67, 66 + 52, 157, 158, 167, 166, 58, 59, 68, 67 + 53, 158, 159, 168, 167, 59, 60, 69, 68 + 54, 159, 160, 169, 168, 60, 61, 70, 69 + 55, 160, 161, 170, 169, 61, 62, 71, 70 + 56, 161, 162, 171, 170, 62, 63, 72, 71 + 57, 163, 164, 173, 172, 64, 65, 74, 73 + 58, 164, 165, 174, 173, 65, 66, 75, 74 + 59, 165, 166, 175, 174, 66, 67, 76, 75 + 60, 166, 167, 176, 175, 67, 68, 77, 76 + 61, 167, 168, 177, 176, 68, 69, 78, 77 + 62, 168, 169, 178, 177, 69, 70, 79, 78 + 63, 169, 170, 179, 178, 70, 71, 80, 79 + 64, 170, 171, 180, 179, 71, 72, 81, 80 + 65, 172, 173, 182, 181, 73, 74, 83, 82 + 66, 173, 174, 183, 182, 74, 75, 84, 83 + 67, 174, 175, 184, 183, 75, 76, 85, 84 + 68, 175, 176, 185, 184, 76, 77, 86, 85 + 69, 176, 177, 186, 185, 77, 78, 87, 86 + 70, 177, 178, 187, 186, 78, 79, 88, 87 + 71, 178, 179, 188, 187, 79, 80, 89, 88 + 72, 179, 180, 189, 188, 80, 81, 90, 89 + 73, 181, 182, 191, 190, 82, 83, 92, 91 + 74, 182, 183, 192, 191, 83, 84, 93, 92 + 75, 183, 184, 193, 192, 84, 85, 94, 93 + 76, 184, 185, 194, 193, 85, 86, 95, 94 + 77, 185, 186, 195, 194, 86, 87, 96, 95 + 78, 186, 187, 196, 195, 87, 88, 97, 96 + 79, 187, 188, 197, 196, 88, 89, 98, 97 + 80, 188, 189, 198, 197, 89, 90, 99, 98 + 81, 199, 200, 209, 208, 100, 101, 110, 109 + 82, 200, 201, 210, 209, 101, 102, 111, 110 + 83, 201, 202, 211, 210, 102, 103, 112, 111 + 84, 202, 203, 212, 211, 103, 104, 113, 112 + 85, 203, 204, 213, 212, 104, 105, 114, 113 + 86, 204, 205, 214, 213, 105, 106, 115, 114 + 87, 205, 206, 215, 214, 106, 107, 116, 115 + 88, 206, 207, 216, 215, 107, 108, 117, 116 + 89, 208, 209, 218, 217, 109, 110, 119, 118 + 90, 209, 210, 219, 218, 110, 111, 120, 119 + 91, 210, 211, 220, 219, 111, 112, 121, 120 + 92, 211, 212, 221, 220, 112, 113, 122, 121 + 93, 212, 213, 222, 221, 113, 114, 123, 122 + 94, 213, 214, 223, 222, 114, 115, 124, 123 + 95, 214, 215, 224, 223, 115, 116, 125, 124 + 96, 215, 216, 225, 224, 116, 117, 126, 125 + 97, 217, 218, 227, 226, 118, 119, 128, 127 + 98, 218, 219, 228, 227, 119, 120, 129, 128 + 99, 219, 220, 229, 228, 120, 121, 130, 129 +100, 220, 221, 230, 229, 121, 122, 131, 130 +101, 221, 222, 231, 230, 122, 123, 132, 131 +102, 222, 223, 232, 231, 123, 124, 133, 132 +103, 223, 224, 233, 232, 124, 125, 134, 133 +104, 224, 225, 234, 233, 125, 126, 135, 134 +105, 226, 227, 236, 235, 127, 128, 137, 136 +106, 227, 228, 237, 236, 128, 129, 138, 137 +107, 228, 229, 238, 237, 129, 130, 139, 138 +108, 229, 230, 239, 238, 130, 131, 140, 139 +109, 230, 231, 240, 239, 131, 132, 141, 140 +110, 231, 232, 241, 240, 132, 133, 142, 141 +111, 232, 233, 242, 241, 133, 134, 143, 142 +112, 233, 234, 243, 242, 134, 135, 144, 143 +113, 235, 236, 245, 244, 136, 137, 146, 145 +114, 236, 237, 246, 245, 137, 138, 147, 146 +115, 237, 238, 247, 246, 138, 139, 148, 147 +116, 238, 239, 248, 247, 139, 140, 149, 148 +117, 239, 240, 249, 248, 140, 141, 150, 149 +118, 240, 241, 250, 249, 141, 142, 151, 150 +119, 241, 242, 251, 250, 142, 143, 152, 151 +120, 242, 243, 252, 251, 143, 144, 153, 152 +121, 244, 245, 254, 253, 145, 146, 155, 154 +122, 245, 246, 255, 254, 146, 147, 156, 155 +123, 246, 247, 256, 255, 147, 148, 157, 156 +124, 247, 248, 257, 256, 148, 149, 158, 157 +125, 248, 249, 258, 257, 149, 150, 159, 158 +126, 249, 250, 259, 258, 150, 151, 160, 159 +127, 250, 251, 260, 259, 151, 152, 161, 160 +128, 251, 252, 261, 260, 152, 153, 162, 161 +129, 253, 254, 263, 262, 154, 155, 164, 163 +130, 254, 255, 264, 263, 155, 156, 165, 164 +131, 255, 256, 265, 264, 156, 157, 166, 165 +132, 256, 257, 266, 265, 157, 158, 167, 166 +133, 257, 258, 267, 266, 158, 159, 168, 167 +134, 258, 259, 268, 267, 159, 160, 169, 168 +135, 259, 260, 269, 268, 160, 161, 170, 169 +136, 260, 261, 270, 269, 161, 162, 171, 170 +137, 262, 263, 272, 271, 163, 164, 173, 172 +138, 263, 264, 273, 272, 164, 165, 174, 173 +139, 264, 265, 274, 273, 165, 166, 175, 174 +140, 265, 266, 275, 274, 166, 167, 176, 175 +141, 266, 267, 276, 275, 167, 168, 177, 176 +142, 267, 268, 277, 276, 168, 169, 178, 177 +143, 268, 269, 278, 277, 169, 170, 179, 178 +144, 269, 270, 279, 278, 170, 171, 180, 179 +145, 271, 272, 281, 280, 172, 173, 182, 181 +146, 272, 273, 282, 281, 173, 174, 183, 182 +147, 273, 274, 283, 282, 174, 175, 184, 183 +148, 274, 275, 284, 283, 175, 176, 185, 184 +149, 275, 276, 285, 284, 176, 177, 186, 185 +150, 276, 277, 286, 285, 177, 178, 187, 186 +151, 277, 278, 287, 286, 178, 179, 188, 187 +152, 278, 279, 288, 287, 179, 180, 189, 188 +153, 280, 281, 290, 289, 181, 182, 191, 190 +154, 281, 282, 291, 290, 182, 183, 192, 191 +155, 282, 283, 292, 291, 183, 184, 193, 192 +156, 283, 284, 293, 292, 184, 185, 194, 193 +157, 284, 285, 294, 293, 185, 186, 195, 194 +158, 285, 286, 295, 294, 186, 187, 196, 195 +159, 286, 287, 296, 295, 187, 188, 197, 196 +160, 287, 288, 297, 296, 188, 189, 198, 197 +161, 298, 299, 308, 307, 199, 200, 209, 208 +162, 299, 300, 309, 308, 200, 201, 210, 209 +163, 300, 301, 310, 309, 201, 202, 211, 210 +164, 301, 302, 311, 310, 202, 203, 212, 211 +165, 302, 303, 312, 311, 203, 204, 213, 212 +166, 303, 304, 313, 312, 204, 205, 214, 213 +167, 304, 305, 314, 313, 205, 206, 215, 214 +168, 305, 306, 315, 314, 206, 207, 216, 215 +169, 307, 308, 317, 316, 208, 209, 218, 217 +170, 308, 309, 318, 317, 209, 210, 219, 218 +171, 309, 310, 319, 318, 210, 211, 220, 219 +172, 310, 311, 320, 319, 211, 212, 221, 220 +173, 311, 312, 321, 320, 212, 213, 222, 221 +174, 312, 313, 322, 321, 213, 214, 223, 222 +175, 313, 314, 323, 322, 214, 215, 224, 223 +176, 314, 315, 324, 323, 215, 216, 225, 224 +177, 316, 317, 326, 325, 217, 218, 227, 226 +178, 317, 318, 327, 326, 218, 219, 228, 227 +179, 318, 319, 328, 327, 219, 220, 229, 228 +180, 319, 320, 329, 328, 220, 221, 230, 229 +181, 320, 321, 330, 329, 221, 222, 231, 230 +182, 321, 322, 331, 330, 222, 223, 232, 231 +183, 322, 323, 332, 331, 223, 224, 233, 232 +184, 323, 324, 333, 332, 224, 225, 234, 233 +185, 325, 326, 335, 334, 226, 227, 236, 235 +186, 326, 327, 336, 335, 227, 228, 237, 236 +187, 327, 328, 337, 336, 228, 229, 238, 237 +188, 328, 329, 338, 337, 229, 230, 239, 238 +189, 329, 330, 339, 338, 230, 231, 240, 239 +190, 330, 331, 340, 339, 231, 232, 241, 240 +191, 331, 332, 341, 340, 232, 233, 242, 241 +192, 332, 333, 342, 341, 233, 234, 243, 242 +193, 334, 335, 344, 343, 235, 236, 245, 244 +194, 335, 336, 345, 344, 236, 237, 246, 245 +195, 336, 337, 346, 345, 237, 238, 247, 246 +196, 337, 338, 347, 346, 238, 239, 248, 247 +197, 338, 339, 348, 347, 239, 240, 249, 248 +198, 339, 340, 349, 348, 240, 241, 250, 249 +199, 340, 341, 350, 349, 241, 242, 251, 250 +200, 341, 342, 351, 350, 242, 243, 252, 251 +201, 343, 344, 353, 352, 244, 245, 254, 253 +202, 344, 345, 354, 353, 245, 246, 255, 254 +203, 345, 346, 355, 354, 246, 247, 256, 255 +204, 346, 347, 356, 355, 247, 248, 257, 256 +205, 347, 348, 357, 356, 248, 249, 258, 257 +206, 348, 349, 358, 357, 249, 250, 259, 258 +207, 349, 350, 359, 358, 250, 251, 260, 259 +208, 350, 351, 360, 359, 251, 252, 261, 260 +209, 352, 353, 362, 361, 253, 254, 263, 262 +210, 353, 354, 363, 362, 254, 255, 264, 263 +211, 354, 355, 364, 363, 255, 256, 265, 264 +212, 355, 356, 365, 364, 256, 257, 266, 265 +213, 356, 357, 366, 365, 257, 258, 267, 266 +214, 357, 358, 367, 366, 258, 259, 268, 267 +215, 358, 359, 368, 367, 259, 260, 269, 268 +216, 359, 360, 369, 368, 260, 261, 270, 269 +217, 361, 362, 371, 370, 262, 263, 272, 271 +218, 362, 363, 372, 371, 263, 264, 273, 272 +219, 363, 364, 373, 372, 264, 265, 274, 273 +220, 364, 365, 374, 373, 265, 266, 275, 274 +221, 365, 366, 375, 374, 266, 267, 276, 275 +222, 366, 367, 376, 375, 267, 268, 277, 276 +223, 367, 368, 377, 376, 268, 269, 278, 277 +224, 368, 369, 378, 377, 269, 270, 279, 278 +225, 370, 371, 380, 379, 271, 272, 281, 280 +226, 371, 372, 381, 380, 272, 273, 282, 281 +227, 372, 373, 382, 381, 273, 274, 283, 282 +228, 373, 374, 383, 382, 274, 275, 284, 283 +229, 374, 375, 384, 383, 275, 276, 285, 284 +230, 375, 376, 385, 384, 276, 277, 286, 285 +231, 376, 377, 386, 385, 277, 278, 287, 286 +232, 377, 378, 387, 386, 278, 279, 288, 287 +233, 379, 380, 389, 388, 280, 281, 290, 289 +234, 380, 381, 390, 389, 281, 282, 291, 290 +235, 381, 382, 391, 390, 282, 283, 292, 291 +236, 382, 383, 392, 391, 283, 284, 293, 292 +237, 383, 384, 393, 392, 284, 285, 294, 293 +238, 384, 385, 394, 393, 285, 286, 295, 294 +239, 385, 386, 395, 394, 286, 287, 296, 295 +240, 386, 387, 396, 395, 287, 288, 297, 296 +241, 397, 398, 407, 406, 298, 299, 308, 307 +242, 398, 399, 408, 407, 299, 300, 309, 308 +243, 399, 400, 409, 408, 300, 301, 310, 309 +244, 400, 401, 410, 409, 301, 302, 311, 310 +245, 401, 402, 411, 410, 302, 303, 312, 311 +246, 402, 403, 412, 411, 303, 304, 313, 312 +247, 403, 404, 413, 412, 304, 305, 314, 313 +248, 404, 405, 414, 413, 305, 306, 315, 314 +249, 406, 407, 416, 415, 307, 308, 317, 316 +250, 407, 408, 417, 416, 308, 309, 318, 317 +251, 408, 409, 418, 417, 309, 310, 319, 318 +252, 409, 410, 419, 418, 310, 311, 320, 319 +253, 410, 411, 420, 419, 311, 312, 321, 320 +254, 411, 412, 421, 420, 312, 313, 322, 321 +255, 412, 413, 422, 421, 313, 314, 323, 322 +256, 413, 414, 423, 422, 314, 315, 324, 323 +257, 415, 416, 425, 424, 316, 317, 326, 325 +258, 416, 417, 426, 425, 317, 318, 327, 326 +259, 417, 418, 427, 426, 318, 319, 328, 327 +260, 418, 419, 428, 427, 319, 320, 329, 328 +261, 419, 420, 429, 428, 320, 321, 330, 329 +262, 420, 421, 430, 429, 321, 322, 331, 330 +263, 421, 422, 431, 430, 322, 323, 332, 331 +264, 422, 423, 432, 431, 323, 324, 333, 332 +265, 424, 425, 434, 433, 325, 326, 335, 334 +266, 425, 426, 435, 434, 326, 327, 336, 335 +267, 426, 427, 436, 435, 327, 328, 337, 336 +268, 427, 428, 437, 436, 328, 329, 338, 337 +269, 428, 429, 438, 437, 329, 330, 339, 338 +270, 429, 430, 439, 438, 330, 331, 340, 339 +271, 430, 431, 440, 439, 331, 332, 341, 340 +272, 431, 432, 441, 440, 332, 333, 342, 341 +273, 433, 434, 443, 442, 334, 335, 344, 343 +274, 434, 435, 444, 443, 335, 336, 345, 344 +275, 435, 436, 445, 444, 336, 337, 346, 345 +276, 436, 437, 446, 445, 337, 338, 347, 346 +277, 437, 438, 447, 446, 338, 339, 348, 347 +278, 438, 439, 448, 447, 339, 340, 349, 348 +279, 439, 440, 449, 448, 340, 341, 350, 349 +280, 440, 441, 450, 449, 341, 342, 351, 350 +281, 442, 443, 452, 451, 343, 344, 353, 352 +282, 443, 444, 453, 452, 344, 345, 354, 353 +283, 444, 445, 454, 453, 345, 346, 355, 354 +284, 445, 446, 455, 454, 346, 347, 356, 355 +285, 446, 447, 456, 455, 347, 348, 357, 356 +286, 447, 448, 457, 456, 348, 349, 358, 357 +287, 448, 449, 458, 457, 349, 350, 359, 358 +288, 449, 450, 459, 458, 350, 351, 360, 359 +289, 451, 452, 461, 460, 352, 353, 362, 361 +290, 452, 453, 462, 461, 353, 354, 363, 362 +291, 453, 454, 463, 462, 354, 355, 364, 363 +292, 454, 455, 464, 463, 355, 356, 365, 364 +293, 455, 456, 465, 464, 356, 357, 366, 365 +294, 456, 457, 466, 465, 357, 358, 367, 366 +295, 457, 458, 467, 466, 358, 359, 368, 367 +296, 458, 459, 468, 467, 359, 360, 369, 368 +297, 460, 461, 470, 469, 361, 362, 371, 370 +298, 461, 462, 471, 470, 362, 363, 372, 371 +299, 462, 463, 472, 471, 363, 364, 373, 372 +300, 463, 464, 473, 472, 364, 365, 374, 373 +301, 464, 465, 474, 473, 365, 366, 375, 374 +302, 465, 466, 475, 474, 366, 367, 376, 375 +303, 466, 467, 476, 475, 367, 368, 377, 376 +304, 467, 468, 477, 476, 368, 369, 378, 377 +305, 469, 470, 479, 478, 370, 371, 380, 379 +306, 470, 471, 480, 479, 371, 372, 381, 380 +307, 471, 472, 481, 480, 372, 373, 382, 381 +308, 472, 473, 482, 481, 373, 374, 383, 382 +309, 473, 474, 483, 482, 374, 375, 384, 383 +310, 474, 475, 484, 483, 375, 376, 385, 384 +311, 475, 476, 485, 484, 376, 377, 386, 385 +312, 476, 477, 486, 485, 377, 378, 387, 386 +313, 478, 479, 488, 487, 379, 380, 389, 388 +314, 479, 480, 489, 488, 380, 381, 390, 389 +315, 480, 481, 490, 489, 381, 382, 391, 390 +316, 481, 482, 491, 490, 382, 383, 392, 391 +317, 482, 483, 492, 491, 383, 384, 393, 392 +318, 483, 484, 493, 492, 384, 385, 394, 393 +319, 484, 485, 494, 493, 385, 386, 395, 394 +320, 485, 486, 495, 494, 386, 387, 396, 395 +321, 496, 497, 506, 505, 397, 398, 407, 406 +322, 497, 498, 507, 506, 398, 399, 408, 407 +323, 498, 499, 508, 507, 399, 400, 409, 408 +324, 499, 500, 509, 508, 400, 401, 410, 409 +325, 500, 501, 510, 509, 401, 402, 411, 410 +326, 501, 502, 511, 510, 402, 403, 412, 411 +327, 502, 503, 512, 511, 403, 404, 413, 412 +328, 503, 504, 513, 512, 404, 405, 414, 413 +329, 505, 506, 515, 514, 406, 407, 416, 415 +330, 506, 507, 516, 515, 407, 408, 417, 416 +331, 507, 508, 517, 516, 408, 409, 418, 417 +332, 508, 509, 518, 517, 409, 410, 419, 418 +333, 509, 510, 519, 518, 410, 411, 420, 419 +334, 510, 511, 520, 519, 411, 412, 421, 420 +335, 511, 512, 521, 520, 412, 413, 422, 421 +336, 512, 513, 522, 521, 413, 414, 423, 422 +337, 514, 515, 524, 523, 415, 416, 425, 424 +338, 515, 516, 525, 524, 416, 417, 426, 425 +339, 516, 517, 526, 525, 417, 418, 427, 426 +340, 517, 518, 527, 526, 418, 419, 428, 427 +341, 518, 519, 528, 527, 419, 420, 429, 428 +342, 519, 520, 529, 528, 420, 421, 430, 429 +343, 520, 521, 530, 529, 421, 422, 431, 430 +344, 521, 522, 531, 530, 422, 423, 432, 431 +345, 523, 524, 533, 532, 424, 425, 434, 433 +346, 524, 525, 534, 533, 425, 426, 435, 434 +347, 525, 526, 535, 534, 426, 427, 436, 435 +348, 526, 527, 536, 535, 427, 428, 437, 436 +349, 527, 528, 537, 536, 428, 429, 438, 437 +350, 528, 529, 538, 537, 429, 430, 439, 438 +351, 529, 530, 539, 538, 430, 431, 440, 439 +352, 530, 531, 540, 539, 431, 432, 441, 440 +353, 532, 533, 542, 541, 433, 434, 443, 442 +354, 533, 534, 543, 542, 434, 435, 444, 443 +355, 534, 535, 544, 543, 435, 436, 445, 444 +356, 535, 536, 545, 544, 436, 437, 446, 445 +357, 536, 537, 546, 545, 437, 438, 447, 446 +358, 537, 538, 547, 546, 438, 439, 448, 447 +359, 538, 539, 548, 547, 439, 440, 449, 448 +360, 539, 540, 549, 548, 440, 441, 450, 449 +361, 541, 542, 551, 550, 442, 443, 452, 451 +362, 542, 543, 552, 551, 443, 444, 453, 452 +363, 543, 544, 553, 552, 444, 445, 454, 453 +364, 544, 545, 554, 553, 445, 446, 455, 454 +365, 545, 546, 555, 554, 446, 447, 456, 455 +366, 546, 547, 556, 555, 447, 448, 457, 456 +367, 547, 548, 557, 556, 448, 449, 458, 457 +368, 548, 549, 558, 557, 449, 450, 459, 458 +369, 550, 551, 560, 559, 451, 452, 461, 460 +370, 551, 552, 561, 560, 452, 453, 462, 461 +371, 552, 553, 562, 561, 453, 454, 463, 462 +372, 553, 554, 563, 562, 454, 455, 464, 463 +373, 554, 555, 564, 563, 455, 456, 465, 464 +374, 555, 556, 565, 564, 456, 457, 466, 465 +375, 556, 557, 566, 565, 457, 458, 467, 466 +376, 557, 558, 567, 566, 458, 459, 468, 467 +377, 559, 560, 569, 568, 460, 461, 470, 469 +378, 560, 561, 570, 569, 461, 462, 471, 470 +379, 561, 562, 571, 570, 462, 463, 472, 471 +380, 562, 563, 572, 571, 463, 464, 473, 472 +381, 563, 564, 573, 572, 464, 465, 474, 473 +382, 564, 565, 574, 573, 465, 466, 475, 474 +383, 565, 566, 575, 574, 466, 467, 476, 475 +384, 566, 567, 576, 575, 467, 468, 477, 476 +385, 568, 569, 578, 577, 469, 470, 479, 478 +386, 569, 570, 579, 578, 470, 471, 480, 479 +387, 570, 571, 580, 579, 471, 472, 481, 480 +388, 571, 572, 581, 580, 472, 473, 482, 481 +389, 572, 573, 582, 581, 473, 474, 483, 482 +390, 573, 574, 583, 582, 474, 475, 484, 483 +391, 574, 575, 584, 583, 475, 476, 485, 484 +392, 575, 576, 585, 584, 476, 477, 486, 485 +393, 577, 578, 587, 586, 478, 479, 488, 487 +394, 578, 579, 588, 587, 479, 480, 489, 488 +395, 579, 580, 589, 588, 480, 481, 490, 489 +396, 580, 581, 590, 589, 481, 482, 491, 490 +397, 581, 582, 591, 590, 482, 483, 492, 491 +398, 582, 583, 592, 591, 483, 484, 493, 492 +399, 583, 584, 593, 592, 484, 485, 494, 493 +400, 584, 585, 594, 593, 485, 486, 495, 494 +401, 595, 596, 605, 604, 496, 497, 506, 505 +402, 596, 597, 606, 605, 497, 498, 507, 506 +403, 597, 598, 607, 606, 498, 499, 508, 507 +404, 598, 599, 608, 607, 499, 500, 509, 508 +405, 599, 600, 609, 608, 500, 501, 510, 509 +406, 600, 601, 610, 609, 501, 502, 511, 510 +407, 601, 602, 611, 610, 502, 503, 512, 511 +408, 602, 603, 612, 611, 503, 504, 513, 512 +409, 604, 605, 614, 613, 505, 506, 515, 514 +410, 605, 606, 615, 614, 506, 507, 516, 515 +411, 606, 607, 616, 615, 507, 508, 517, 516 +412, 607, 608, 617, 616, 508, 509, 518, 517 +413, 608, 609, 618, 617, 509, 510, 519, 518 +414, 609, 610, 619, 618, 510, 511, 520, 519 +415, 610, 611, 620, 619, 511, 512, 521, 520 +416, 611, 612, 621, 620, 512, 513, 522, 521 +417, 613, 614, 623, 622, 514, 515, 524, 523 +418, 614, 615, 624, 623, 515, 516, 525, 524 +419, 615, 616, 625, 624, 516, 517, 526, 525 +420, 616, 617, 626, 625, 517, 518, 527, 526 +421, 617, 618, 627, 626, 518, 519, 528, 527 +422, 618, 619, 628, 627, 519, 520, 529, 528 +423, 619, 620, 629, 628, 520, 521, 530, 529 +424, 620, 621, 630, 629, 521, 522, 531, 530 +425, 622, 623, 632, 631, 523, 524, 533, 532 +426, 623, 624, 633, 632, 524, 525, 534, 533 +427, 624, 625, 634, 633, 525, 526, 535, 534 +428, 625, 626, 635, 634, 526, 527, 536, 535 +429, 626, 627, 636, 635, 527, 528, 537, 536 +430, 627, 628, 637, 636, 528, 529, 538, 537 +431, 628, 629, 638, 637, 529, 530, 539, 538 +432, 629, 630, 639, 638, 530, 531, 540, 539 +433, 631, 632, 641, 640, 532, 533, 542, 541 +434, 632, 633, 642, 641, 533, 534, 543, 542 +435, 633, 634, 643, 642, 534, 535, 544, 543 +436, 634, 635, 644, 643, 535, 536, 545, 544 +437, 635, 636, 645, 644, 536, 537, 546, 545 +438, 636, 637, 646, 645, 537, 538, 547, 546 +439, 637, 638, 647, 646, 538, 539, 548, 547 +440, 638, 639, 648, 647, 539, 540, 549, 548 +441, 640, 641, 650, 649, 541, 542, 551, 550 +442, 641, 642, 651, 650, 542, 543, 552, 551 +443, 642, 643, 652, 651, 543, 544, 553, 552 +444, 643, 644, 653, 652, 544, 545, 554, 553 +445, 644, 645, 654, 653, 545, 546, 555, 554 +446, 645, 646, 655, 654, 546, 547, 556, 555 +447, 646, 647, 656, 655, 547, 548, 557, 556 +448, 647, 648, 657, 656, 548, 549, 558, 557 +449, 649, 650, 659, 658, 550, 551, 560, 559 +450, 650, 651, 660, 659, 551, 552, 561, 560 +451, 651, 652, 661, 660, 552, 553, 562, 561 +452, 652, 653, 662, 661, 553, 554, 563, 562 +453, 653, 654, 663, 662, 554, 555, 564, 563 +454, 654, 655, 664, 663, 555, 556, 565, 564 +455, 655, 656, 665, 664, 556, 557, 566, 565 +456, 656, 657, 666, 665, 557, 558, 567, 566 +457, 658, 659, 668, 667, 559, 560, 569, 568 +458, 659, 660, 669, 668, 560, 561, 570, 569 +459, 660, 661, 670, 669, 561, 562, 571, 570 +460, 661, 662, 671, 670, 562, 563, 572, 571 +461, 662, 663, 672, 671, 563, 564, 573, 572 +462, 663, 664, 673, 672, 564, 565, 574, 573 +463, 664, 665, 674, 673, 565, 566, 575, 574 +464, 665, 666, 675, 674, 566, 567, 576, 575 +465, 667, 668, 677, 676, 568, 569, 578, 577 +466, 668, 669, 678, 677, 569, 570, 579, 578 +467, 669, 670, 679, 678, 570, 571, 580, 579 +468, 670, 671, 680, 679, 571, 572, 581, 580 +469, 671, 672, 681, 680, 572, 573, 582, 581 +470, 672, 673, 682, 681, 573, 574, 583, 582 +471, 673, 674, 683, 682, 574, 575, 584, 583 +472, 674, 675, 684, 683, 575, 576, 585, 584 +473, 676, 677, 686, 685, 577, 578, 587, 586 +474, 677, 678, 687, 686, 578, 579, 588, 587 +475, 678, 679, 688, 687, 579, 580, 589, 588 +476, 679, 680, 689, 688, 580, 581, 590, 589 +477, 680, 681, 690, 689, 581, 582, 591, 590 +478, 681, 682, 691, 690, 582, 583, 592, 591 +479, 682, 683, 692, 691, 583, 584, 593, 592 +480, 683, 684, 693, 692, 584, 585, 594, 593 +481, 694, 695, 704, 703, 595, 596, 605, 604 +482, 695, 696, 705, 704, 596, 597, 606, 605 +483, 696, 697, 706, 705, 597, 598, 607, 606 +484, 697, 698, 707, 706, 598, 599, 608, 607 +485, 698, 699, 708, 707, 599, 600, 609, 608 +486, 699, 700, 709, 708, 600, 601, 610, 609 +487, 700, 701, 710, 709, 601, 602, 611, 610 +488, 701, 702, 711, 710, 602, 603, 612, 611 +489, 703, 704, 713, 712, 604, 605, 614, 613 +490, 704, 705, 714, 713, 605, 606, 615, 614 +491, 705, 706, 715, 714, 606, 607, 616, 615 +492, 706, 707, 716, 715, 607, 608, 617, 616 +493, 707, 708, 717, 716, 608, 609, 618, 617 +494, 708, 709, 718, 717, 609, 610, 619, 618 +495, 709, 710, 719, 718, 610, 611, 620, 619 +496, 710, 711, 720, 719, 611, 612, 621, 620 +497, 712, 713, 722, 721, 613, 614, 623, 622 +498, 713, 714, 723, 722, 614, 615, 624, 623 +499, 714, 715, 724, 723, 615, 616, 625, 624 +500, 715, 716, 725, 724, 616, 617, 626, 625 +501, 716, 717, 726, 725, 617, 618, 627, 626 +502, 717, 718, 727, 726, 618, 619, 628, 627 +503, 718, 719, 728, 727, 619, 620, 629, 628 +504, 719, 720, 729, 728, 620, 621, 630, 629 +505, 721, 722, 731, 730, 622, 623, 632, 631 +506, 722, 723, 732, 731, 623, 624, 633, 632 +507, 723, 724, 733, 732, 624, 625, 634, 633 +508, 724, 725, 734, 733, 625, 626, 635, 634 +509, 725, 726, 735, 734, 626, 627, 636, 635 +510, 726, 727, 736, 735, 627, 628, 637, 636 +511, 727, 728, 737, 736, 628, 629, 638, 637 +512, 728, 729, 738, 737, 629, 630, 639, 638 +513, 730, 731, 740, 739, 631, 632, 641, 640 +514, 731, 732, 741, 740, 632, 633, 642, 641 +515, 732, 733, 742, 741, 633, 634, 643, 642 +516, 733, 734, 743, 742, 634, 635, 644, 643 +517, 734, 735, 744, 743, 635, 636, 645, 644 +518, 735, 736, 745, 744, 636, 637, 646, 645 +519, 736, 737, 746, 745, 637, 638, 647, 646 +520, 737, 738, 747, 746, 638, 639, 648, 647 +521, 739, 740, 749, 748, 640, 641, 650, 649 +522, 740, 741, 750, 749, 641, 642, 651, 650 +523, 741, 742, 751, 750, 642, 643, 652, 651 +524, 742, 743, 752, 751, 643, 644, 653, 652 +525, 743, 744, 753, 752, 644, 645, 654, 653 +526, 744, 745, 754, 753, 645, 646, 655, 654 +527, 745, 746, 755, 754, 646, 647, 656, 655 +528, 746, 747, 756, 755, 647, 648, 657, 656 +529, 748, 749, 758, 757, 649, 650, 659, 658 +530, 749, 750, 759, 758, 650, 651, 660, 659 +531, 750, 751, 760, 759, 651, 652, 661, 660 +532, 751, 752, 761, 760, 652, 653, 662, 661 +533, 752, 753, 762, 761, 653, 654, 663, 662 +534, 753, 754, 763, 762, 654, 655, 664, 663 +535, 754, 755, 764, 763, 655, 656, 665, 664 +536, 755, 756, 765, 764, 656, 657, 666, 665 +537, 757, 758, 767, 766, 658, 659, 668, 667 +538, 758, 759, 768, 767, 659, 660, 669, 668 +539, 759, 760, 769, 768, 660, 661, 670, 669 +540, 760, 761, 770, 769, 661, 662, 671, 670 +541, 761, 762, 771, 770, 662, 663, 672, 671 +542, 762, 763, 772, 771, 663, 664, 673, 672 +543, 763, 764, 773, 772, 664, 665, 674, 673 +544, 764, 765, 774, 773, 665, 666, 675, 674 +545, 766, 767, 776, 775, 667, 668, 677, 676 +546, 767, 768, 777, 776, 668, 669, 678, 677 +547, 768, 769, 778, 777, 669, 670, 679, 678 +548, 769, 770, 779, 778, 670, 671, 680, 679 +549, 770, 771, 780, 779, 671, 672, 681, 680 +550, 771, 772, 781, 780, 672, 673, 682, 681 +551, 772, 773, 782, 781, 673, 674, 683, 682 +552, 773, 774, 783, 782, 674, 675, 684, 683 +553, 775, 776, 785, 784, 676, 677, 686, 685 +554, 776, 777, 786, 785, 677, 678, 687, 686 +555, 777, 778, 787, 786, 678, 679, 688, 687 +556, 778, 779, 788, 787, 679, 680, 689, 688 +557, 779, 780, 789, 788, 680, 681, 690, 689 +558, 780, 781, 790, 789, 681, 682, 691, 690 +559, 781, 782, 791, 790, 682, 683, 692, 691 +560, 782, 783, 792, 791, 683, 684, 693, 692 +561, 793, 794, 803, 802, 694, 695, 704, 703 +562, 794, 795, 804, 803, 695, 696, 705, 704 +563, 795, 796, 805, 804, 696, 697, 706, 705 +564, 796, 797, 806, 805, 697, 698, 707, 706 +565, 797, 798, 807, 806, 698, 699, 708, 707 +566, 798, 799, 808, 807, 699, 700, 709, 708 +567, 799, 800, 809, 808, 700, 701, 710, 709 +568, 800, 801, 810, 809, 701, 702, 711, 710 +569, 802, 803, 812, 811, 703, 704, 713, 712 +570, 803, 804, 813, 812, 704, 705, 714, 713 +571, 804, 805, 814, 813, 705, 706, 715, 714 +572, 805, 806, 815, 814, 706, 707, 716, 715 +573, 806, 807, 816, 815, 707, 708, 717, 716 +574, 807, 808, 817, 816, 708, 709, 718, 717 +575, 808, 809, 818, 817, 709, 710, 719, 718 +576, 809, 810, 819, 818, 710, 711, 720, 719 +577, 811, 812, 821, 820, 712, 713, 722, 721 +578, 812, 813, 822, 821, 713, 714, 723, 722 +579, 813, 814, 823, 822, 714, 715, 724, 723 +580, 814, 815, 824, 823, 715, 716, 725, 724 +581, 815, 816, 825, 824, 716, 717, 726, 725 +582, 816, 817, 826, 825, 717, 718, 727, 726 +583, 817, 818, 827, 826, 718, 719, 728, 727 +584, 818, 819, 828, 827, 719, 720, 729, 728 +585, 820, 821, 830, 829, 721, 722, 731, 730 +586, 821, 822, 831, 830, 722, 723, 732, 731 +587, 822, 823, 832, 831, 723, 724, 733, 732 +588, 823, 824, 833, 832, 724, 725, 734, 733 +589, 824, 825, 834, 833, 725, 726, 735, 734 +590, 825, 826, 835, 834, 726, 727, 736, 735 +591, 826, 827, 836, 835, 727, 728, 737, 736 +592, 827, 828, 837, 836, 728, 729, 738, 737 +593, 829, 830, 839, 838, 730, 731, 740, 739 +594, 830, 831, 840, 839, 731, 732, 741, 740 +595, 831, 832, 841, 840, 732, 733, 742, 741 +596, 832, 833, 842, 841, 733, 734, 743, 742 +597, 833, 834, 843, 842, 734, 735, 744, 743 +598, 834, 835, 844, 843, 735, 736, 745, 744 +599, 835, 836, 845, 844, 736, 737, 746, 745 +600, 836, 837, 846, 845, 737, 738, 747, 746 +601, 838, 839, 848, 847, 739, 740, 749, 748 +602, 839, 840, 849, 848, 740, 741, 750, 749 +603, 840, 841, 850, 849, 741, 742, 751, 750 +604, 841, 842, 851, 850, 742, 743, 752, 751 +605, 842, 843, 852, 851, 743, 744, 753, 752 +606, 843, 844, 853, 852, 744, 745, 754, 753 +607, 844, 845, 854, 853, 745, 746, 755, 754 +608, 845, 846, 855, 854, 746, 747, 756, 755 +609, 847, 848, 857, 856, 748, 749, 758, 757 +610, 848, 849, 858, 857, 749, 750, 759, 758 +611, 849, 850, 859, 858, 750, 751, 760, 759 +612, 850, 851, 860, 859, 751, 752, 761, 760 +613, 851, 852, 861, 860, 752, 753, 762, 761 +614, 852, 853, 862, 861, 753, 754, 763, 762 +615, 853, 854, 863, 862, 754, 755, 764, 763 +616, 854, 855, 864, 863, 755, 756, 765, 764 +617, 856, 857, 866, 865, 757, 758, 767, 766 +618, 857, 858, 867, 866, 758, 759, 768, 767 +619, 858, 859, 868, 867, 759, 760, 769, 768 +620, 859, 860, 869, 868, 760, 761, 770, 769 +621, 860, 861, 870, 869, 761, 762, 771, 770 +622, 861, 862, 871, 870, 762, 763, 772, 771 +623, 862, 863, 872, 871, 763, 764, 773, 772 +624, 863, 864, 873, 872, 764, 765, 774, 773 +625, 865, 866, 875, 874, 766, 767, 776, 775 +626, 866, 867, 876, 875, 767, 768, 777, 776 +627, 867, 868, 877, 876, 768, 769, 778, 777 +628, 868, 869, 878, 877, 769, 770, 779, 778 +629, 869, 870, 879, 878, 770, 771, 780, 779 +630, 870, 871, 880, 879, 771, 772, 781, 780 +631, 871, 872, 881, 880, 772, 773, 782, 781 +632, 872, 873, 882, 881, 773, 774, 783, 782 +633, 874, 875, 884, 883, 775, 776, 785, 784 +634, 875, 876, 885, 884, 776, 777, 786, 785 +635, 876, 877, 886, 885, 777, 778, 787, 786 +636, 877, 878, 887, 886, 778, 779, 788, 787 +637, 878, 879, 888, 887, 779, 780, 789, 788 +638, 879, 880, 889, 888, 780, 781, 790, 789 +639, 880, 881, 890, 889, 781, 782, 791, 790 +640, 881, 882, 891, 890, 782, 783, 792, 791 +*End Part +** +** +** ASSEMBLY +** +*Assembly, name=Assembly +** +*Instance, name=Part-1-1, part=Part-1 +*End Instance +** +*End Assembly +** +** MATERIALS +** +*Material, name=Material-1 +*Elastic +10., 0.49 diff --git a/single-node-refactor/regression_tests/standard_results/Abaqus_read/state/mat_pt_state_t_1.0000e+00.txt b/single-node-refactor/regression_tests/standard_results/Abaqus_read/state/mat_pt_state_t_1.0000e+00.txt new file mode 100644 index 000000000..64c795946 --- /dev/null +++ b/single-node-refactor/regression_tests/standard_results/Abaqus_read/state/mat_pt_state_t_1.0000e+00.txt @@ -0,0 +1,642 @@ +# state dump file +# x y z radius_2D radius_3D den pres sie sspd vol mass +-3.500000000000e+00 -3.500000000000e+00 9.500000000033e+00 4.949747468306e+00 1.071214264284e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-3.500000000000e+00 -2.500000000000e+00 9.500000000033e+00 4.301162633521e+00 1.042832680734e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-3.500000000000e+00 -1.500000000000e+00 9.500000000033e+00 3.807886552932e+00 1.023474474526e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-3.500000000000e+00 -5.000000000000e-01 9.500000000033e+00 3.535533905933e+00 1.013656746639e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-3.500000000000e+00 5.000000000000e-01 9.500000000033e+00 3.535533905933e+00 1.013656746639e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-3.500000000000e+00 1.500000000000e+00 9.500000000033e+00 3.807886552932e+00 1.023474474526e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-3.500000000000e+00 2.500000000000e+00 9.500000000033e+00 4.301162633521e+00 1.042832680734e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-3.500000000000e+00 3.500000000000e+00 9.500000000033e+00 4.949747468306e+00 1.071214264284e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-3.500000000000e+00 -3.500000000000e+00 8.500000000000e+00 4.949747468306e+00 9.836157786453e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-3.500000000000e+00 -2.500000000000e+00 8.500000000000e+00 4.301162633521e+00 9.526279441629e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-3.500000000000e+00 -1.500000000000e+00 8.500000000000e+00 3.807886552932e+00 9.313968005099e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-3.500000000000e+00 -5.000000000000e-01 8.500000000000e+00 3.535533905933e+00 9.205976319761e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-3.500000000000e+00 5.000000000000e-01 8.500000000000e+00 3.535533905933e+00 9.205976319761e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-3.500000000000e+00 1.500000000000e+00 8.500000000000e+00 3.807886552932e+00 9.313968005099e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-3.500000000000e+00 2.500000000000e+00 8.500000000000e+00 4.301162633521e+00 9.526279441629e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-3.500000000000e+00 3.500000000000e+00 8.500000000000e+00 4.949747468306e+00 9.836157786453e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-3.500000000000e+00 -3.500000000000e+00 7.500000000008e+00 4.949747468306e+00 8.986100377812e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-3.500000000000e+00 -2.500000000000e+00 7.500000000008e+00 4.301162633521e+00 8.645808232902e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-3.500000000000e+00 -1.500000000000e+00 7.500000000008e+00 3.807886552932e+00 8.411301920637e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-3.500000000000e+00 -5.000000000000e-01 7.500000000008e+00 3.535533905933e+00 8.291561975895e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-3.500000000000e+00 5.000000000000e-01 7.500000000008e+00 3.535533905933e+00 8.291561975895e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-3.500000000000e+00 1.500000000000e+00 7.500000000008e+00 3.807886552932e+00 8.411301920637e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-3.500000000000e+00 2.500000000000e+00 7.500000000008e+00 4.301162633521e+00 8.645808232902e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-3.500000000000e+00 3.500000000000e+00 7.500000000008e+00 4.949747468306e+00 8.986100377812e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-3.500000000000e+00 -3.500000000000e+00 6.500004552938e+00 4.949747468306e+00 8.170070941443e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-3.500000000000e+00 -2.500000000000e+00 6.500004552938e+00 4.301162633521e+00 7.794232430985e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-3.500000000000e+00 -1.500000000000e+00 6.500004552938e+00 3.807886552932e+00 7.533263515119e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-3.500000000000e+00 -5.000000000000e-01 6.500004552938e+00 3.535533905933e+00 7.399328293042e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-3.500000000000e+00 5.000000000000e-01 6.500004552938e+00 3.535533905933e+00 7.399328293042e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-3.500000000000e+00 1.500000000000e+00 6.500004552938e+00 3.807886552932e+00 7.533263515119e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-3.500000000000e+00 2.500000000000e+00 6.500004552938e+00 4.301162633521e+00 7.794232430985e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-3.500000000000e+00 3.500000000000e+00 6.500004552938e+00 4.949747468306e+00 8.170070941443e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-3.500000000000e+00 -3.500000000000e+00 5.503774481144e+00 4.949747468306e+00 7.402130337902e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-3.500000000000e+00 -2.500000000000e+00 5.503774481144e+00 4.301162633521e+00 6.985093667181e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-3.500000000000e+00 -1.500000000000e+00 5.503774481144e+00 3.807886552932e+00 6.692647722635e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-3.500000000000e+00 -5.000000000000e-01 5.503774481144e+00 3.535533905933e+00 6.541523793375e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-3.500000000000e+00 5.000000000000e-01 5.503774481144e+00 3.535533905933e+00 6.541523793375e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-3.500000000000e+00 1.500000000000e+00 5.503774481144e+00 3.807886552932e+00 6.692647722635e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-3.500000000000e+00 2.500000000000e+00 5.503774481144e+00 4.301162633521e+00 6.985093667181e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-3.500000000000e+00 3.500000000000e+00 5.503774481144e+00 4.949747468306e+00 7.402130337902e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-3.500000000000e+00 -3.500000000000e+00 4.601481985862e+00 4.949747468306e+00 6.758227316850e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-3.500000000000e+00 -2.500000000000e+00 4.601481985862e+00 4.301162633521e+00 6.298701172957e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-3.500000000000e+00 -1.500000000000e+00 4.601481985862e+00 3.807886552932e+00 5.972741118298e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-3.500000000000e+00 -5.000000000000e-01 4.601481985862e+00 3.535533905933e+00 5.802898970878e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-3.500000000000e+00 5.000000000000e-01 4.601481985862e+00 3.535533905933e+00 5.802898970878e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-3.500000000000e+00 1.500000000000e+00 4.601481985862e+00 3.807886552932e+00 5.972741118298e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-3.500000000000e+00 2.500000000000e+00 4.601481985862e+00 4.301162633521e+00 6.298701172957e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-3.500000000000e+00 3.500000000000e+00 4.601481985862e+00 4.949747468306e+00 6.758227316850e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-3.500000000000e+00 -3.500000000000e+00 4.014394513860e+00 4.949747468306e+00 6.373018383224e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-3.500000000000e+00 -2.500000000000e+00 4.014394513860e+00 4.301162633521e+00 5.883482243783e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-3.500000000000e+00 -1.500000000000e+00 4.014394513860e+00 3.807886552932e+00 5.533115154496e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-3.500000000000e+00 -5.000000000000e-01 4.014394513860e+00 3.535533905933e+00 5.349332978317e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-3.500000000000e+00 5.000000000000e-01 4.014394513860e+00 3.535533905933e+00 5.349332978317e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-3.500000000000e+00 1.500000000000e+00 4.014394513860e+00 3.807886552932e+00 5.533115154496e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-3.500000000000e+00 2.500000000000e+00 4.014394513860e+00 4.301162633521e+00 5.883482243783e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-3.500000000000e+00 3.500000000000e+00 4.014394513860e+00 4.949747468306e+00 6.373018383224e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-3.500000000000e+00 -3.500000000000e+00 3.680096178300e+00 4.949747468306e+00 6.167909522807e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-3.500000000000e+00 -2.500000000000e+00 3.680096178300e+00 4.301162633521e+00 5.660663201564e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-3.500000000000e+00 -1.500000000000e+00 3.680096178300e+00 3.807886552932e+00 5.295574367482e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-3.500000000000e+00 -5.000000000000e-01 3.680096178300e+00 3.535533905933e+00 5.103244838486e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-3.500000000000e+00 5.000000000000e-01 3.680096178300e+00 3.535533905933e+00 5.103244838486e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-3.500000000000e+00 1.500000000000e+00 3.680096178300e+00 3.807886552932e+00 5.295574367482e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-3.500000000000e+00 2.500000000000e+00 3.680096178300e+00 4.301162633521e+00 5.660663201564e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-3.500000000000e+00 3.500000000000e+00 3.680096178300e+00 4.949747468306e+00 6.167909522807e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-3.500000000000e+00 -3.500000000000e+00 3.296094971545e+00 4.949747468306e+00 5.946784178146e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-3.500000000000e+00 -2.500000000000e+00 3.296094971545e+00 4.301162633521e+00 5.418878302882e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-3.500000000000e+00 -1.500000000000e+00 3.296094971545e+00 3.807886552932e+00 5.036292491649e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-3.500000000000e+00 -5.000000000000e-01 3.296094971545e+00 3.535533905933e+00 4.833657213895e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-3.500000000000e+00 5.000000000000e-01 3.296094971545e+00 3.535533905933e+00 4.833657213895e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-3.500000000000e+00 1.500000000000e+00 3.296094971545e+00 3.807886552932e+00 5.036292491649e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-3.500000000000e+00 2.500000000000e+00 3.296094971545e+00 4.301162633521e+00 5.418878302882e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-3.500000000000e+00 3.500000000000e+00 3.296094971545e+00 4.949747468306e+00 5.946784178146e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-3.500000000000e+00 -3.500000000000e+00 1.532681249456e+00 4.949747468306e+00 5.181612858216e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-3.500000000000e+00 -2.500000000000e+00 1.532681249456e+00 4.301162633521e+00 4.566082764519e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-3.500000000000e+00 -1.500000000000e+00 1.532681249456e+00 3.807886552932e+00 4.104766962013e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-3.500000000000e+00 -5.000000000000e-01 1.532681249456e+00 3.535533905933e+00 3.853454529696e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-3.500000000000e+00 5.000000000000e-01 1.532681249456e+00 3.535533905933e+00 3.853454529696e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-3.500000000000e+00 1.500000000000e+00 1.532681249456e+00 3.807886552932e+00 4.104766962013e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-3.500000000000e+00 2.500000000000e+00 1.532681249456e+00 4.301162633521e+00 4.566082764519e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-3.500000000000e+00 3.500000000000e+00 1.532681249456e+00 4.949747468306e+00 5.181612858216e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-2.500000000000e+00 -3.500000000000e+00 9.500000000033e+00 4.301162633521e+00 1.042832680734e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-2.500000000000e+00 -2.500000000000e+00 9.500000000033e+00 3.535533905933e+00 1.013656746639e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-2.500000000000e+00 -1.500000000000e+00 9.500000000033e+00 2.915475947423e+00 9.937303457208e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-2.500000000000e+00 -5.000000000000e-01 9.500000000033e+00 2.549509756796e+00 9.836157786485e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-2.500000000000e+00 5.000000000000e-01 9.500000000033e+00 2.549509756796e+00 9.836157786485e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-2.500000000000e+00 1.500000000000e+00 9.500000000033e+00 2.915475947423e+00 9.937303457208e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-2.500000000000e+00 2.500000000000e+00 9.500000000033e+00 3.535533905933e+00 1.013656746639e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-2.500000000000e+00 3.500000000000e+00 9.500000000033e+00 4.301162633521e+00 1.042832680734e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-2.500000000000e+00 -3.500000000000e+00 8.500000000000e+00 4.301162633521e+00 9.526279441629e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-2.500000000000e+00 -2.500000000000e+00 8.500000000000e+00 3.535533905933e+00 9.205976319761e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-2.500000000000e+00 -1.500000000000e+00 8.500000000000e+00 2.915475947423e+00 8.986100377806e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-2.500000000000e+00 -5.000000000000e-01 8.500000000000e+00 2.549509756796e+00 8.874119674649e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-2.500000000000e+00 5.000000000000e-01 8.500000000000e+00 2.549509756796e+00 8.874119674649e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-2.500000000000e+00 1.500000000000e+00 8.500000000000e+00 2.915475947423e+00 8.986100377806e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-2.500000000000e+00 2.500000000000e+00 8.500000000000e+00 3.535533905933e+00 9.205976319761e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-2.500000000000e+00 3.500000000000e+00 8.500000000000e+00 4.301162633521e+00 9.526279441629e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-2.500000000000e+00 -3.500000000000e+00 7.500000000008e+00 4.301162633521e+00 8.645808232902e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-2.500000000000e+00 -2.500000000000e+00 7.500000000008e+00 3.535533905933e+00 8.291561975895e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-2.500000000000e+00 -1.500000000000e+00 7.500000000008e+00 2.915475947423e+00 8.046738469723e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-2.500000000000e+00 -5.000000000000e-01 7.500000000008e+00 2.549509756796e+00 7.921489758885e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-2.500000000000e+00 5.000000000000e-01 7.500000000008e+00 2.549509756796e+00 7.921489758885e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-2.500000000000e+00 1.500000000000e+00 7.500000000008e+00 2.915475947423e+00 8.046738469723e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-2.500000000000e+00 2.500000000000e+00 7.500000000008e+00 3.535533905933e+00 8.291561975895e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-2.500000000000e+00 3.500000000000e+00 7.500000000008e+00 4.301162633521e+00 8.645808232902e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-2.500000000000e+00 -3.500000000000e+00 6.500004552938e+00 4.301162633521e+00 7.794232430985e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-2.500000000000e+00 -2.500000000000e+00 6.500004552938e+00 3.535533905933e+00 7.399328293042e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-2.500000000000e+00 -1.500000000000e+00 6.500004552938e+00 2.915475947423e+00 7.123907578585e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-2.500000000000e+00 -5.000000000000e-01 6.500004552938e+00 2.549509756796e+00 6.982124260439e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-2.500000000000e+00 5.000000000000e-01 6.500004552938e+00 2.549509756796e+00 6.982124260439e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-2.500000000000e+00 1.500000000000e+00 6.500004552938e+00 2.915475947423e+00 7.123907578585e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-2.500000000000e+00 2.500000000000e+00 6.500004552938e+00 3.535533905933e+00 7.399328293042e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-2.500000000000e+00 3.500000000000e+00 6.500004552938e+00 4.301162633521e+00 7.794232430985e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-2.500000000000e+00 -3.500000000000e+00 5.503774481144e+00 4.301162633521e+00 6.985093667181e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-2.500000000000e+00 -2.500000000000e+00 5.503774481144e+00 3.535533905933e+00 6.541523793375e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-2.500000000000e+00 -1.500000000000e+00 5.503774481144e+00 2.915475947423e+00 6.228284959705e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-2.500000000000e+00 -5.000000000000e-01 5.503774481144e+00 2.549509756796e+00 6.065602487741e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-2.500000000000e+00 5.000000000000e-01 5.503774481144e+00 2.549509756796e+00 6.065602487741e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-2.500000000000e+00 1.500000000000e+00 5.503774481144e+00 2.915475947423e+00 6.228284959705e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-2.500000000000e+00 2.500000000000e+00 5.503774481144e+00 3.535533905933e+00 6.541523793375e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-2.500000000000e+00 3.500000000000e+00 5.503774481144e+00 4.301162633521e+00 6.985093667181e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-2.500000000000e+00 -3.500000000000e+00 4.601481985862e+00 4.301162633521e+00 6.298701172957e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-2.500000000000e+00 -2.500000000000e+00 4.601481985862e+00 3.535533905933e+00 5.802898970878e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-2.500000000000e+00 -1.500000000000e+00 4.601481985862e+00 2.915475947423e+00 5.447351325756e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-2.500000000000e+00 -5.000000000000e-01 4.601481985862e+00 2.549509756796e+00 5.260573777281e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-2.500000000000e+00 5.000000000000e-01 4.601481985862e+00 2.549509756796e+00 5.260573777281e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-2.500000000000e+00 1.500000000000e+00 4.601481985862e+00 2.915475947423e+00 5.447351325756e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-2.500000000000e+00 2.500000000000e+00 4.601481985862e+00 3.535533905933e+00 5.802898970878e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-2.500000000000e+00 3.500000000000e+00 4.601481985862e+00 4.301162633521e+00 6.298701172957e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-2.500000000000e+00 -3.500000000000e+00 4.014394513860e+00 4.301162633521e+00 5.883482243783e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-2.500000000000e+00 -2.500000000000e+00 4.014394513860e+00 3.535533905933e+00 5.349332978317e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-2.500000000000e+00 -1.500000000000e+00 4.014394513860e+00 2.915475947423e+00 4.961387236742e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-2.500000000000e+00 -5.000000000000e-01 4.014394513860e+00 2.549509756796e+00 4.755561303664e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-2.500000000000e+00 5.000000000000e-01 4.014394513860e+00 2.549509756796e+00 4.755561303664e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-2.500000000000e+00 1.500000000000e+00 4.014394513860e+00 2.915475947423e+00 4.961387236742e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-2.500000000000e+00 2.500000000000e+00 4.014394513860e+00 3.535533905933e+00 5.349332978317e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-2.500000000000e+00 3.500000000000e+00 4.014394513860e+00 4.301162633521e+00 5.883482243783e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-2.500000000000e+00 -3.500000000000e+00 3.680096178300e+00 4.301162633521e+00 5.660663201564e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-2.500000000000e+00 -2.500000000000e+00 3.680096178300e+00 3.535533905933e+00 5.103244838486e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-2.500000000000e+00 -1.500000000000e+00 3.680096178300e+00 2.915475947423e+00 4.695008826566e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-2.500000000000e+00 -5.000000000000e-01 3.680096178300e+00 2.549509756796e+00 4.476952968430e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-2.500000000000e+00 5.000000000000e-01 3.680096178300e+00 2.549509756796e+00 4.476952968430e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-2.500000000000e+00 1.500000000000e+00 3.680096178300e+00 2.915475947423e+00 4.695008826566e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-2.500000000000e+00 2.500000000000e+00 3.680096178300e+00 3.535533905933e+00 5.103244838486e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-2.500000000000e+00 3.500000000000e+00 3.680096178300e+00 4.301162633521e+00 5.660663201564e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-2.500000000000e+00 -3.500000000000e+00 3.296094971545e+00 4.301162633521e+00 5.418878302882e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-2.500000000000e+00 -2.500000000000e+00 3.296094971545e+00 3.535533905933e+00 4.833657213895e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-2.500000000000e+00 -1.500000000000e+00 3.296094971545e+00 2.915475947423e+00 4.400482026033e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-2.500000000000e+00 -5.000000000000e-01 3.296094971545e+00 2.549509756796e+00 4.167042363769e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-2.500000000000e+00 5.000000000000e-01 3.296094971545e+00 2.549509756796e+00 4.167042363769e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-2.500000000000e+00 1.500000000000e+00 3.296094971545e+00 2.915475947423e+00 4.400482026033e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-2.500000000000e+00 2.500000000000e+00 3.296094971545e+00 3.535533905933e+00 4.833657213895e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-2.500000000000e+00 3.500000000000e+00 3.296094971545e+00 4.301162633521e+00 5.418878302882e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-2.500000000000e+00 -3.500000000000e+00 1.532681249456e+00 4.301162633521e+00 4.566082764519e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-2.500000000000e+00 -2.500000000000e+00 1.532681249456e+00 3.535533905933e+00 3.853454529696e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-2.500000000000e+00 -1.500000000000e+00 1.532681249456e+00 2.915475947423e+00 3.293798993933e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-2.500000000000e+00 -5.000000000000e-01 1.532681249456e+00 2.549509756796e+00 2.974745671891e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-2.500000000000e+00 5.000000000000e-01 1.532681249456e+00 2.549509756796e+00 2.974745671891e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-2.500000000000e+00 1.500000000000e+00 1.532681249456e+00 2.915475947423e+00 3.293798993933e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-2.500000000000e+00 2.500000000000e+00 1.532681249456e+00 3.535533905933e+00 3.853454529696e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-2.500000000000e+00 3.500000000000e+00 1.532681249456e+00 4.301162633521e+00 4.566082764519e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-1.500000000000e+00 -3.500000000000e+00 9.500000000033e+00 3.807886552932e+00 1.023474474526e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-1.500000000000e+00 -2.500000000000e+00 9.500000000033e+00 2.915475947423e+00 9.937303457208e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-1.500000000000e+00 -1.500000000000e+00 9.500000000033e+00 2.121320343560e+00 9.733961166998e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-1.500000000000e+00 -5.000000000000e-01 9.500000000033e+00 1.581138830084e+00 9.630680142162e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-1.500000000000e+00 5.000000000000e-01 9.500000000033e+00 1.581138830084e+00 9.630680142162e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-1.500000000000e+00 1.500000000000e+00 9.500000000033e+00 2.121320343560e+00 9.733961166998e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-1.500000000000e+00 2.500000000000e+00 9.500000000033e+00 2.915475947423e+00 9.937303457208e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-1.500000000000e+00 3.500000000000e+00 9.500000000033e+00 3.807886552932e+00 1.023474474526e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-1.500000000000e+00 -3.500000000000e+00 8.500000000000e+00 3.807886552932e+00 9.313968005099e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-1.500000000000e+00 -2.500000000000e+00 8.500000000000e+00 2.915475947423e+00 8.986100377806e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-1.500000000000e+00 -1.500000000000e+00 8.500000000000e+00 2.121320343560e+00 8.760707733968e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-1.500000000000e+00 -5.000000000000e-01 8.500000000000e+00 1.581138830084e+00 8.645808232895e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-1.500000000000e+00 5.000000000000e-01 8.500000000000e+00 1.581138830084e+00 8.645808232895e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-1.500000000000e+00 1.500000000000e+00 8.500000000000e+00 2.121320343560e+00 8.760707733968e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-1.500000000000e+00 2.500000000000e+00 8.500000000000e+00 2.915475947423e+00 8.986100377806e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-1.500000000000e+00 3.500000000000e+00 8.500000000000e+00 3.807886552932e+00 9.313968005099e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-1.500000000000e+00 -3.500000000000e+00 7.500000000008e+00 3.807886552932e+00 8.411301920637e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-1.500000000000e+00 -2.500000000000e+00 7.500000000008e+00 2.915475947423e+00 8.046738469723e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-1.500000000000e+00 -1.500000000000e+00 7.500000000008e+00 2.121320343560e+00 7.794228634067e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-1.500000000000e+00 -5.000000000000e-01 7.500000000008e+00 1.581138830084e+00 7.664854858385e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-1.500000000000e+00 5.000000000000e-01 7.500000000008e+00 1.581138830084e+00 7.664854858385e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-1.500000000000e+00 1.500000000000e+00 7.500000000008e+00 2.121320343560e+00 7.794228634067e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-1.500000000000e+00 2.500000000000e+00 7.500000000008e+00 2.915475947423e+00 8.046738469723e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-1.500000000000e+00 3.500000000000e+00 7.500000000008e+00 3.807886552932e+00 8.411301920637e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-1.500000000000e+00 -3.500000000000e+00 6.500004552938e+00 3.807886552932e+00 7.533263515119e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-1.500000000000e+00 -2.500000000000e+00 6.500004552938e+00 2.915475947423e+00 7.123907578585e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-1.500000000000e+00 -1.500000000000e+00 6.500004552938e+00 2.121320343560e+00 6.837401493858e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-1.500000000000e+00 -5.000000000000e-01 6.500004552938e+00 1.581138830084e+00 6.689548504063e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-1.500000000000e+00 5.000000000000e-01 6.500004552938e+00 1.581138830084e+00 6.689548504063e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-1.500000000000e+00 1.500000000000e+00 6.500004552938e+00 2.121320343560e+00 6.837401493858e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-1.500000000000e+00 2.500000000000e+00 6.500004552938e+00 2.915475947423e+00 7.123907578585e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-1.500000000000e+00 3.500000000000e+00 6.500004552938e+00 3.807886552932e+00 7.533263515119e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-1.500000000000e+00 -3.500000000000e+00 5.503774481144e+00 3.807886552932e+00 6.692647722635e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-1.500000000000e+00 -2.500000000000e+00 5.503774481144e+00 2.915475947423e+00 6.228284959705e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-1.500000000000e+00 -1.500000000000e+00 5.503774481144e+00 2.121320343560e+00 5.898434838098e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-1.500000000000e+00 -5.000000000000e-01 5.503774481144e+00 1.581138830084e+00 5.726389223524e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-1.500000000000e+00 5.000000000000e-01 5.503774481144e+00 1.581138830084e+00 5.726389223524e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-1.500000000000e+00 1.500000000000e+00 5.503774481144e+00 2.121320343560e+00 5.898434838098e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-1.500000000000e+00 2.500000000000e+00 5.503774481144e+00 2.915475947423e+00 6.228284959705e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-1.500000000000e+00 3.500000000000e+00 5.503774481144e+00 3.807886552932e+00 6.692647722635e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-1.500000000000e+00 -3.500000000000e+00 4.601481985862e+00 3.807886552932e+00 5.972741118298e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-1.500000000000e+00 -2.500000000000e+00 4.601481985862e+00 2.915475947423e+00 5.447351325756e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-1.500000000000e+00 -1.500000000000e+00 4.601481985862e+00 2.121320343560e+00 5.066915873212e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-1.500000000000e+00 -5.000000000000e-01 4.601481985862e+00 1.581138830084e+00 4.865556131236e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-1.500000000000e+00 5.000000000000e-01 4.601481985862e+00 1.581138830084e+00 4.865556131236e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-1.500000000000e+00 1.500000000000e+00 4.601481985862e+00 2.121320343560e+00 5.066915873212e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-1.500000000000e+00 2.500000000000e+00 4.601481985862e+00 2.915475947423e+00 5.447351325756e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-1.500000000000e+00 3.500000000000e+00 4.601481985862e+00 3.807886552932e+00 5.972741118298e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-1.500000000000e+00 -3.500000000000e+00 4.014394513860e+00 3.807886552932e+00 5.533115154496e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-1.500000000000e+00 -2.500000000000e+00 4.014394513860e+00 2.915475947423e+00 4.961387236742e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-1.500000000000e+00 -1.500000000000e+00 4.014394513860e+00 2.121320343560e+00 4.540414442857e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-1.500000000000e+00 -5.000000000000e-01 4.014394513860e+00 1.581138830084e+00 4.314552504363e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-1.500000000000e+00 5.000000000000e-01 4.014394513860e+00 1.581138830084e+00 4.314552504363e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-1.500000000000e+00 1.500000000000e+00 4.014394513860e+00 2.121320343560e+00 4.540414442857e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-1.500000000000e+00 2.500000000000e+00 4.014394513860e+00 2.915475947423e+00 4.961387236742e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-1.500000000000e+00 3.500000000000e+00 4.014394513860e+00 3.807886552932e+00 5.533115154496e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-1.500000000000e+00 -3.500000000000e+00 3.680096178300e+00 3.807886552932e+00 5.295574367482e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-1.500000000000e+00 -2.500000000000e+00 3.680096178300e+00 2.915475947423e+00 4.695008826566e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-1.500000000000e+00 -1.500000000000e+00 3.680096178300e+00 2.121320343560e+00 4.247717961628e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-1.500000000000e+00 -5.000000000000e-01 3.680096178300e+00 1.581138830084e+00 4.005384860602e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-1.500000000000e+00 5.000000000000e-01 3.680096178300e+00 1.581138830084e+00 4.005384860602e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-1.500000000000e+00 1.500000000000e+00 3.680096178300e+00 2.121320343560e+00 4.247717961628e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-1.500000000000e+00 2.500000000000e+00 3.680096178300e+00 2.915475947423e+00 4.695008826566e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-1.500000000000e+00 3.500000000000e+00 3.680096178300e+00 3.807886552932e+00 5.295574367482e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-1.500000000000e+00 -3.500000000000e+00 3.296094971545e+00 3.807886552932e+00 5.036292491649e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-1.500000000000e+00 -2.500000000000e+00 3.296094971545e+00 2.915475947423e+00 4.400482026033e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-1.500000000000e+00 -1.500000000000e+00 3.296094971545e+00 2.121320343560e+00 3.919724743071e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-1.500000000000e+00 -5.000000000000e-01 3.296094971545e+00 1.581138830084e+00 3.655713618631e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-1.500000000000e+00 5.000000000000e-01 3.296094971545e+00 1.581138830084e+00 3.655713618631e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-1.500000000000e+00 1.500000000000e+00 3.296094971545e+00 2.121320343560e+00 3.919724743071e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-1.500000000000e+00 2.500000000000e+00 3.296094971545e+00 2.915475947423e+00 4.400482026033e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-1.500000000000e+00 3.500000000000e+00 3.296094971545e+00 3.807886552932e+00 5.036292491649e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-1.500000000000e+00 -3.500000000000e+00 1.532681249456e+00 3.807886552932e+00 4.104766962013e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-1.500000000000e+00 -2.500000000000e+00 1.532681249456e+00 2.915475947423e+00 3.293798993933e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-1.500000000000e+00 -1.500000000000e+00 1.532681249456e+00 2.121320343560e+00 2.617080780647e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-1.500000000000e+00 -5.000000000000e-01 1.532681249456e+00 1.581138830084e+00 2.202069892722e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-1.500000000000e+00 5.000000000000e-01 1.532681249456e+00 1.581138830084e+00 2.202069892722e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-1.500000000000e+00 1.500000000000e+00 1.532681249456e+00 2.121320343560e+00 2.617080780647e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-1.500000000000e+00 2.500000000000e+00 1.532681249456e+00 2.915475947423e+00 3.293798993933e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-1.500000000000e+00 3.500000000000e+00 1.532681249456e+00 3.807886552932e+00 4.104766962013e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-5.000000000000e-01 -3.500000000000e+00 9.500000000033e+00 3.535533905933e+00 1.013656746639e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-5.000000000000e-01 -2.500000000000e+00 9.500000000033e+00 2.549509756796e+00 9.836157786485e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-5.000000000000e-01 -1.500000000000e+00 9.500000000033e+00 1.581138830084e+00 9.630680142162e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-5.000000000000e-01 -5.000000000000e-01 9.500000000033e+00 7.071067811865e-01 9.526279441662e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-5.000000000000e-01 5.000000000000e-01 9.500000000033e+00 7.071067811865e-01 9.526279441662e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-5.000000000000e-01 1.500000000000e+00 9.500000000033e+00 1.581138830084e+00 9.630680142162e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-5.000000000000e-01 2.500000000000e+00 9.500000000033e+00 2.549509756796e+00 9.836157786485e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-5.000000000000e-01 3.500000000000e+00 9.500000000033e+00 3.535533905933e+00 1.013656746639e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +-5.000000000000e-01 -3.500000000000e+00 8.500000000000e+00 3.535533905933e+00 9.205976319761e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-5.000000000000e-01 -2.500000000000e+00 8.500000000000e+00 2.549509756796e+00 8.874119674649e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-5.000000000000e-01 -1.500000000000e+00 8.500000000000e+00 1.581138830084e+00 8.645808232895e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-5.000000000000e-01 -5.000000000000e-01 8.500000000000e+00 7.071067811865e-01 8.529361054616e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-5.000000000000e-01 5.000000000000e-01 8.500000000000e+00 7.071067811865e-01 8.529361054616e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-5.000000000000e-01 1.500000000000e+00 8.500000000000e+00 1.581138830084e+00 8.645808232895e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-5.000000000000e-01 2.500000000000e+00 8.500000000000e+00 2.549509756796e+00 8.874119674649e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-5.000000000000e-01 3.500000000000e+00 8.500000000000e+00 3.535533905933e+00 9.205976319761e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +-5.000000000000e-01 -3.500000000000e+00 7.500000000008e+00 3.535533905933e+00 8.291561975895e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-5.000000000000e-01 -2.500000000000e+00 7.500000000008e+00 2.549509756796e+00 7.921489758885e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-5.000000000000e-01 -1.500000000000e+00 7.500000000008e+00 1.581138830084e+00 7.664854858385e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-5.000000000000e-01 -5.000000000000e-01 7.500000000008e+00 7.071067811865e-01 7.533259586667e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-5.000000000000e-01 5.000000000000e-01 7.500000000008e+00 7.071067811865e-01 7.533259586667e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-5.000000000000e-01 1.500000000000e+00 7.500000000008e+00 1.581138830084e+00 7.664854858385e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-5.000000000000e-01 2.500000000000e+00 7.500000000008e+00 2.549509756796e+00 7.921489758885e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-5.000000000000e-01 3.500000000000e+00 7.500000000008e+00 3.535533905933e+00 8.291561975895e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +-5.000000000000e-01 -3.500000000000e+00 6.500004552938e+00 3.535533905933e+00 7.399328293042e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-5.000000000000e-01 -2.500000000000e+00 6.500004552938e+00 2.549509756796e+00 6.982124260439e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-5.000000000000e-01 -1.500000000000e+00 6.500004552938e+00 1.581138830084e+00 6.689548504063e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-5.000000000000e-01 -5.000000000000e-01 6.500004552938e+00 7.071067811865e-01 6.538352941546e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-5.000000000000e-01 5.000000000000e-01 6.500004552938e+00 7.071067811865e-01 6.538352941546e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-5.000000000000e-01 1.500000000000e+00 6.500004552938e+00 1.581138830084e+00 6.689548504063e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-5.000000000000e-01 2.500000000000e+00 6.500004552938e+00 2.549509756796e+00 6.982124260439e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-5.000000000000e-01 3.500000000000e+00 6.500004552938e+00 3.535533905933e+00 7.399328293042e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +-5.000000000000e-01 -3.500000000000e+00 5.503774481144e+00 3.535533905933e+00 6.541523793375e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-5.000000000000e-01 -2.500000000000e+00 5.503774481144e+00 2.549509756796e+00 6.065602487741e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-5.000000000000e-01 -1.500000000000e+00 5.503774481144e+00 1.581138830084e+00 5.726389223524e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-5.000000000000e-01 -5.000000000000e-01 5.503774481144e+00 7.071067811865e-01 5.549011942615e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-5.000000000000e-01 5.000000000000e-01 5.503774481144e+00 7.071067811865e-01 5.549011942615e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-5.000000000000e-01 1.500000000000e+00 5.503774481144e+00 1.581138830084e+00 5.726389223524e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-5.000000000000e-01 2.500000000000e+00 5.503774481144e+00 2.549509756796e+00 6.065602487741e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-5.000000000000e-01 3.500000000000e+00 5.503774481144e+00 3.535533905933e+00 6.541523793375e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +-5.000000000000e-01 -3.500000000000e+00 4.601481985862e+00 3.535533905933e+00 5.802898970878e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-5.000000000000e-01 -2.500000000000e+00 4.601481985862e+00 2.549509756796e+00 5.260573777281e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-5.000000000000e-01 -1.500000000000e+00 4.601481985862e+00 1.581138830084e+00 4.865556131236e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-5.000000000000e-01 -5.000000000000e-01 4.601481985862e+00 7.071067811865e-01 4.655495297625e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-5.000000000000e-01 5.000000000000e-01 4.601481985862e+00 7.071067811865e-01 4.655495297625e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-5.000000000000e-01 1.500000000000e+00 4.601481985862e+00 1.581138830084e+00 4.865556131236e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-5.000000000000e-01 2.500000000000e+00 4.601481985862e+00 2.549509756796e+00 5.260573777281e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-5.000000000000e-01 3.500000000000e+00 4.601481985862e+00 3.535533905933e+00 5.802898970878e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +-5.000000000000e-01 -3.500000000000e+00 4.014394513860e+00 3.535533905933e+00 5.349332978317e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-5.000000000000e-01 -2.500000000000e+00 4.014394513860e+00 2.549509756796e+00 4.755561303664e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-5.000000000000e-01 -1.500000000000e+00 4.014394513860e+00 1.581138830084e+00 4.314552504363e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-5.000000000000e-01 -5.000000000000e-01 4.014394513860e+00 7.071067811865e-01 4.076194709887e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-5.000000000000e-01 5.000000000000e-01 4.014394513860e+00 7.071067811865e-01 4.076194709887e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-5.000000000000e-01 1.500000000000e+00 4.014394513860e+00 1.581138830084e+00 4.314552504363e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-5.000000000000e-01 2.500000000000e+00 4.014394513860e+00 2.549509756796e+00 4.755561303664e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-5.000000000000e-01 3.500000000000e+00 4.014394513860e+00 3.535533905933e+00 5.349332978317e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +-5.000000000000e-01 -3.500000000000e+00 3.680096178300e+00 3.535533905933e+00 5.103244838486e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-5.000000000000e-01 -2.500000000000e+00 3.680096178300e+00 2.549509756796e+00 4.476952968430e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-5.000000000000e-01 -1.500000000000e+00 3.680096178300e+00 1.581138830084e+00 4.005384860602e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-5.000000000000e-01 -5.000000000000e-01 3.680096178300e+00 7.071067811865e-01 3.747413492202e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-5.000000000000e-01 5.000000000000e-01 3.680096178300e+00 7.071067811865e-01 3.747413492202e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-5.000000000000e-01 1.500000000000e+00 3.680096178300e+00 1.581138830084e+00 4.005384860602e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-5.000000000000e-01 2.500000000000e+00 3.680096178300e+00 2.549509756796e+00 4.476952968430e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-5.000000000000e-01 3.500000000000e+00 3.680096178300e+00 3.535533905933e+00 5.103244838486e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +-5.000000000000e-01 -3.500000000000e+00 3.296094971545e+00 3.535533905933e+00 4.833657213895e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-5.000000000000e-01 -2.500000000000e+00 3.296094971545e+00 2.549509756796e+00 4.167042363769e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-5.000000000000e-01 -1.500000000000e+00 3.296094971545e+00 1.581138830084e+00 3.655713618631e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-5.000000000000e-01 -5.000000000000e-01 3.296094971545e+00 7.071067811865e-01 3.371089150622e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-5.000000000000e-01 5.000000000000e-01 3.296094971545e+00 7.071067811865e-01 3.371089150622e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-5.000000000000e-01 1.500000000000e+00 3.296094971545e+00 1.581138830084e+00 3.655713618631e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-5.000000000000e-01 2.500000000000e+00 3.296094971545e+00 2.549509756796e+00 4.167042363769e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-5.000000000000e-01 3.500000000000e+00 3.296094971545e+00 3.535533905933e+00 4.833657213895e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +-5.000000000000e-01 -3.500000000000e+00 1.532681249456e+00 3.535533905933e+00 3.853454529696e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-5.000000000000e-01 -2.500000000000e+00 1.532681249456e+00 2.549509756796e+00 2.974745671891e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-5.000000000000e-01 -1.500000000000e+00 1.532681249456e+00 1.581138830084e+00 2.202069892722e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-5.000000000000e-01 -5.000000000000e-01 1.532681249456e+00 7.071067811865e-01 1.687931222661e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-5.000000000000e-01 5.000000000000e-01 1.532681249456e+00 7.071067811865e-01 1.687931222661e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-5.000000000000e-01 1.500000000000e+00 1.532681249456e+00 1.581138830084e+00 2.202069892722e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-5.000000000000e-01 2.500000000000e+00 1.532681249456e+00 2.549509756796e+00 2.974745671891e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +-5.000000000000e-01 3.500000000000e+00 1.532681249456e+00 3.535533905933e+00 3.853454529696e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +5.000000000000e-01 -3.500000000000e+00 9.500000000033e+00 3.535533905933e+00 1.013656746639e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +5.000000000000e-01 -2.500000000000e+00 9.500000000033e+00 2.549509756796e+00 9.836157786485e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +5.000000000000e-01 -1.500000000000e+00 9.500000000033e+00 1.581138830084e+00 9.630680142162e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +5.000000000000e-01 -5.000000000000e-01 9.500000000033e+00 7.071067811865e-01 9.526279441662e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +5.000000000000e-01 5.000000000000e-01 9.500000000033e+00 7.071067811865e-01 9.526279441662e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +5.000000000000e-01 1.500000000000e+00 9.500000000033e+00 1.581138830084e+00 9.630680142162e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +5.000000000000e-01 2.500000000000e+00 9.500000000033e+00 2.549509756796e+00 9.836157786485e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +5.000000000000e-01 3.500000000000e+00 9.500000000033e+00 3.535533905933e+00 1.013656746639e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +5.000000000000e-01 -3.500000000000e+00 8.500000000000e+00 3.535533905933e+00 9.205976319761e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +5.000000000000e-01 -2.500000000000e+00 8.500000000000e+00 2.549509756796e+00 8.874119674649e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +5.000000000000e-01 -1.500000000000e+00 8.500000000000e+00 1.581138830084e+00 8.645808232895e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +5.000000000000e-01 -5.000000000000e-01 8.500000000000e+00 7.071067811865e-01 8.529361054616e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +5.000000000000e-01 5.000000000000e-01 8.500000000000e+00 7.071067811865e-01 8.529361054616e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +5.000000000000e-01 1.500000000000e+00 8.500000000000e+00 1.581138830084e+00 8.645808232895e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +5.000000000000e-01 2.500000000000e+00 8.500000000000e+00 2.549509756796e+00 8.874119674649e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +5.000000000000e-01 3.500000000000e+00 8.500000000000e+00 3.535533905933e+00 9.205976319761e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +5.000000000000e-01 -3.500000000000e+00 7.500000000008e+00 3.535533905933e+00 8.291561975895e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +5.000000000000e-01 -2.500000000000e+00 7.500000000008e+00 2.549509756796e+00 7.921489758885e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +5.000000000000e-01 -1.500000000000e+00 7.500000000008e+00 1.581138830084e+00 7.664854858385e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +5.000000000000e-01 -5.000000000000e-01 7.500000000008e+00 7.071067811865e-01 7.533259586667e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +5.000000000000e-01 5.000000000000e-01 7.500000000008e+00 7.071067811865e-01 7.533259586667e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +5.000000000000e-01 1.500000000000e+00 7.500000000008e+00 1.581138830084e+00 7.664854858385e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +5.000000000000e-01 2.500000000000e+00 7.500000000008e+00 2.549509756796e+00 7.921489758885e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +5.000000000000e-01 3.500000000000e+00 7.500000000008e+00 3.535533905933e+00 8.291561975895e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +5.000000000000e-01 -3.500000000000e+00 6.500004552938e+00 3.535533905933e+00 7.399328293042e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +5.000000000000e-01 -2.500000000000e+00 6.500004552938e+00 2.549509756796e+00 6.982124260439e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +5.000000000000e-01 -1.500000000000e+00 6.500004552938e+00 1.581138830084e+00 6.689548504063e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +5.000000000000e-01 -5.000000000000e-01 6.500004552938e+00 7.071067811865e-01 6.538352941546e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +5.000000000000e-01 5.000000000000e-01 6.500004552938e+00 7.071067811865e-01 6.538352941546e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +5.000000000000e-01 1.500000000000e+00 6.500004552938e+00 1.581138830084e+00 6.689548504063e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +5.000000000000e-01 2.500000000000e+00 6.500004552938e+00 2.549509756796e+00 6.982124260439e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +5.000000000000e-01 3.500000000000e+00 6.500004552938e+00 3.535533905933e+00 7.399328293042e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +5.000000000000e-01 -3.500000000000e+00 5.503774481144e+00 3.535533905933e+00 6.541523793375e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +5.000000000000e-01 -2.500000000000e+00 5.503774481144e+00 2.549509756796e+00 6.065602487741e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +5.000000000000e-01 -1.500000000000e+00 5.503774481144e+00 1.581138830084e+00 5.726389223524e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +5.000000000000e-01 -5.000000000000e-01 5.503774481144e+00 7.071067811865e-01 5.549011942615e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +5.000000000000e-01 5.000000000000e-01 5.503774481144e+00 7.071067811865e-01 5.549011942615e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +5.000000000000e-01 1.500000000000e+00 5.503774481144e+00 1.581138830084e+00 5.726389223524e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +5.000000000000e-01 2.500000000000e+00 5.503774481144e+00 2.549509756796e+00 6.065602487741e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +5.000000000000e-01 3.500000000000e+00 5.503774481144e+00 3.535533905933e+00 6.541523793375e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +5.000000000000e-01 -3.500000000000e+00 4.601481985862e+00 3.535533905933e+00 5.802898970878e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +5.000000000000e-01 -2.500000000000e+00 4.601481985862e+00 2.549509756796e+00 5.260573777281e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +5.000000000000e-01 -1.500000000000e+00 4.601481985862e+00 1.581138830084e+00 4.865556131236e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +5.000000000000e-01 -5.000000000000e-01 4.601481985862e+00 7.071067811865e-01 4.655495297625e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +5.000000000000e-01 5.000000000000e-01 4.601481985862e+00 7.071067811865e-01 4.655495297625e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +5.000000000000e-01 1.500000000000e+00 4.601481985862e+00 1.581138830084e+00 4.865556131236e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +5.000000000000e-01 2.500000000000e+00 4.601481985862e+00 2.549509756796e+00 5.260573777281e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +5.000000000000e-01 3.500000000000e+00 4.601481985862e+00 3.535533905933e+00 5.802898970878e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +5.000000000000e-01 -3.500000000000e+00 4.014394513860e+00 3.535533905933e+00 5.349332978317e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +5.000000000000e-01 -2.500000000000e+00 4.014394513860e+00 2.549509756796e+00 4.755561303664e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +5.000000000000e-01 -1.500000000000e+00 4.014394513860e+00 1.581138830084e+00 4.314552504363e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +5.000000000000e-01 -5.000000000000e-01 4.014394513860e+00 7.071067811865e-01 4.076194709887e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +5.000000000000e-01 5.000000000000e-01 4.014394513860e+00 7.071067811865e-01 4.076194709887e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +5.000000000000e-01 1.500000000000e+00 4.014394513860e+00 1.581138830084e+00 4.314552504363e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +5.000000000000e-01 2.500000000000e+00 4.014394513860e+00 2.549509756796e+00 4.755561303664e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +5.000000000000e-01 3.500000000000e+00 4.014394513860e+00 3.535533905933e+00 5.349332978317e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +5.000000000000e-01 -3.500000000000e+00 3.680096178300e+00 3.535533905933e+00 5.103244838486e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +5.000000000000e-01 -2.500000000000e+00 3.680096178300e+00 2.549509756796e+00 4.476952968430e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +5.000000000000e-01 -1.500000000000e+00 3.680096178300e+00 1.581138830084e+00 4.005384860602e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +5.000000000000e-01 -5.000000000000e-01 3.680096178300e+00 7.071067811865e-01 3.747413492202e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +5.000000000000e-01 5.000000000000e-01 3.680096178300e+00 7.071067811865e-01 3.747413492202e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +5.000000000000e-01 1.500000000000e+00 3.680096178300e+00 1.581138830084e+00 4.005384860602e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +5.000000000000e-01 2.500000000000e+00 3.680096178300e+00 2.549509756796e+00 4.476952968430e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +5.000000000000e-01 3.500000000000e+00 3.680096178300e+00 3.535533905933e+00 5.103244838486e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +5.000000000000e-01 -3.500000000000e+00 3.296094971545e+00 3.535533905933e+00 4.833657213895e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +5.000000000000e-01 -2.500000000000e+00 3.296094971545e+00 2.549509756796e+00 4.167042363769e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +5.000000000000e-01 -1.500000000000e+00 3.296094971545e+00 1.581138830084e+00 3.655713618631e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +5.000000000000e-01 -5.000000000000e-01 3.296094971545e+00 7.071067811865e-01 3.371089150622e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +5.000000000000e-01 5.000000000000e-01 3.296094971545e+00 7.071067811865e-01 3.371089150622e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +5.000000000000e-01 1.500000000000e+00 3.296094971545e+00 1.581138830084e+00 3.655713618631e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +5.000000000000e-01 2.500000000000e+00 3.296094971545e+00 2.549509756796e+00 4.167042363769e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +5.000000000000e-01 3.500000000000e+00 3.296094971545e+00 3.535533905933e+00 4.833657213895e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +5.000000000000e-01 -3.500000000000e+00 1.532681249456e+00 3.535533905933e+00 3.853454529696e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +5.000000000000e-01 -2.500000000000e+00 1.532681249456e+00 2.549509756796e+00 2.974745671891e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +5.000000000000e-01 -1.500000000000e+00 1.532681249456e+00 1.581138830084e+00 2.202069892722e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +5.000000000000e-01 -5.000000000000e-01 1.532681249456e+00 7.071067811865e-01 1.687931222661e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +5.000000000000e-01 5.000000000000e-01 1.532681249456e+00 7.071067811865e-01 1.687931222661e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +5.000000000000e-01 1.500000000000e+00 1.532681249456e+00 1.581138830084e+00 2.202069892722e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +5.000000000000e-01 2.500000000000e+00 1.532681249456e+00 2.549509756796e+00 2.974745671891e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +5.000000000000e-01 3.500000000000e+00 1.532681249456e+00 3.535533905933e+00 3.853454529696e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +1.500000000000e+00 -3.500000000000e+00 9.500000000033e+00 3.807886552932e+00 1.023474474526e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +1.500000000000e+00 -2.500000000000e+00 9.500000000033e+00 2.915475947423e+00 9.937303457208e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +1.500000000000e+00 -1.500000000000e+00 9.500000000033e+00 2.121320343560e+00 9.733961166998e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +1.500000000000e+00 -5.000000000000e-01 9.500000000033e+00 1.581138830084e+00 9.630680142162e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +1.500000000000e+00 5.000000000000e-01 9.500000000033e+00 1.581138830084e+00 9.630680142162e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +1.500000000000e+00 1.500000000000e+00 9.500000000033e+00 2.121320343560e+00 9.733961166998e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +1.500000000000e+00 2.500000000000e+00 9.500000000033e+00 2.915475947423e+00 9.937303457208e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +1.500000000000e+00 3.500000000000e+00 9.500000000033e+00 3.807886552932e+00 1.023474474526e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +1.500000000000e+00 -3.500000000000e+00 8.500000000000e+00 3.807886552932e+00 9.313968005099e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +1.500000000000e+00 -2.500000000000e+00 8.500000000000e+00 2.915475947423e+00 8.986100377806e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +1.500000000000e+00 -1.500000000000e+00 8.500000000000e+00 2.121320343560e+00 8.760707733968e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +1.500000000000e+00 -5.000000000000e-01 8.500000000000e+00 1.581138830084e+00 8.645808232895e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +1.500000000000e+00 5.000000000000e-01 8.500000000000e+00 1.581138830084e+00 8.645808232895e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +1.500000000000e+00 1.500000000000e+00 8.500000000000e+00 2.121320343560e+00 8.760707733968e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +1.500000000000e+00 2.500000000000e+00 8.500000000000e+00 2.915475947423e+00 8.986100377806e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +1.500000000000e+00 3.500000000000e+00 8.500000000000e+00 3.807886552932e+00 9.313968005099e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +1.500000000000e+00 -3.500000000000e+00 7.500000000008e+00 3.807886552932e+00 8.411301920637e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +1.500000000000e+00 -2.500000000000e+00 7.500000000008e+00 2.915475947423e+00 8.046738469723e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +1.500000000000e+00 -1.500000000000e+00 7.500000000008e+00 2.121320343560e+00 7.794228634067e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +1.500000000000e+00 -5.000000000000e-01 7.500000000008e+00 1.581138830084e+00 7.664854858385e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +1.500000000000e+00 5.000000000000e-01 7.500000000008e+00 1.581138830084e+00 7.664854858385e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +1.500000000000e+00 1.500000000000e+00 7.500000000008e+00 2.121320343560e+00 7.794228634067e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +1.500000000000e+00 2.500000000000e+00 7.500000000008e+00 2.915475947423e+00 8.046738469723e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +1.500000000000e+00 3.500000000000e+00 7.500000000008e+00 3.807886552932e+00 8.411301920637e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +1.500000000000e+00 -3.500000000000e+00 6.500004552938e+00 3.807886552932e+00 7.533263515119e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +1.500000000000e+00 -2.500000000000e+00 6.500004552938e+00 2.915475947423e+00 7.123907578585e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +1.500000000000e+00 -1.500000000000e+00 6.500004552938e+00 2.121320343560e+00 6.837401493858e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +1.500000000000e+00 -5.000000000000e-01 6.500004552938e+00 1.581138830084e+00 6.689548504063e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +1.500000000000e+00 5.000000000000e-01 6.500004552938e+00 1.581138830084e+00 6.689548504063e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +1.500000000000e+00 1.500000000000e+00 6.500004552938e+00 2.121320343560e+00 6.837401493858e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +1.500000000000e+00 2.500000000000e+00 6.500004552938e+00 2.915475947423e+00 7.123907578585e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +1.500000000000e+00 3.500000000000e+00 6.500004552938e+00 3.807886552932e+00 7.533263515119e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +1.500000000000e+00 -3.500000000000e+00 5.503774481144e+00 3.807886552932e+00 6.692647722635e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +1.500000000000e+00 -2.500000000000e+00 5.503774481144e+00 2.915475947423e+00 6.228284959705e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +1.500000000000e+00 -1.500000000000e+00 5.503774481144e+00 2.121320343560e+00 5.898434838098e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +1.500000000000e+00 -5.000000000000e-01 5.503774481144e+00 1.581138830084e+00 5.726389223524e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +1.500000000000e+00 5.000000000000e-01 5.503774481144e+00 1.581138830084e+00 5.726389223524e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +1.500000000000e+00 1.500000000000e+00 5.503774481144e+00 2.121320343560e+00 5.898434838098e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +1.500000000000e+00 2.500000000000e+00 5.503774481144e+00 2.915475947423e+00 6.228284959705e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +1.500000000000e+00 3.500000000000e+00 5.503774481144e+00 3.807886552932e+00 6.692647722635e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +1.500000000000e+00 -3.500000000000e+00 4.601481985862e+00 3.807886552932e+00 5.972741118298e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +1.500000000000e+00 -2.500000000000e+00 4.601481985862e+00 2.915475947423e+00 5.447351325756e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +1.500000000000e+00 -1.500000000000e+00 4.601481985862e+00 2.121320343560e+00 5.066915873212e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +1.500000000000e+00 -5.000000000000e-01 4.601481985862e+00 1.581138830084e+00 4.865556131236e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +1.500000000000e+00 5.000000000000e-01 4.601481985862e+00 1.581138830084e+00 4.865556131236e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +1.500000000000e+00 1.500000000000e+00 4.601481985862e+00 2.121320343560e+00 5.066915873212e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +1.500000000000e+00 2.500000000000e+00 4.601481985862e+00 2.915475947423e+00 5.447351325756e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +1.500000000000e+00 3.500000000000e+00 4.601481985862e+00 3.807886552932e+00 5.972741118298e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +1.500000000000e+00 -3.500000000000e+00 4.014394513860e+00 3.807886552932e+00 5.533115154496e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +1.500000000000e+00 -2.500000000000e+00 4.014394513860e+00 2.915475947423e+00 4.961387236742e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +1.500000000000e+00 -1.500000000000e+00 4.014394513860e+00 2.121320343560e+00 4.540414442857e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +1.500000000000e+00 -5.000000000000e-01 4.014394513860e+00 1.581138830084e+00 4.314552504363e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +1.500000000000e+00 5.000000000000e-01 4.014394513860e+00 1.581138830084e+00 4.314552504363e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +1.500000000000e+00 1.500000000000e+00 4.014394513860e+00 2.121320343560e+00 4.540414442857e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +1.500000000000e+00 2.500000000000e+00 4.014394513860e+00 2.915475947423e+00 4.961387236742e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +1.500000000000e+00 3.500000000000e+00 4.014394513860e+00 3.807886552932e+00 5.533115154496e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +1.500000000000e+00 -3.500000000000e+00 3.680096178300e+00 3.807886552932e+00 5.295574367482e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +1.500000000000e+00 -2.500000000000e+00 3.680096178300e+00 2.915475947423e+00 4.695008826566e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +1.500000000000e+00 -1.500000000000e+00 3.680096178300e+00 2.121320343560e+00 4.247717961628e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +1.500000000000e+00 -5.000000000000e-01 3.680096178300e+00 1.581138830084e+00 4.005384860602e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +1.500000000000e+00 5.000000000000e-01 3.680096178300e+00 1.581138830084e+00 4.005384860602e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +1.500000000000e+00 1.500000000000e+00 3.680096178300e+00 2.121320343560e+00 4.247717961628e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +1.500000000000e+00 2.500000000000e+00 3.680096178300e+00 2.915475947423e+00 4.695008826566e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +1.500000000000e+00 3.500000000000e+00 3.680096178300e+00 3.807886552932e+00 5.295574367482e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +1.500000000000e+00 -3.500000000000e+00 3.296094971545e+00 3.807886552932e+00 5.036292491649e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +1.500000000000e+00 -2.500000000000e+00 3.296094971545e+00 2.915475947423e+00 4.400482026033e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +1.500000000000e+00 -1.500000000000e+00 3.296094971545e+00 2.121320343560e+00 3.919724743071e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +1.500000000000e+00 -5.000000000000e-01 3.296094971545e+00 1.581138830084e+00 3.655713618631e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +1.500000000000e+00 5.000000000000e-01 3.296094971545e+00 1.581138830084e+00 3.655713618631e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +1.500000000000e+00 1.500000000000e+00 3.296094971545e+00 2.121320343560e+00 3.919724743071e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +1.500000000000e+00 2.500000000000e+00 3.296094971545e+00 2.915475947423e+00 4.400482026033e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +1.500000000000e+00 3.500000000000e+00 3.296094971545e+00 3.807886552932e+00 5.036292491649e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +1.500000000000e+00 -3.500000000000e+00 1.532681249456e+00 3.807886552932e+00 4.104766962013e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +1.500000000000e+00 -2.500000000000e+00 1.532681249456e+00 2.915475947423e+00 3.293798993933e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +1.500000000000e+00 -1.500000000000e+00 1.532681249456e+00 2.121320343560e+00 2.617080780647e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +1.500000000000e+00 -5.000000000000e-01 1.532681249456e+00 1.581138830084e+00 2.202069892722e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +1.500000000000e+00 5.000000000000e-01 1.532681249456e+00 1.581138830084e+00 2.202069892722e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +1.500000000000e+00 1.500000000000e+00 1.532681249456e+00 2.121320343560e+00 2.617080780647e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +1.500000000000e+00 2.500000000000e+00 1.532681249456e+00 2.915475947423e+00 3.293798993933e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +1.500000000000e+00 3.500000000000e+00 1.532681249456e+00 3.807886552932e+00 4.104766962013e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +2.500000000000e+00 -3.500000000000e+00 9.500000000033e+00 4.301162633521e+00 1.042832680734e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +2.500000000000e+00 -2.500000000000e+00 9.500000000033e+00 3.535533905933e+00 1.013656746639e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +2.500000000000e+00 -1.500000000000e+00 9.500000000033e+00 2.915475947423e+00 9.937303457208e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +2.500000000000e+00 -5.000000000000e-01 9.500000000033e+00 2.549509756796e+00 9.836157786485e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +2.500000000000e+00 5.000000000000e-01 9.500000000033e+00 2.549509756796e+00 9.836157786485e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +2.500000000000e+00 1.500000000000e+00 9.500000000033e+00 2.915475947423e+00 9.937303457208e+00 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +2.500000000000e+00 2.500000000000e+00 9.500000000033e+00 3.535533905933e+00 1.013656746639e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +2.500000000000e+00 3.500000000000e+00 9.500000000033e+00 4.301162633521e+00 1.042832680734e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +2.500000000000e+00 -3.500000000000e+00 8.500000000000e+00 4.301162633521e+00 9.526279441629e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +2.500000000000e+00 -2.500000000000e+00 8.500000000000e+00 3.535533905933e+00 9.205976319761e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +2.500000000000e+00 -1.500000000000e+00 8.500000000000e+00 2.915475947423e+00 8.986100377806e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +2.500000000000e+00 -5.000000000000e-01 8.500000000000e+00 2.549509756796e+00 8.874119674649e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +2.500000000000e+00 5.000000000000e-01 8.500000000000e+00 2.549509756796e+00 8.874119674649e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +2.500000000000e+00 1.500000000000e+00 8.500000000000e+00 2.915475947423e+00 8.986100377806e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +2.500000000000e+00 2.500000000000e+00 8.500000000000e+00 3.535533905933e+00 9.205976319761e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +2.500000000000e+00 3.500000000000e+00 8.500000000000e+00 4.301162633521e+00 9.526279441629e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +2.500000000000e+00 -3.500000000000e+00 7.500000000008e+00 4.301162633521e+00 8.645808232902e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +2.500000000000e+00 -2.500000000000e+00 7.500000000008e+00 3.535533905933e+00 8.291561975895e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +2.500000000000e+00 -1.500000000000e+00 7.500000000008e+00 2.915475947423e+00 8.046738469723e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +2.500000000000e+00 -5.000000000000e-01 7.500000000008e+00 2.549509756796e+00 7.921489758885e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +2.500000000000e+00 5.000000000000e-01 7.500000000008e+00 2.549509756796e+00 7.921489758885e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +2.500000000000e+00 1.500000000000e+00 7.500000000008e+00 2.915475947423e+00 8.046738469723e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +2.500000000000e+00 2.500000000000e+00 7.500000000008e+00 3.535533905933e+00 8.291561975895e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +2.500000000000e+00 3.500000000000e+00 7.500000000008e+00 4.301162633521e+00 8.645808232902e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +2.500000000000e+00 -3.500000000000e+00 6.500004552938e+00 4.301162633521e+00 7.794232430985e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +2.500000000000e+00 -2.500000000000e+00 6.500004552938e+00 3.535533905933e+00 7.399328293042e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +2.500000000000e+00 -1.500000000000e+00 6.500004552938e+00 2.915475947423e+00 7.123907578585e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +2.500000000000e+00 -5.000000000000e-01 6.500004552938e+00 2.549509756796e+00 6.982124260439e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +2.500000000000e+00 5.000000000000e-01 6.500004552938e+00 2.549509756796e+00 6.982124260439e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +2.500000000000e+00 1.500000000000e+00 6.500004552938e+00 2.915475947423e+00 7.123907578585e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +2.500000000000e+00 2.500000000000e+00 6.500004552938e+00 3.535533905933e+00 7.399328293042e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +2.500000000000e+00 3.500000000000e+00 6.500004552938e+00 4.301162633521e+00 7.794232430985e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +2.500000000000e+00 -3.500000000000e+00 5.503774481144e+00 4.301162633521e+00 6.985093667181e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +2.500000000000e+00 -2.500000000000e+00 5.503774481144e+00 3.535533905933e+00 6.541523793375e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +2.500000000000e+00 -1.500000000000e+00 5.503774481144e+00 2.915475947423e+00 6.228284959705e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +2.500000000000e+00 -5.000000000000e-01 5.503774481144e+00 2.549509756796e+00 6.065602487741e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +2.500000000000e+00 5.000000000000e-01 5.503774481144e+00 2.549509756796e+00 6.065602487741e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +2.500000000000e+00 1.500000000000e+00 5.503774481144e+00 2.915475947423e+00 6.228284959705e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +2.500000000000e+00 2.500000000000e+00 5.503774481144e+00 3.535533905933e+00 6.541523793375e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +2.500000000000e+00 3.500000000000e+00 5.503774481144e+00 4.301162633521e+00 6.985093667181e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +2.500000000000e+00 -3.500000000000e+00 4.601481985862e+00 4.301162633521e+00 6.298701172957e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +2.500000000000e+00 -2.500000000000e+00 4.601481985862e+00 3.535533905933e+00 5.802898970878e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +2.500000000000e+00 -1.500000000000e+00 4.601481985862e+00 2.915475947423e+00 5.447351325756e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +2.500000000000e+00 -5.000000000000e-01 4.601481985862e+00 2.549509756796e+00 5.260573777281e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +2.500000000000e+00 5.000000000000e-01 4.601481985862e+00 2.549509756796e+00 5.260573777281e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +2.500000000000e+00 1.500000000000e+00 4.601481985862e+00 2.915475947423e+00 5.447351325756e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +2.500000000000e+00 2.500000000000e+00 4.601481985862e+00 3.535533905933e+00 5.802898970878e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +2.500000000000e+00 3.500000000000e+00 4.601481985862e+00 4.301162633521e+00 6.298701172957e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +2.500000000000e+00 -3.500000000000e+00 4.014394513860e+00 4.301162633521e+00 5.883482243783e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +2.500000000000e+00 -2.500000000000e+00 4.014394513860e+00 3.535533905933e+00 5.349332978317e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +2.500000000000e+00 -1.500000000000e+00 4.014394513860e+00 2.915475947423e+00 4.961387236742e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +2.500000000000e+00 -5.000000000000e-01 4.014394513860e+00 2.549509756796e+00 4.755561303664e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +2.500000000000e+00 5.000000000000e-01 4.014394513860e+00 2.549509756796e+00 4.755561303664e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +2.500000000000e+00 1.500000000000e+00 4.014394513860e+00 2.915475947423e+00 4.961387236742e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +2.500000000000e+00 2.500000000000e+00 4.014394513860e+00 3.535533905933e+00 5.349332978317e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +2.500000000000e+00 3.500000000000e+00 4.014394513860e+00 4.301162633521e+00 5.883482243783e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +2.500000000000e+00 -3.500000000000e+00 3.680096178300e+00 4.301162633521e+00 5.660663201564e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +2.500000000000e+00 -2.500000000000e+00 3.680096178300e+00 3.535533905933e+00 5.103244838486e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +2.500000000000e+00 -1.500000000000e+00 3.680096178300e+00 2.915475947423e+00 4.695008826566e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +2.500000000000e+00 -5.000000000000e-01 3.680096178300e+00 2.549509756796e+00 4.476952968430e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +2.500000000000e+00 5.000000000000e-01 3.680096178300e+00 2.549509756796e+00 4.476952968430e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +2.500000000000e+00 1.500000000000e+00 3.680096178300e+00 2.915475947423e+00 4.695008826566e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +2.500000000000e+00 2.500000000000e+00 3.680096178300e+00 3.535533905933e+00 5.103244838486e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +2.500000000000e+00 3.500000000000e+00 3.680096178300e+00 4.301162633521e+00 5.660663201564e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +2.500000000000e+00 -3.500000000000e+00 3.296094971545e+00 4.301162633521e+00 5.418878302882e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +2.500000000000e+00 -2.500000000000e+00 3.296094971545e+00 3.535533905933e+00 4.833657213895e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +2.500000000000e+00 -1.500000000000e+00 3.296094971545e+00 2.915475947423e+00 4.400482026033e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +2.500000000000e+00 -5.000000000000e-01 3.296094971545e+00 2.549509756796e+00 4.167042363769e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +2.500000000000e+00 5.000000000000e-01 3.296094971545e+00 2.549509756796e+00 4.167042363769e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +2.500000000000e+00 1.500000000000e+00 3.296094971545e+00 2.915475947423e+00 4.400482026033e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +2.500000000000e+00 2.500000000000e+00 3.296094971545e+00 3.535533905933e+00 4.833657213895e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +2.500000000000e+00 3.500000000000e+00 3.296094971545e+00 4.301162633521e+00 5.418878302882e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +2.500000000000e+00 -3.500000000000e+00 1.532681249456e+00 4.301162633521e+00 4.566082764519e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +2.500000000000e+00 -2.500000000000e+00 1.532681249456e+00 3.535533905933e+00 3.853454529696e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +2.500000000000e+00 -1.500000000000e+00 1.532681249456e+00 2.915475947423e+00 3.293798993933e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +2.500000000000e+00 -5.000000000000e-01 1.532681249456e+00 2.549509756796e+00 2.974745671891e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +2.500000000000e+00 5.000000000000e-01 1.532681249456e+00 2.549509756796e+00 2.974745671891e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +2.500000000000e+00 1.500000000000e+00 1.532681249456e+00 2.915475947423e+00 3.293798993933e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +2.500000000000e+00 2.500000000000e+00 1.532681249456e+00 3.535533905933e+00 3.853454529696e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +2.500000000000e+00 3.500000000000e+00 1.532681249456e+00 4.301162633521e+00 4.566082764519e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +3.500000000000e+00 -3.500000000000e+00 9.500000000033e+00 4.949747468306e+00 1.071214264284e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +3.500000000000e+00 -2.500000000000e+00 9.500000000033e+00 4.301162633521e+00 1.042832680734e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +3.500000000000e+00 -1.500000000000e+00 9.500000000033e+00 3.807886552932e+00 1.023474474526e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +3.500000000000e+00 -5.000000000000e-01 9.500000000033e+00 3.535533905933e+00 1.013656746639e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +3.500000000000e+00 5.000000000000e-01 9.500000000033e+00 3.535533905933e+00 1.013656746639e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +3.500000000000e+00 1.500000000000e+00 9.500000000033e+00 3.807886552932e+00 1.023474474526e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +3.500000000000e+00 2.500000000000e+00 9.500000000033e+00 4.301162633521e+00 1.042832680734e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +3.500000000000e+00 3.500000000000e+00 9.500000000033e+00 4.949747468306e+00 1.071214264284e+01 9.999999999333e-01 6.666666665926e-11 9.999999999556e-11 1.054092553366e-05 1.000000000067e+00 1.000000000000e+00 +3.500000000000e+00 -3.500000000000e+00 8.500000000000e+00 4.949747468306e+00 9.836157786453e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +3.500000000000e+00 -2.500000000000e+00 8.500000000000e+00 4.301162633521e+00 9.526279441629e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +3.500000000000e+00 -1.500000000000e+00 8.500000000000e+00 3.807886552932e+00 9.313968005099e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +3.500000000000e+00 -5.000000000000e-01 8.500000000000e+00 3.535533905933e+00 9.205976319761e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +3.500000000000e+00 5.000000000000e-01 8.500000000000e+00 3.535533905933e+00 9.205976319761e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +3.500000000000e+00 1.500000000000e+00 8.500000000000e+00 3.807886552932e+00 9.313968005099e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +3.500000000000e+00 2.500000000000e+00 8.500000000000e+00 4.301162633521e+00 9.526279441629e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +3.500000000000e+00 3.500000000000e+00 8.500000000000e+00 4.949747468306e+00 9.836157786453e+00 1.000000000000e+00 6.666666666667e-11 1.000000000000e-10 1.054092553389e-05 1.000000000000e+00 1.000000000000e+00 +3.500000000000e+00 -3.500000000000e+00 7.500000000008e+00 4.949747468306e+00 8.986100377812e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +3.500000000000e+00 -2.500000000000e+00 7.500000000008e+00 4.301162633521e+00 8.645808232902e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +3.500000000000e+00 -1.500000000000e+00 7.500000000008e+00 3.807886552932e+00 8.411301920637e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +3.500000000000e+00 -5.000000000000e-01 7.500000000008e+00 3.535533905933e+00 8.291561975895e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +3.500000000000e+00 5.000000000000e-01 7.500000000008e+00 3.535533905933e+00 8.291561975895e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +3.500000000000e+00 1.500000000000e+00 7.500000000008e+00 3.807886552932e+00 8.411301920637e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +3.500000000000e+00 2.500000000000e+00 7.500000000008e+00 4.301162633521e+00 8.645808232902e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +3.500000000000e+00 3.500000000000e+00 7.500000000008e+00 4.949747468306e+00 8.986100377812e+00 1.000000000015e+00 6.666666666837e-11 1.000000000010e-10 1.054092553395e-05 9.999999999847e-01 1.000000000000e+00 +3.500000000000e+00 -3.500000000000e+00 6.500004552938e+00 4.949747468306e+00 8.170070941443e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +3.500000000000e+00 -2.500000000000e+00 6.500004552938e+00 4.301162633521e+00 7.794232430985e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +3.500000000000e+00 -1.500000000000e+00 6.500004552938e+00 3.807886552932e+00 7.533263515119e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +3.500000000000e+00 -5.000000000000e-01 6.500004552938e+00 3.535533905933e+00 7.399328293042e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +3.500000000000e+00 5.000000000000e-01 6.500004552938e+00 3.535533905933e+00 7.399328293042e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +3.500000000000e+00 1.500000000000e+00 6.500004552938e+00 3.807886552932e+00 7.533263515119e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +3.500000000000e+00 2.500000000000e+00 6.500004552938e+00 4.301162633521e+00 7.794232430985e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +3.500000000000e+00 3.500000000000e+00 6.500004552938e+00 4.949747468306e+00 8.170070941443e+00 1.000009105929e+00 6.673385610705e-11 1.000998726583e-10 1.054618797156e-05 9.999908941542e-01 1.000000000000e+00 +3.500000000000e+00 -3.500000000000e+00 5.503774481144e+00 4.949747468306e+00 7.402130337902e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +3.500000000000e+00 -2.500000000000e+00 5.503774481144e+00 4.301162633521e+00 6.985093667181e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +3.500000000000e+00 -1.500000000000e+00 5.503774481144e+00 3.807886552932e+00 6.692647722635e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +3.500000000000e+00 -5.000000000000e-01 5.503774481144e+00 3.535533905933e+00 6.541523793375e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +3.500000000000e+00 5.000000000000e-01 5.503774481144e+00 3.535533905933e+00 6.541523793375e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +3.500000000000e+00 1.500000000000e+00 5.503774481144e+00 3.807886552932e+00 6.692647722635e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +3.500000000000e+00 2.500000000000e+00 5.503774481144e+00 4.301162633521e+00 6.985093667181e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +3.500000000000e+00 3.500000000000e+00 5.503774481144e+00 4.949747468306e+00 7.402130337902e+00 1.007587893095e+00 9.423240791318e-06 1.402841507311e-05 3.948053679854e-03 9.924692494350e-01 1.000000000000e+00 +3.500000000000e+00 -3.500000000000e+00 4.601481985862e+00 4.949747468306e+00 6.758227316850e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +3.500000000000e+00 -2.500000000000e+00 4.601481985862e+00 4.301162633521e+00 6.298701172957e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +3.500000000000e+00 -1.500000000000e+00 4.601481985862e+00 3.807886552932e+00 5.972741118298e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +3.500000000000e+00 -5.000000000000e-01 4.601481985862e+00 3.535533905933e+00 5.802898970878e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +3.500000000000e+00 5.000000000000e-01 4.601481985862e+00 3.535533905933e+00 5.802898970878e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +3.500000000000e+00 1.500000000000e+00 4.601481985862e+00 3.807886552932e+00 5.972741118298e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +3.500000000000e+00 2.500000000000e+00 4.601481985862e+00 4.301162633521e+00 6.298701172957e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +3.500000000000e+00 3.500000000000e+00 4.601481985862e+00 4.949747468306e+00 6.758227316850e+00 1.231351578792e+00 5.775744364526e-02 7.035859372747e-02 2.796000988068e-01 8.121157411283e-01 1.000000000000e+00 +3.500000000000e+00 -3.500000000000e+00 4.014394513860e+00 4.949747468306e+00 6.373018383224e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +3.500000000000e+00 -2.500000000000e+00 4.014394513860e+00 4.301162633521e+00 5.883482243783e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +3.500000000000e+00 -1.500000000000e+00 4.014394513860e+00 3.807886552932e+00 5.533115154496e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +3.500000000000e+00 -5.000000000000e-01 4.014394513860e+00 3.535533905933e+00 5.349332978317e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +3.500000000000e+00 5.000000000000e-01 4.014394513860e+00 3.535533905933e+00 5.349332978317e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +3.500000000000e+00 1.500000000000e+00 4.014394513860e+00 3.807886552932e+00 5.533115154496e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +3.500000000000e+00 2.500000000000e+00 4.014394513860e+00 4.301162633521e+00 5.883482243783e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +3.500000000000e+00 3.500000000000e+00 4.014394513860e+00 4.949747468306e+00 6.373018383224e+00 2.761979234492e+00 2.578794134311e+00 1.400514222974e+00 1.247448161013e+00 3.620592028759e-01 1.000000000000e+00 +3.500000000000e+00 -3.500000000000e+00 3.680096178300e+00 4.949747468306e+00 6.167909522807e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +3.500000000000e+00 -2.500000000000e+00 3.680096178300e+00 4.301162633521e+00 5.660663201564e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +3.500000000000e+00 -1.500000000000e+00 3.680096178300e+00 3.807886552932e+00 5.295574367482e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +3.500000000000e+00 -5.000000000000e-01 3.680096178300e+00 3.535533905933e+00 5.103244838486e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +3.500000000000e+00 5.000000000000e-01 3.680096178300e+00 3.535533905933e+00 5.103244838486e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +3.500000000000e+00 1.500000000000e+00 3.680096178300e+00 3.807886552932e+00 5.295574367482e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +3.500000000000e+00 2.500000000000e+00 3.680096178300e+00 4.301162633521e+00 5.660663201564e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +3.500000000000e+00 3.500000000000e+00 3.680096178300e+00 4.949747468306e+00 6.167909522807e+00 3.262243945994e+00 4.638402854399e+00 2.132766401526e+00 1.539396130351e+00 3.065374682442e-01 1.000000000000e+00 +3.500000000000e+00 -3.500000000000e+00 3.296094971545e+00 4.949747468306e+00 5.946784178146e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +3.500000000000e+00 -2.500000000000e+00 3.296094971545e+00 4.301162633521e+00 5.418878302882e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +3.500000000000e+00 -1.500000000000e+00 3.296094971545e+00 3.807886552932e+00 5.036292491649e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +3.500000000000e+00 -5.000000000000e-01 3.296094971545e+00 3.535533905933e+00 4.833657213895e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +3.500000000000e+00 5.000000000000e-01 3.296094971545e+00 3.535533905933e+00 4.833657213895e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +3.500000000000e+00 1.500000000000e+00 3.296094971545e+00 3.807886552932e+00 5.036292491649e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +3.500000000000e+00 2.500000000000e+00 3.296094971545e+00 4.301162633521e+00 5.418878302882e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +3.500000000000e+00 3.500000000000e+00 3.296094971545e+00 4.949747468306e+00 5.946784178146e+00 2.167011839705e+00 4.410703290493e+00 3.053077428798e+00 1.841821993087e+00 4.614649452659e-01 1.000000000000e+00 +3.500000000000e+00 -3.500000000000e+00 1.532681249456e+00 4.949747468306e+00 5.181612858216e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +3.500000000000e+00 -2.500000000000e+00 1.532681249456e+00 4.301162633521e+00 4.566082764519e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +3.500000000000e+00 -1.500000000000e+00 1.532681249456e+00 3.807886552932e+00 4.104766962013e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +3.500000000000e+00 -5.000000000000e-01 1.532681249456e+00 3.535533905933e+00 3.853454529696e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +3.500000000000e+00 5.000000000000e-01 1.532681249456e+00 3.535533905933e+00 3.853454529696e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +3.500000000000e+00 1.500000000000e+00 1.532681249456e+00 3.807886552932e+00 4.104766962013e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +3.500000000000e+00 2.500000000000e+00 1.532681249456e+00 4.301162633521e+00 4.566082764519e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 +3.500000000000e+00 3.500000000000e+00 1.532681249456e+00 4.949747468306e+00 5.181612858216e+00 3.262256912045e-01 1.068894657421e+01 4.914824397219e+01 7.389801077776e+00 3.065362498912e+00 1.000000000000e+00 diff --git a/single-node-refactor/regression_tests/test_refactor.py b/single-node-refactor/regression_tests/test_refactor.py index adbfff9c8..9186f745c 100644 --- a/single-node-refactor/regression_tests/test_refactor.py +++ b/single-node-refactor/regression_tests/test_refactor.py @@ -7,13 +7,13 @@ import glob # Builds being tested -builds = ["openmp"] +builds = ["cuda"] # Name(s) of the solver being used solvers = ["Fierro"] # Add names of each test -tests = ["Sedov", "Sod_X", "Sod_Y", "Sod_Z", "Sedov_Erosion","Sedov_Read_Ensight", "Sedov_rz_polar"] +tests = ["Sedov", "Sod_X", "Sod_Y", "Sod_Z", "Sedov_Erosion","Sedov_Read_Ensight", "Sedov_rz_polar", "Abaqus_read"] # Extract data from txt file def extract_state_data(filename): diff --git a/single-node-refactor/src/common/include/mesh_io.h b/single-node-refactor/src/common/include/mesh_io.h index 998216022..bc9c0ca3a 100644 --- a/single-node-refactor/src/common/include/mesh_io.h +++ b/single-node-refactor/src/common/include/mesh_io.h @@ -165,6 +165,14 @@ class MeshReader throw std::runtime_error("**** No mesh path given for read_mesh ****"); } + std::ifstream file(mesh_file_); + if (file.is_open()) { + std::cout << "The file exists." << std::endl; + file.close(); + } else { + throw std::runtime_error("**** Mesh path given does not exists ****"); + } + // Check mesh file extension // and read based on extension std::string filePathStr(mesh_file_); @@ -383,9 +391,6 @@ class MeshReader bool readingNodes = false; bool readingElements = false; - int nodeCount = 0; - int elemCount = 0; - while (std::getline(inputFile, line)) { if (line.find("*Node") != std::string::npos) { readingNodes = true; From 343c29e1744bd10c98a772a27dca82a3daddbe4c Mon Sep 17 00:00:00 2001 From: Jacob Moore Date: Wed, 28 Aug 2024 15:00:43 -0500 Subject: [PATCH 29/33] ENH: Add gitattributes file to ignore data/meshes from code statistics --- .gitattributes | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..1dea52a55 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,33 @@ +special-vendored-path/* linguist-documentation + + + +dev-utils/* linguist-documentation +dev-utils/* linguist-documentation +docs/* linguist-documentation + +integrated-tests/Test-scripts/Solver-Inputs/* linguist-documentation +integrated-tests/Test-scripts/standard-results/* linguist-documentation + +legacy/* linguist-documentation + +python/stl_files/* linguist-documentation + +scripts/* linguist-documentation + +single-node/cbin/* linguist-documentation +single-node/scripts/* linguist-documentation +single-node/src/Explicit-Lagrange/meshes/* linguist-documentation +single-node/testing/tests-for-Explicit-Lagrange-Kokkos/* linguist-documentation + +single-node-refactor/regression_tests/standard_inputs/* linguist-documentation +single-node-refactor/regression_tests/standard_results/* linguist-documentation + +src/EVPFFT/example_input_files/* linguist-documentation +src/EVPFFT/scripts/* linguist-documentation +src/LS-EVPFFT/example_input_files/* linguist-documentation +src/LS-EVPFFT/scripts/* linguist-documentation + +src/Mesh-Builder/examples/* linguist-documentation +src/Parallel-Solvers/Implicit-Lagrange/Mesh_Examples/* linguist-documentation +src/Parallel-Solvers/Implicit-Lagrange/MueLu_XML_Examples/* linguist-documentation \ No newline at end of file From 92f0380cb8474391cdae308f0ced13ee97e5ddc2 Mon Sep 17 00:00:00 2001 From: Jacob Moore Date: Wed, 28 Aug 2024 15:03:49 -0500 Subject: [PATCH 30/33] BUG: remove bug line from .gitattributes --- .gitattributes | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/.gitattributes b/.gitattributes index 1dea52a55..aba1307ed 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,33 +1,22 @@ -special-vendored-path/* linguist-documentation - - - dev-utils/* linguist-documentation dev-utils/* linguist-documentation docs/* linguist-documentation - integrated-tests/Test-scripts/Solver-Inputs/* linguist-documentation integrated-tests/Test-scripts/standard-results/* linguist-documentation - legacy/* linguist-documentation - python/stl_files/* linguist-documentation - scripts/* linguist-documentation - single-node/cbin/* linguist-documentation single-node/scripts/* linguist-documentation single-node/src/Explicit-Lagrange/meshes/* linguist-documentation single-node/testing/tests-for-Explicit-Lagrange-Kokkos/* linguist-documentation - single-node-refactor/regression_tests/standard_inputs/* linguist-documentation single-node-refactor/regression_tests/standard_results/* linguist-documentation - src/EVPFFT/example_input_files/* linguist-documentation src/EVPFFT/scripts/* linguist-documentation src/LS-EVPFFT/example_input_files/* linguist-documentation src/LS-EVPFFT/scripts/* linguist-documentation - src/Mesh-Builder/examples/* linguist-documentation src/Parallel-Solvers/Implicit-Lagrange/Mesh_Examples/* linguist-documentation -src/Parallel-Solvers/Implicit-Lagrange/MueLu_XML_Examples/* linguist-documentation \ No newline at end of file +src/Parallel-Solvers/Implicit-Lagrange/MueLu_XML_Examples/* linguist-documentation +src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/* linguist-documentation \ No newline at end of file From 80401f3283c039706759b0c1ad87ed46e13216a9 Mon Sep 17 00:00:00 2001 From: Jacob Moore Date: Wed, 28 Aug 2024 15:23:31 -0500 Subject: [PATCH 31/33] ENH: Add extra * to make sure it grabs both files and directories for ignoring data files --- .gitattributes | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/.gitattributes b/.gitattributes index aba1307ed..f638ecafd 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,22 +1,22 @@ -dev-utils/* linguist-documentation -dev-utils/* linguist-documentation -docs/* linguist-documentation -integrated-tests/Test-scripts/Solver-Inputs/* linguist-documentation -integrated-tests/Test-scripts/standard-results/* linguist-documentation -legacy/* linguist-documentation -python/stl_files/* linguist-documentation -scripts/* linguist-documentation -single-node/cbin/* linguist-documentation -single-node/scripts/* linguist-documentation -single-node/src/Explicit-Lagrange/meshes/* linguist-documentation -single-node/testing/tests-for-Explicit-Lagrange-Kokkos/* linguist-documentation -single-node-refactor/regression_tests/standard_inputs/* linguist-documentation -single-node-refactor/regression_tests/standard_results/* linguist-documentation -src/EVPFFT/example_input_files/* linguist-documentation -src/EVPFFT/scripts/* linguist-documentation -src/LS-EVPFFT/example_input_files/* linguist-documentation -src/LS-EVPFFT/scripts/* linguist-documentation -src/Mesh-Builder/examples/* linguist-documentation -src/Parallel-Solvers/Implicit-Lagrange/Mesh_Examples/* linguist-documentation -src/Parallel-Solvers/Implicit-Lagrange/MueLu_XML_Examples/* linguist-documentation -src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/* linguist-documentation \ No newline at end of file +dev-utils/** linguist-documentation +dev-utils/** linguist-documentation +docs/** linguist-documentation +integrated-tests/Test-scripts/Solver-Inputs/** linguist-documentation +integrated-tests/Test-scripts/standard-results/** linguist-documentation +legacy/** linguist-documentation +python/stl_files/** linguist-documentation +scripts/** linguist-documentation +single-node/cbin/** linguist-documentation +single-node/scripts/** linguist-documentation +single-node/src/Explicit-Lagrange/meshes/** linguist-documentation +single-node/testing/tests-for-Explicit-Lagrange-Kokkos/** linguist-documentation +single-node-refactor/regression_tests/standard_inputs/** linguist-documentation +single-node-refactor/regression_tests/standard_results/** linguist-documentation +src/EVPFFT/example_input_files/** linguist-documentation +src/EVPFFT/scripts/** linguist-documentation +src/LS-EVPFFT/example_input_files/** linguist-documentation +src/LS-EVPFFT/scripts/** linguist-documentation +src/Mesh-Builder/examples/** linguist-documentation +src/Parallel-Solvers/Implicit-Lagrange/Mesh_Examples/** linguist-documentation +src/Parallel-Solvers/Implicit-Lagrange/MueLu_XML_Examples/** linguist-documentation +src/Parallel-Solvers/Parallel-Explicit/Example_Yaml_Scripts/** linguist-documentation \ No newline at end of file From 14ebdeba5dbe04ccd194a2bdbc66f0ba5025e506 Mon Sep 17 00:00:00 2001 From: Jacob Moore Date: Thu, 29 Aug 2024 14:15:11 -0500 Subject: [PATCH 32/33] ENH: Add timer outputs for driver --- single-node-refactor/src/main.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/single-node-refactor/src/main.cpp b/single-node-refactor/src/main.cpp index 01ce598e2..8e832b21c 100644 --- a/single-node-refactor/src/main.cpp +++ b/single-node-refactor/src/main.cpp @@ -66,11 +66,38 @@ int main(int argc, char* argv[]) // Create driver Driver* driver = new Driver(argv[1]); + + // Timing data for each step + auto time_start = std::chrono::high_resolution_clock::now(); + auto time_init = std::chrono::high_resolution_clock::now(); + driver->initialize(); + + auto time_now = std::chrono::high_resolution_clock::now(); + auto calc_time = std::chrono::duration_cast(time_now - time_init).count(); + printf("\n**** Total time to initialize driver in seconds %f ****\n\n", calc_time * 1e-9); + + auto time_setup = std::chrono::high_resolution_clock::now(); driver->setup(); + time_now = std::chrono::high_resolution_clock::now(); + calc_time = std::chrono::duration_cast(time_now - time_setup).count(); + printf("\n**** Total time to setup driver in seconds %f ****\n\n", calc_time * 1e-9); + + + auto time_run = std::chrono::high_resolution_clock::now(); driver->run(); + time_now = std::chrono::high_resolution_clock::now(); + calc_time = std::chrono::duration_cast(time_now - time_setup).count(); + printf("\n**** Total time to run driver in seconds %f ****\n\n", calc_time * 1e-9); + + driver->finalize(); + time_now = std::chrono::high_resolution_clock::now(); + calc_time = std::chrono::duration_cast(time_now - time_start).count(); + + printf("\n**** Total time to run simulation in seconds %f ****\n\n", calc_time * 1e-9); + // Delete driver delete driver; } From 2a753cd5d949c49810bd4e135ec557b21b7cb2e8 Mon Sep 17 00:00:00 2001 From: Jacob Moore Date: Tue, 3 Sep 2024 11:11:27 -0500 Subject: [PATCH 33/33] ENH: Add precision to conservation outputs --- .../src/Solvers/SGH_solver_3D/src/sgh_execute.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/single-node-refactor/src/Solvers/SGH_solver_3D/src/sgh_execute.cpp b/single-node-refactor/src/Solvers/SGH_solver_3D/src/sgh_execute.cpp index b375ee883..bf8c03828 100644 --- a/single-node-refactor/src/Solvers/SGH_solver_3D/src/sgh_execute.cpp +++ b/single-node-refactor/src/Solvers/SGH_solver_3D/src/sgh_execute.cpp @@ -401,8 +401,8 @@ void SGH3D::execute(SimulationParameters_t& SimulationParamaters, // extensive TE TE_tend = IE_tend + KE_tend; - printf("Time=0: KE = %f, IE = %f, TE = %f \n", KE_t0, IE_t0, TE_t0); - printf("Time=End: KE = %f, IE = %f, TE = %f \n", KE_tend, IE_tend, TE_tend); + printf("Time=0: KE = %.14f, IE = %.14f, TE = %.14f \n", KE_t0, IE_t0, TE_t0); + printf("Time=End: KE = %.14f, IE = %.14f, TE = %.14f \n", KE_tend, IE_tend, TE_tend); printf("total energy change = %.15e \n\n", TE_tend - TE_t0); // domain mass for each material (they are at material points)