diff --git a/.gitignore b/.gitignore index b5b60fc..d6d128c 100644 --- a/.gitignore +++ b/.gitignore @@ -130,7 +130,6 @@ input/parameter_files/* !input/parameter_files/simple_shear_Lara* input/crystal_orientation/* -!input/crystal_orientation/2d/ -input/crystal_orientation/2d/* -!input/crystal_orientation/2d/euler_angles_02C_30_0.txt + +python/input/* diff --git a/applications/CMakeLists.txt b/applications/CMakeLists.txt index 1158c28..28bcb5b 100644 --- a/applications/CMakeLists.txt +++ b/applications/CMakeLists.txt @@ -1,6 +1,5 @@ SET(SOURCE_FILES simple_shear.cc - jacobian.cc ) FOREACH(sourcefile ${SOURCE_FILES}) @@ -9,4 +8,5 @@ FOREACH(sourcefile ${SOURCE_FILES}) ADD_EXECUTABLE(${executablename} ${sourcefile}) DEAL_II_SETUP_TARGET(${executablename}) TARGET_LINK_LIBRARIES(${executablename} gCP stdc++fs) + TARGET_COMPILE_OPTIONS(${executablename} PRIVATE -g) ENDFOREACH(sourcefile ${APP_SOURCES}) \ No newline at end of file diff --git a/applications/jacobian.cc b/applications/jacobian.cc deleted file mode 100644 index 60924fd..0000000 --- a/applications/jacobian.cc +++ /dev/null @@ -1,470 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - -#include -#include - -#include -#include -#include - - - -#ifndef __has_include - static_assert(false, "__has_include not supported"); -#else -# if __cplusplus >= 201703L && __has_include() -# include - namespace fs = std::filesystem; -# elif __has_include() -# include - namespace fs = std::experimental::filesystem; -# elif __has_include() -# include - namespace fs = boost::filesystem; -# endif -#endif - - - -namespace gCP -{ - - - -template -class SlipFields : public dealii::Function -{ -public: - SlipFields(const unsigned int n_components) - : - dealii::Function(n_components) - { - //std::cout << n_components << std::endl; - } - - virtual void vector_value( - const dealii::Point &point, - dealii::Vector &return_vector) const override - { - return_vector = 0.0; - - const std::vector nodal_values = - {0.12, 1.68, 0.86, 1.64}; - - const double xi = point[0], eta = point[1]; - - const double slip_value = - nodal_values[0] * (xi - 1.) * (eta - 1.) + - nodal_values[1] * (xi - xi * eta) + - nodal_values[2] * (eta - xi * eta) + - nodal_values[3] * (xi * eta); - - for (unsigned int i = dim; i < this->n_components; ++i) - { - return_vector(i) = slip_value; - } - } -}; - - - -template -class OldSlipFields : public dealii::Function -{ -public: - OldSlipFields(const unsigned int n_components) - : - dealii::Function(n_components) - {} - - virtual void vector_value( - const dealii::Point &point, - dealii::Vector &return_vector) const override - { - return_vector = 0.0; - - const std::vector nodal_values = - //{0.12, 1.68, 0.86, 1.64}; - {0.77, 1.00, 1.04, 0.41}; - - const double xi = point[0], eta = point[1]; - - const double slip_value = - nodal_values[0] * (xi - 1.) * (eta - 1.) + - nodal_values[1] * (xi - xi * eta) + - nodal_values[2] * (eta - xi * eta) + - nodal_values[3] * (xi * eta); - - for (unsigned int i = dim; i < this->n_components; ++i) - { - return_vector(i) = slip_value; - } - } -}; - - - -template -class SimpleShearProblem -{ -public: - SimpleShearProblem( - const RunTimeParameters::InfiniteStripProblem ¶meters); - - void run(); - -private: - const RunTimeParameters::InfiniteStripProblem parameters; - - std::shared_ptr pcout; - - std::shared_ptr timer_output; - - std::shared_ptr> mapping; - - dealii::DiscreteTime discrete_time; - - dealii::parallel::distributed::Triangulation triangulation; - - std::shared_ptr> fe_field; - - std::shared_ptr> crystals_data; - - GradientCrystalPlasticitySolver gCP_solver; - - const double string_width; - - void make_grid(); - - void setup(); - - void initialize_calls(); - - void solve(); -}; - - - -template -SimpleShearProblem::SimpleShearProblem( - const RunTimeParameters::InfiniteStripProblem ¶meters) -: -parameters(parameters), -pcout(std::make_shared( - std::cout, - dealii::Utilities::MPI::this_mpi_process(MPI_COMM_WORLD) == 0)), -timer_output(std::make_shared( - MPI_COMM_WORLD, - *pcout, - dealii::TimerOutput::summary, - dealii::TimerOutput::wall_times)), -mapping(std::make_shared>( - parameters.spatial_discretization.mapping_degree)), -discrete_time( - parameters.simple_loading.start_time, - parameters.simple_loading.end_time, - parameters.simple_loading.time_step_size), -triangulation( - MPI_COMM_WORLD, - typename dealii::Triangulation::MeshSmoothing( - dealii::Triangulation::smoothing_on_refinement | - dealii::Triangulation::smoothing_on_coarsening)), -fe_field(std::make_shared>( - triangulation, - parameters.spatial_discretization.fe_degree_displacements, - parameters.spatial_discretization.fe_degree_slips, - parameters.solver_parameters.allow_decohesion, - parameters.solver_parameters.solution_algorithm == - RunTimeParameters::SolutionAlgorithm::Monolithic && - (parameters.solver_parameters.monolithic_algorithm_parameters. - monolithic_system_solver_parameters. - krylov_parameters.solver_type == - RunTimeParameters::SolverType::DirectSolver || - parameters.solver_parameters.monolithic_algorithm_parameters. - monolithic_preconditioner == - RunTimeParameters::MonolithicPreconditioner::BuiltIn))), -crystals_data(std::make_shared>()), -gCP_solver( - parameters.solver_parameters, - discrete_time, - fe_field, - crystals_data, - mapping, - pcout, - timer_output), -string_width( - (std::to_string((unsigned int)( - (parameters.simple_loading.end_time - - parameters.simple_loading.start_time) / - parameters.simple_loading.time_step_size)) + - "Step ").size()) -{} - - - -template -void SimpleShearProblem::make_grid() -{ - dealii::TimerOutput::Scope t(*timer_output, "Problem: Triangulation"); - - dealii::GridGenerator::hyper_rectangle( - triangulation, - dealii::Point(0.,0.), - dealii::Point(1.,1.), - true); - - *pcout << "Triangulation:" - << std::endl - << " Number of active cells = " - << triangulation.n_global_active_cells() - << std::endl << std::endl; -} - - -template -void SimpleShearProblem::setup() -{ - dealii::TimerOutput::Scope t(*timer_output, "Problem: Setup"); - - // Initiates the crystals' data (Slip directions, normals, orthogonals, - // Schmid-Tensor and symmetrized Schmid-Tensors) - crystals_data->init(triangulation, - parameters.input.euler_angles_pathname, - parameters.input.slips_directions_pathname, - parameters.input.slips_normals_pathname); - - // Sets up the FEValuesExtractor instances - fe_field->setup_extractors(crystals_data->get_n_crystals(), - crystals_data->get_n_slips()); - - // Update the material ids of ghost cells - fe_field->update_ghost_material_ids(); - - // Set the active finite elemente index of each cell - for (const auto &cell : - fe_field->get_dof_handler().active_cell_iterators()) - { - if (cell->is_locally_owned()) - { - cell->set_active_fe_index(cell->material_id()); - } - } - - // Sets up the degrees of freedom - fe_field->setup_dofs(); - - // Sets up the solution vectors - fe_field->setup_vectors(); - - // Terminal output - *pcout - << "Crystals data:" << std::endl - << " Number of crystals = " << crystals_data->get_n_crystals() << std::endl - << " Number of slips = " << crystals_data->get_n_slips() << std::endl - << std::endl; - - *pcout - << "Spatial discretization:" << std::endl - << " Number of total degrees of freedom = " - << fe_field->n_dofs() << std::endl - << " Number of displacement degrees of freedom = " - << fe_field->get_n_displacement_dofs() << std::endl - << " Number of plastic slips degrees of freedom = " - << fe_field->get_n_plastic_slip_dofs() << std::endl << std::endl; -} - - - -template -void SimpleShearProblem::initialize_calls() -{ - // Initiate the solver - gCP_solver.init(); -} - - - -template -void SimpleShearProblem::run() -{ - // Generate/Read triangulation (Material ids have to be set here) - make_grid(); - - // Setup CrystalsData, FEField, boundary conditions, - // and assigns the FECollection id of each cell according to the - // material id - setup(); - - dealii::AffineConstraints affine_constraints; - affine_constraints.clear(); - { - affine_constraints.reinit(fe_field->get_locally_relevant_dofs()); - affine_constraints.merge(fe_field->get_hanging_node_constraints()); - } - affine_constraints.close(); - - fe_field->set_affine_constraints(affine_constraints); - fe_field->set_newton_method_constraints(affine_constraints); - - // Call the init() methods of the class' members - initialize_calls(); - - dealii::LinearAlgebraTrilinos::MPI::BlockVector - distributed_vector = - fe_field->get_distributed_vector_instance( - fe_field->solution); - - dealii::VectorTools::interpolate( - fe_field->get_dof_handler(), - SlipFields(fe_field->get_n_components()), - distributed_vector, - fe_field->get_fe_collection().component_mask( - fe_field->get_slip_extractor(0, 0))); - - dealii::VectorTools::interpolate( - fe_field->get_dof_handler(), - SlipFields(fe_field->get_n_components()), - distributed_vector, - fe_field->get_fe_collection().component_mask( - fe_field->get_slip_extractor(0, 1))); - - fe_field->get_affine_constraints().distribute(distributed_vector); - - fe_field->solution = distributed_vector; - - distributed_vector = 0.0; - - dealii::VectorTools::interpolate( - fe_field->get_dof_handler(), - OldSlipFields(fe_field->get_n_components()), - distributed_vector, - fe_field->get_fe_collection().component_mask( - fe_field->get_slip_extractor(0, 0))); - - dealii::VectorTools::interpolate( - fe_field->get_dof_handler(), - OldSlipFields(fe_field->get_n_components()), - distributed_vector, - fe_field->get_fe_collection().component_mask( - fe_field->get_slip_extractor(0, 1))); - - fe_field->get_affine_constraints().distribute(distributed_vector); - - fe_field->old_solution = distributed_vector; - - gCP_solver.compute_difference_quotients_jacobian_approximation(); -} - - - -} // namespace gCP - - -int main(int argc, char *argv[]) -{ - try - { - dealii::Utilities::MPI::MPI_InitFinalize mpi_initialization( - argc, argv, dealii::numbers::invalid_unsigned_int); - - std::string parameters_filepath; - - // The following switch mainly checks if the filepath includes the - // .prm extension. The existance of the filepath is checked by the - // constructor of the problem's parameter struct. - switch (argc) - { - case 1: - { - parameters_filepath = "input/parameter_files/jacobian_parameters.prm"; - } - break; - - case 2: - { - const std::string arg(argv[1]); - - if (arg.find_last_of(".") != std::string::npos) - { - if (arg.substr(arg.find_last_of(".")+1) == "prm") - parameters_filepath = arg; - else - AssertThrow(false, - dealii::ExcMessage( - "The filepath to the parameters file has to " - "be passed with its .prm extension.")); - } - else - AssertThrow(false, - dealii::ExcMessage( - "The filepath to the parameters file has to be " - "passed with its .prm extension.")); - } - break; - - default: - { - AssertThrow(false, - dealii::ExcMessage( - "More than one argument are being passed to the " - "executable. Only one argument (the filepath to " - "the parameters file) is currently supported.")); - } - break; - } - - { // Terminal output of the parameter file's filepath - int rank; - - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - - if (rank == 0) - { - std::cout << "Running with \"" - << parameters_filepath << "\"" << "\n"; - } - } - - gCP::RunTimeParameters::InfiniteStripProblem parameters(parameters_filepath); - - gCP::SimpleShearProblem<2> problem(parameters); - - problem.run(); - } - catch (std::exception &exc) - { - std::cerr << std::endl - << std::endl - << "----------------------------------------------------" - << std::endl; - std::cerr << "Exception on processing: " << std::endl - << exc.what() << std::endl - << "Aborting!" << std::endl - << "----------------------------------------------------" - << std::endl; - return 1; - } - catch (...) - { - std::cerr << std::endl - << std::endl - << "----------------------------------------------------" - << std::endl; - std::cerr << "Unknown exception!" << std::endl - << "Aborting!" << std::endl - << "----------------------------------------------------" - << std::endl; - return 1; - } - return 0; -} \ No newline at end of file diff --git a/applications/simple_shear.cc b/applications/simple_shear.cc index f3220e7..7a09818 100644 --- a/applications/simple_shear.cc +++ b/applications/simple_shear.cc @@ -229,11 +229,13 @@ void SimpleShearProblem::make_grid() break; case 3: { + repetitions.push_back(1.0); + dealii::GridGenerator::subdivided_hyper_rectangle( triangulation, repetitions, dealii::Point(0,0,0), - dealii::Point(1./parameters.n_elements_in_y_direction, 1./parameters.n_elements_in_y_direction), + dealii::Point(1./parameters.n_elements_in_y_direction, parameters.height, 1./parameters.n_elements_in_y_direction), true); } break; @@ -251,7 +253,14 @@ void SimpleShearProblem::make_grid() 1, 0, periodicity_vector); - + if (dim == 3) + { + dealii::GridTools::collect_periodic_faces(triangulation, + 4, + 5, + 2, + periodicity_vector); + } this->triangulation.add_periodicity(periodicity_vector); triangulation.refine_global( @@ -372,6 +381,16 @@ void SimpleShearProblem::setup_constraints() 0, periodicity_vector); + if (dim == 3) + { + dealii::GridTools::collect_periodic_faces( + fe_field->get_dof_handler(), + 4, + 5, + 2, + periodicity_vector); + } + // Initiate the actual constraints – boundary conditions – of the problem dealii::AffineConstraints affine_constraints; @@ -970,9 +989,28 @@ int main(int argc, char *argv[]) gCP::RunTimeParameters::InfiniteStripProblem parameters(parameters_filepath); - gCP::SimpleShearProblem<2> problem(parameters); + switch (parameters.spatial_discretization.dim) + { + case 2: + { + gCP::SimpleShearProblem<2> problem(parameters); + + problem.run(); + } + break; + + case 3: + { + gCP::SimpleShearProblem<3> problem(parameters); + + problem.run(); + } + break; - problem.run(); + default: + AssertThrow(false, dealii::ExcNotImplemented()); + break; + }; } catch (std::exception &exc) { diff --git a/include/gCP/run_time_parameters.h b/include/gCP/run_time_parameters.h index a30d7fc..da3fac4 100644 --- a/include/gCP/run_time_parameters.h +++ b/include/gCP/run_time_parameters.h @@ -1437,8 +1437,6 @@ struct Output bool flag_output_fluctuations; bool flag_output_dimensionless_quantities; - - bool flag_store_checkpoint; }; diff --git a/input/crystal_orientation/2d/euler_angles_02C_30_0.txt b/input/crystal_orientation/2d/euler_angles_02C_30_0.txt deleted file mode 100755 index 4eb9e7b..0000000 --- a/input/crystal_orientation/2d/euler_angles_02C_30_0.txt +++ /dev/null @@ -1,2 +0,0 @@ -30 -0 \ No newline at end of file diff --git a/input/crystal_structure/face_centered_cubic/slip_directions_6GS.txt b/input/crystal_structure/face_centered_cubic/slip_directions_6GS.txt deleted file mode 100755 index 9b9d6a6..0000000 --- a/input/crystal_structure/face_centered_cubic/slip_directions_6GS.txt +++ /dev/null @@ -1,6 +0,0 @@ -0.0,1.0,-1.0 --1.0,0.0,1.0 -1.0,-1.0,0.0 -0.0,1.0,-1.0 -1.0,0.0,1.0 --1.0,-1.0,0.0 diff --git a/input/crystal_structure/face_centered_cubic/slip_normals_6GS.txt b/input/crystal_structure/face_centered_cubic/slip_normals_6GS.txt deleted file mode 100755 index c41d24e..0000000 --- a/input/crystal_structure/face_centered_cubic/slip_normals_6GS.txt +++ /dev/null @@ -1,6 +0,0 @@ -1.0,1.0,1.0 -1.0,1.0,1.0 -1.0,1.0,1.0 --1.0,1.0,1.0 --1.0,1.0,1.0 --1.0,1.0,1.0 diff --git a/input/crystal_structure/symmetric_double_slip_system/60_degrees/slip_directions_3D.txt b/input/crystal_structure/symmetric_double_slip_system/60_degrees/slip_directions_3D.txt deleted file mode 100755 index ac020d7..0000000 --- a/input/crystal_structure/symmetric_double_slip_system/60_degrees/slip_directions_3D.txt +++ /dev/null @@ -1,2 +0,0 @@ -0.5000000000000000,0.8660254037844386,0. -0.5000000000000000,-0.8660254037844386,0. \ No newline at end of file diff --git a/input/crystal_structure/symmetric_double_slip_system/60_degrees/slip_normals_3D.txt b/input/crystal_structure/symmetric_double_slip_system/60_degrees/slip_normals_3D.txt deleted file mode 100755 index 24877b7..0000000 --- a/input/crystal_structure/symmetric_double_slip_system/60_degrees/slip_normals_3D.txt +++ /dev/null @@ -1,2 +0,0 @@ --0.8660254037844386,0.5000000000000000,0. -0.8660254037844386,0.5000000000000000,0. \ No newline at end of file diff --git a/input/parameter_files/simple_shear.prm b/input/parameter_files/simple_shear.prm index 068b5a0..1d23822 100644 --- a/input/parameter_files/simple_shear.prm +++ b/input/parameter_files/simple_shear.prm @@ -61,19 +61,19 @@ end subsection 3. Input parameters - set Euler angles path name = input/crystal_orientation/2d/euler_angles_0 + set Euler angles path name = input/crystal_orientation/euler_angles_0 set Slip directions path name = input/crystal_structure/symmetric_double_slip_system/60_degrees/slip_directions set Slip normals path name = input/crystal_structure/symmetric_double_slip_system/60_degrees/slip_normals end subsection 4. Output parameters - set Graphical output directory = results/default/ - set Graphical output frequency = 1 - set Output damage variable field = false - set Output fluctuations fields = false - set Store checkpoints = false - set Terminal output frequency = 1 + set Graphical output directory = results/default/ + set Graphical output frequency = 1 + set Output damage variable field = false + set Output dimensionless quantities = false + set Output fluctuations fields = false + set Terminal output frequency = 1 end @@ -88,16 +88,17 @@ end subsection 6. Solver parameters set Allow decohesion at grain boundaries = false - set Boundary conditions at grain boundaries = microtraction + set Boundary conditions at grain boundaries = microfree set Print sparsity pattern = false set Skip extrapolation of start value at extrema = false + set Extrapolation factor = 0.00 set Solution algorithm = monolithic set Output debug fields = false set Verbose = false set Zero damage evolution during un- and loading = false subsection Dimensionless formulation parameters - set Solve the dimensionless problem = false + set Solve the dimensionless problem = true subsection Reference parameters set Reference displacement value = 0.01 @@ -136,7 +137,7 @@ subsection 6. Solver parameters end subsection Hardening law's parameters - set Hardening parameter = 1.4 + set Hardening parameter = 1.0 set Initial slip resistance = 60 set Linear hardening modulus = 100 set Perfect plasticity = false @@ -155,12 +156,12 @@ subsection 6. Solver parameters subsection Scalar microstress law's parameters set Rate-independent behavior = false set Regularization function = erf - set Regularization parameter = 1e-11 + set Regularization parameter = 1.0 end subsection Vectorial microstress law's parameters set Defect energy index = 2.0 - set Energetic length scale = 0.2 + set Energetic length scale = 1e-1 set Initial slip resistance = 60 set Regularization parameter = 1e-16 end @@ -172,28 +173,84 @@ subsection 6. Solver parameters subsection Krylov parameters - set Absolute tolerance = 1e-9 - set Maximum number of iterations = 3000 - set Relative tolerance = 1e-8 - set Solver type = cg + set Absolute tolerance = 1e-9 + set Maximum number of iterations = 1000 + set Relative tolerance = 1e-8 + set Solver type = directsolver end subsection Line search parameters set Alpha condition constant = 1e-4 set Beta condition constant = 0.9 - set Maximum number of iterations = 100 + set Maximum number of iterations = 5 end subsection Newton-Raphson parameters set Absolute tolerance of the residual = 1e-8 - set Absolute tolerance of the step = 1e-15 + set Absolute tolerance of the step = 1e-8 set Line search algorithm = false - set Maximum number of iterations = 100 + set Maximum number of iterations = 20 set Relative tolerance of the residual = 1e-7 end end + subsection Staggered algorithm + set Maximum number of solution loops = 100 + set Reset trial solution at each micro loop = true + + + subsection Linear momentum balance + subsection Krylov parameters + set Absolute tolerance = 1e-9 + set Maximum number of iterations = 1000 + set Relative tolerance = 1e-8 + set Solver type = directsolver + end + + subsection Line search parameters + set Alpha condition constant = 1e-4 + set Beta condition constant = 0.9 + set Maximum number of iterations = 5 + end + + subsection Newton-Raphson parameters + set Absolute tolerance of the residual = 1e-8 + set Absolute tolerance of the step = 1e-8 + set Line search algorithm = false + set Maximum number of iterations = 500 + set Relative tolerance of the residual = 1e-7 + end + + end + + subsection Pseudo-balance + subsection Krylov parameters + set Absolute tolerance = 1e-9 + set Maximum number of iterations = 1000 + set Relative tolerance = 1e-8 + set Solver type = directsolver + end + + subsection Line search parameters + set Alpha condition constant = 1e-4 + set Beta condition constant = 0.9 + set Maximum number of iterations = 5 + end + + subsection Newton-Raphson parameters + set Absolute tolerance of the residual = 1e-8 + set Absolute tolerance of the step = 1e-8 + set Line search algorithm = false + set Maximum number of iterations = 15 + set Relative tolerance of the residual = 1e-7 + end + + end + + end + end + diff --git a/source/crystal_data.cc b/source/crystal_data.cc index 5cf8521..9a382eb 100644 --- a/source/crystal_data.cc +++ b/source/crystal_data.cc @@ -128,7 +128,6 @@ void CrystalsData::read_and_store_data( "Nonetheless, more than one angle is being read from " "the specified file."))); } - else { AssertThrow( diff --git a/source/run_time_parameters.cc b/source/run_time_parameters.cc index bf36376..1f401e5 100644 --- a/source/run_time_parameters.cc +++ b/source/run_time_parameters.cc @@ -1808,8 +1808,7 @@ terminal_output_frequency(1), homogenization_output_frequency(1), flag_output_damage_variable(false), flag_output_fluctuations(false), -flag_output_dimensionless_quantities(false), -flag_store_checkpoint(false) +flag_output_dimensionless_quantities(false) {} @@ -1915,44 +1914,6 @@ void Output::parse_parameters( flag_output_dimensionless_quantities = prm.get_bool("Output dimensionless quantities"); - - flag_store_checkpoint = - prm.get_bool("Store checkpoints"); - - if ((dealii::Utilities::MPI::this_mpi_process(MPI_COMM_WORLD) == 0) && - !fs::exists(output_directory + "checkpoints/") && - flag_store_checkpoint) - { - try - { - fs::create_directories(output_directory + "checkpoints/"); - } - catch (std::exception &exc) - { - std::cerr << std::endl << std::endl - << "----------------------------------------------------" - << std::endl; - std::cerr << "Exception in the creation of the output directory: " - << std::endl - << exc.what() << std::endl - << "Aborting!" << std::endl - << "----------------------------------------------------" - << std::endl; - std::abort(); - } - catch (...) - { - std::cerr << std::endl << std::endl - << "----------------------------------------------------" - << std::endl; - std::cerr << "Unknown exception in the creation of the output directory!" - << std::endl - << "Aborting!" << std::endl - << "----------------------------------------------------" - << std::endl; - std::abort(); - } - } } prm.leave_subsection(); } @@ -2090,6 +2051,16 @@ void BasicProblem::parse_parameters(dealii::ParameterHandler &prm) prm.leave_subsection(); verbose = prm.get_bool("Verbose"); + + if (spatial_discretization.dim == 3 && + fs::exists(input.slips_normals_pathname + "_3d.txt") && + fs::exists(input.slips_directions_pathname + "_3d.txt") && + fs::exists(input.euler_angles_pathname + "_3d.txt")) + { + input.slips_normals_pathname += "_3d"; + input.slips_directions_pathname += "_3d"; + input.euler_angles_pathname += "_3d"; + } }