void ElasticProblem<dim>::output_results(int seed, int sample_id, const std::string* target_path, int direction, int shear_direction) {
const unsigned int n_locally_owned_cells = triangulation.n_locally_owned_active_cells();
if(F.size() == 0){
std::cerr << "LINEAR_ELASTICITY :: No results to output. F is empty on rank " << get_rank() << ". " << std::endl;
return;
}
if(Epsilon.size() == 0){
std::cerr << "LINEAR_ELASTICITY :: No results to output. Epsilon is empty on rank " << get_rank() << ". " << std::endl;
return;
}
if(Stress.size() == 0){
std::cerr << "LINEAR_ELASTICITY :: No results to output. Stress is empty on rank " << get_rank() << ". " << std::endl;
return;
}
//#################################################################### Assertions ####################################################################//
AssertThrow(Stress.size() == Epsilon.size(), dealii::ExcMessage("Stress and Epsilon must be the same size!"));
AssertThrow(Stress.size() == F.size(), dealii::ExcMessage("Stress and F must be the same size!"));
AssertThrow(F.size() == Epsilon.size(), dealii::ExcMessage("F and Epsilon must be the same size!"));
std::cout << "Stress size: " << Stress.size() << " F size: " << F.size() << " Epsilon size: "<< Epsilon.size()<< " rank: " << get_rank() << std::endl;
//####################################################################################################################################################//
std::string direction_str;
if(shear_direction == 35){
direction_str = "uniaxial_";
switch (direction) {
case 0: direction_str += "xx_";
break;
case 1: direction_str += "yy_";
break;
case 2: direction_str += "zz_";
break;
default: std::cerr << "Invalid direction for uniaxial loading." << std::endl;
return;
}
} else{
direction_str = "shear_";
switch (direction) {
case 0: direction_str += "x";
break;
case 1: direction_str += "y";
break;
case 2: direction_str += "z";
break;
default: std::cerr << "Invalid direction for shear loading." << std::endl;
return;
}
switch (shear_direction) {
case 0: direction_str += "x_";
break;
case 1: direction_str += "y_";
break;
case 2: direction_str += "z_";
break;
default: std::cerr << "Invalid shear direction." << std::endl;
return;
}
}
//MPI_Barrier(mpi_communicator);
move_mesh();
//MPI_Barrier(mpi_communicator);
DataOut<dim> data_out;
data_out.attach_dof_handler(dof_handler);
// Step 1: Create a vector to hold the material IDs
dealii::Vector<float> material_ids(triangulation.n_active_cells());
//solution.update_ghost_values(); //Updating ghost values as it may cause a problem.
//dealii::Vector<float> material_ids(n_locally_owned_cells);
//############################## DEBUGGER OUTPUTS ##############################
// Step 2: Loop over all cells and store their material IDs
unsigned int cell_index = 0;
for (const auto &cell : triangulation.active_cell_iterators()) {
if (cell->is_locally_owned()){
material_ids[cell_index] = cell->material_id();
++cell_index;
}
}
// Step 3: Attach the material_id as cell data
data_out.add_data_vector(material_ids, "material_id");
std::vector<std::string> solution_names;
switch (dim){
case 1:
solution_names.emplace_back("displacement");
break;
case 2:
solution_names.emplace_back("x_displacement");
solution_names.emplace_back("y_displacement");
break;
case 3:
solution_names.emplace_back("x_displacement");
solution_names.emplace_back("y_displacement");
solution_names.emplace_back("z_displacement");
break;
default:
DEAL_II_NOT_IMPLEMENTED();
}
data_out.add_data_vector(solution, solution_names);
//##################### Adding subdomains ########################//
Vector<float> subdomain(triangulation.n_active_cells());
for (unsigned int i = 0; i < subdomain.size(); ++i)
subdomain(i) = triangulation.locally_owned_subdomain();
data_out.add_data_vector(subdomain, "subdomain");
//######################## Kinematics ##########################//
//***************** Gradient of Displacement *******************//
dealii::Vector<double> F_11(triangulation.n_active_cells());
dealii::Vector<double> F_12(triangulation.n_active_cells());
dealii::Vector<double> F_13(triangulation.n_active_cells());
dealii::Vector<double> F_21(triangulation.n_active_cells());
dealii::Vector<double> F_22(triangulation.n_active_cells());
dealii::Vector<double> F_23(triangulation.n_active_cells());
dealii::Vector<double> F_31(triangulation.n_active_cells());
dealii::Vector<double> F_32(triangulation.n_active_cells());
dealii::Vector<double> F_33(triangulation.n_active_cells());
//************************** Strain ****************************//
dealii::Vector<double> e_11(triangulation.n_active_cells());
dealii::Vector<double> e_12(triangulation.n_active_cells());
dealii::Vector<double> e_13(triangulation.n_active_cells());
dealii::Vector<double> e_21(triangulation.n_active_cells());
dealii::Vector<double> e_22(triangulation.n_active_cells());
dealii::Vector<double> e_23(triangulation.n_active_cells());
dealii::Vector<double> e_31(triangulation.n_active_cells());
dealii::Vector<double> e_32(triangulation.n_active_cells());
dealii::Vector<double> e_33(triangulation.n_active_cells());
//************************** Stress ****************************//
dealii::Vector<double> s_11(triangulation.n_active_cells());
dealii::Vector<double> s_12(triangulation.n_active_cells());
dealii::Vector<double> s_13(triangulation.n_active_cells());
dealii::Vector<double> s_21(triangulation.n_active_cells());
dealii::Vector<double> s_22(triangulation.n_active_cells());
dealii::Vector<double> s_23(triangulation.n_active_cells());
dealii::Vector<double> s_31(triangulation.n_active_cells());
dealii::Vector<double> s_32(triangulation.n_active_cells());
dealii::Vector<double> s_33(triangulation.n_active_cells());
unsigned int local_index = 0;
for (const auto &cell : triangulation.active_cell_iterators()){
if (cell->is_locally_owned() || cell->is_ghost()) {
/*############################################## DEBUGGING ##########################################################*/
std::cout << "Checking size of s_11: " << s_11.size() << " I am rank "<< get_rank() << std::endl;
std::cout << "Checking local_index: " << local_index << " I am rank "<< get_rank() << std::endl;
std::cout << "Checking if there is a problem with the Stress vector: \n";
/*for (unsigned int i = 0; i < 3; ++i){
for (unsigned int j = 0; j < 3; ++j){
std::cout << Stress[local_index][i][j] << " ";
}
std::cout << std::endl;
}*/
/*#################################################################################################################*/
//******************** Gradient of Displacement (F) **********************//
F_11[cell->active_cell_index()] = F[cell->active_cell_index()][0][0];
F_12[cell->active_cell_index()] = F[cell->active_cell_index()][0][1];
F_13[cell->active_cell_index()] = F[cell->active_cell_index()][0][2];
F_21[cell->active_cell_index()] = F[cell->active_cell_index()][1][0];
F_22[cell->active_cell_index()] = F[cell->active_cell_index()][1][1];
F_23[cell->active_cell_index()] = F[cell->active_cell_index()][1][2];
F_31[cell->active_cell_index()] = F[cell->active_cell_index()][2][0];
F_32[cell->active_cell_index()] = F[cell->active_cell_index()][2][1];
F_33[cell->active_cell_index()] = F[cell->active_cell_index()][2][2];
//************************** Strain (epsilon) ****************************//
e_11[cell->active_cell_index()] = Epsilon[cell->active_cell_index()][0][0];
e_12[cell->active_cell_index()] = Epsilon[cell->active_cell_index()][0][1];
e_13[cell->active_cell_index()] = Epsilon[cell->active_cell_index()][0][2];
e_21[cell->active_cell_index()] = Epsilon[cell->active_cell_index()][1][0];
e_22[cell->active_cell_index()] = Epsilon[cell->active_cell_index()][1][1];
e_23[cell->active_cell_index()] = Epsilon[cell->active_cell_index()][1][2];
e_31[cell->active_cell_index()] = Epsilon[cell->active_cell_index()][2][0];
e_32[cell->active_cell_index()] = Epsilon[cell->active_cell_index()][2][1];
e_33[cell->active_cell_index()] = Epsilon[cell->active_cell_index()][2][2];
//*************************** Stress (sigma) *****************************//
s_11[cell->active_cell_index()] = Stress[cell->active_cell_index()][0][0];
s_12[cell->active_cell_index()] = Stress[cell->active_cell_index()][0][1];
s_13[cell->active_cell_index()] = Stress[cell->active_cell_index()][0][2];
s_21[cell->active_cell_index()] = Stress[cell->active_cell_index()][1][0];
s_22[cell->active_cell_index()] = Stress[cell->active_cell_index()][1][1];
s_23[cell->active_cell_index()] = Stress[cell->active_cell_index()][1][2];
s_31[cell->active_cell_index()] = Stress[cell->active_cell_index()][2][0];
s_32[cell->active_cell_index()] = Stress[cell->active_cell_index()][2][1];
s_33[cell->active_cell_index()] = Stress[cell->active_cell_index()][2][2];
}
}
//std::cout << " LINEAR ELASTICITY MODULE :: Completed for and if loop at line 257. I am rank "<< get_rank() << std::endl; //DEBUGGING
//***** Gradient of Displacement (F) *****//
data_out.add_data_vector(F_11, "F11", dealii::DataOut<dim>::type_cell_data);
//std::cout << " LINEAR ELASTICITY MODULE :: Adding vector F11 to data out on line 261. I am rank "<< get_rank() << std::endl; //DEBUGGING
data_out.add_data_vector(F_12, "F12", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(F_13, "F13", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(F_21, "F21", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(F_22, "F22", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(F_23, "F23", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(F_31, "F31", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(F_32, "F32", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(F_33, "F33", dealii::DataOut<dim>::type_cell_data);
//***** Strain (epsilon) *****//
data_out.add_data_vector(e_11, "e11", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(e_12, "e12", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(e_13, "e13", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(e_21, "e21", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(e_22, "e22", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(e_23, "e23", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(e_31, "e31", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(e_32, "e32", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(e_33, "e33", dealii::DataOut<dim>::type_cell_data);
//***** Stress (sigma) *****//
data_out.add_data_vector(s_11, "stress_11", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(s_12, "stress_12", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(s_13, "stress_13", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(s_21, "stress_21", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(s_22, "stress_22", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(s_23, "stress_23", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(s_31, "stress_31", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(s_32, "stress_32", dealii::DataOut<dim>::type_cell_data);
data_out.add_data_vector(s_33, "stress_33", dealii::DataOut<dim>::type_cell_data);
//std::cout << " LINEAR ELASTICITY MODULE :: Building patches at line 286. I am rank "<< get_rank() << std::endl; //DEBUGGING
solution.update_ghost_values(); //Updating ghost values as it may cause a problem.
data_out.build_patches();
//std::cout << " LINEAR ELASTICITY MODULE :: Completed build patches at line 289. I am rank "<< get_rank() << std::endl; //DEBUGGING
//std::string filename = *target_path + "/data/ensemble_"+std::to_string(seed)+"/linear_elasticity/solution_"+std::to_string(sample_id)+".vtk";
//ABOVE WAS USED FOR A NON PARALLEL CASE REFER BELOW FOR PARALLEL CASE.
//std::string filename = *target_path + "/data/ensemble_"+std::to_string(seed)+"/linear_elasticity/Sample_"+std::to_string(sample_id)+direction_str;
std::string filename = *target_path + "/data/ensemble_"+std::to_string(seed)+"/linear_elasticity/"; //THIS IS FOR DEBUGGING
std::string output_name = "Sample_"+std::to_string(sample_id)+"_solution_"+direction_str;
data_out.write_vtu_with_pvtu_record(filename, output_name, 0, mpi_communicator, 2 , 0); //FOR PARALLEL CASE.
//std::ofstream output(filename);
//data_out.write_vtk(output);
//MPI_Barrier(mpi_communicator);
//pcout << " LINEAR ELASTICITY MODULE :: write results line 304. I am rank "<< get_rank() << std::endl;
unmove_mesh();
//MPI_Barrier(mpi_communicator);
if (Utilities::MPI::this_mpi_process(mpi_communicator) == 0) {
save_stress_strain(seed, sample_id, target_path);
}
}