#include <deal.II/base/mpi.h>
#include <deal.II/base/utilities.h>
#include <deal.II/distributed/tria.h>
#include <deal.II/grid/tria_accessor.h>
#include <deal.II/grid/grid_generator.h>
#include <deal.II/lac/generic_linear_algebra.h>
#include <deal.II/fe/fe_dgq.h>
#include <deal.II/fe/mapping_q_generic.h>
#include <deal.II/dofs/dof_handler.h>
#include <deal.II/numerics/data_out.h>
#include <fstream>
using namespace dealii;
namespace LA
{
using namespace ::LinearAlgebraPETSc;
}
int main(int argc, char **argv)
{
Utilities::MPI::MPI_InitFinalize mpi_initialization(argc, argv, 1);
constexpr int dim = 3;
MPI_Comm mpi_comm(MPI_COMM_WORLD);
parallel::distributed::Triangulation<dim> triang(mpi_comm);
GridGenerator::subdivided_hyper_cube(triang, 5);
const std::shared_ptr<const Utilities::MPI::Partitioner> cell_partitioner =
triang.global_active_cell_index_partitioner().lock();
LA::MPI::Vector vec(cell_partitioner->locally_owned_range(), mpi_comm);
LA::MPI::Vector gh_vec(
cell_partitioner->locally_owned_range(),
cell_partitioner->ghost_indices(),
mpi_comm
);
DoFHandler<dim> dof_handler(triang);
FE_DGQ<dim> fe(2);
dof_handler.distribute_dofs(fe);
for(auto &cell: dof_handler.active_cell_iterators()){
if(!cell->is_locally_owned()) continue;
vec[cell->global_active_cell_index()] = cell->global_active_cell_index();
}
vec.compress(VectorOperation::insert);
gh_vec = vec;
DataOut<dim> data_out;
DataOutBase::VtkFlags flags;
flags.write_higher_order_cells = true;
data_out.set_flags(flags);
data_out.attach_dof_handler(dof_handler);
data_out.add_data_vector(gh_vec, "x");
data_out.build_patches(
MappingQGeneric<dim>(2),
2,
DataOut<dim>::CurvedCellRegion::curved_inner_cells
);
std::ofstream proc_file(
"output" + Utilities::int_to_string(
Utilities::MPI::this_mpi_process(mpi_comm),
2
) + ".vtu"
);
data_out.write_vtu(proc_file);
proc_file.close();
if(Utilities::MPI::this_mpi_process(mpi_comm) == 0){
std::vector<std::string> filenames;
for(int i=0; i<Utilities::MPI::n_mpi_processes(mpi_comm); i++){
filenames.emplace_back(
"output" + Utilities::int_to_string(i, 2) + ".vtu"
);
} // loop over processes
std::ofstream master_file("output.pvtu");
data_out.write_pvtu_record(master_file, filenames);
master_file.close();
}
return 0;
}