27 using StateVecs = std::vector<std::shared_ptr<FiniteElementState> >;
32 : pv(std::move(pv_)), states(states_), dual_states(duals_)
38 void write(
size_t step,
double time,
const std::vector<const FiniteElementState*>& current_states)
41 SLIC_ERROR_ROOT_IF(current_states.size() != states.size(),
"wrong number of output states to write");
43 for (
size_t n = 0; n < states.size(); ++n) {
44 auto& state = states[n];
45 *state = *current_states[n];
46 state->gridFunction();
49 pv->SetCycle(
static_cast<int>(step));
56 void write(
size_t step,
double time,
const std::vector<const FiniteElementDual*>& current_duals)
59 SLIC_ERROR_ROOT_IF(current_duals.size() != dual_states.size(),
"wrong number of output states to write");
61 for (
size_t n = 0; n < dual_states.size(); ++n) {
62 auto&
dual = dual_states[n];
63 current_duals[n]->linearForm().ParallelAssemble(*
dual);
67 pv->SetCycle(
static_cast<int>(step));
75 void write(
int step,
double time,
const std::vector<FieldState>& current_fields)
78 SLIC_ERROR_ROOT_IF(current_fields.size() != states.size(),
"wrong number of output states to write");
80 for (
size_t n = 0; n < states.size(); ++n) {
81 auto& state = states[n];
82 *state = *current_fields[n].get();
83 state->gridFunction();
85 auto&
dual = dual_states[n];
86 current_fields[n].get_dual()->linearForm().ParallelAssemble(*
dual);
96 void write(
size_t step,
double time,
const std::vector<FieldState>& current_fields)
98 write(
static_cast<int>(step), time, current_fields);
102 std::unique_ptr<mfem::ParaViewDataCollection> pv;
110 std::string output_name)
112 if (output_name ==
"") {
113 output_name =
"default";
119 auto non_const_mesh =
const_cast<mfem::ParMesh*
>(&mesh.
mfemParMesh());
120 auto paraview_dc = std::make_unique<mfem::ParaViewDataCollection>(output_name, non_const_mesh);
122 int max_order_in_fields = 1;
125 for (
const auto& fstate : states) {
126 const auto& state = fstate.get();
127 output_states.push_back(std::make_shared<smith::FiniteElementState>(state->space(), state->name()));
128 paraview_dc->RegisterField(state->name(), &output_states.back()->gridFunction());
129 max_order_in_fields =
std::max(max_order_in_fields, state->space().GetOrder(0));
131 const auto&
dual = fstate.get_dual();
132 output_duals.push_back(std::make_shared<smith::FiniteElementState>(
dual->space(),
dual->name()));
133 paraview_dc->RegisterField(
dual->name(), &output_duals.back()->gridFunction());
134 max_order_in_fields =
std::max(max_order_in_fields,
dual->space().GetOrder(0));
138 paraview_dc->SetLevelsOfDetail(max_order_in_fields);
139 paraview_dc->SetHighOrderOutput(
true);
140 paraview_dc->SetDataFormat(mfem::VTKFormat::BINARY);
141 paraview_dc->SetCompression(
true);
143 return ParaviewWriter(std::move(paraview_dc), output_states, output_duals);
148 inline auto createParaviewWriter(
const mfem::ParMesh& mesh,
const std::vector<const FiniteElementState*>& states,
149 std::string output_name)
151 if (output_name ==
"") {
152 output_name =
"default";
156 for (
const auto& s : states) {
157 output_states.push_back(std::make_shared<smith::FiniteElementState>(s->space(), s->name()));
160 auto non_const_mesh =
const_cast<mfem::ParMesh*
>(&mesh);
161 auto paraview_dc = std::make_unique<mfem::ParaViewDataCollection>(output_name, non_const_mesh);
163 int max_order_in_fields = 1;
166 for (
const auto& state : output_states) {
167 paraview_dc->RegisterField(state->name(), &state->gridFunction());
168 max_order_in_fields =
std::max(max_order_in_fields, state->space().GetOrder(0));
172 paraview_dc->SetLevelsOfDetail(max_order_in_fields);
173 paraview_dc->SetHighOrderOutput(
true);
174 paraview_dc->SetDataFormat(mfem::VTKFormat::BINARY);
175 paraview_dc->SetCompression(
true);
Helper class for constructing a mesh consistent with Smith.
const mfem::ParMesh & mfemParMesh() const
Returns const parallel mfem mesh.
Class which interactions with ParaViewDataCollection to write arbitrary field results to disk....
void write(size_t step, double time, const std::vector< FieldState > ¤t_fields)
overload
std::vector< std::shared_ptr< FiniteElementState > > StateVecs
using
void write(size_t step, double time, const std::vector< const FiniteElementState * > ¤t_states)
write paraview output from vector of finite element states. states must be passed in with a consisten...
void write(size_t step, double time, const std::vector< const FiniteElementDual * > ¤t_duals)
write paraview output from vector of finite element duals. duals must be passed in with a consistent ...
void write(int step, double time, const std::vector< FieldState > ¤t_fields)
write paraview output from vector of FieldState. These must be passed in with a consistent order as h...
ParaviewWriter(std::unique_ptr< mfem::ParaViewDataCollection > pv_, const StateVecs &states_, const StateVecs &duals_)
Smith mesh class which assists in constructing the appropriate parallel mfem meshes and registering a...
Accelerator functionality.
auto createParaviewWriter(const smith::Mesh &mesh, const std::vector< FieldState > &states, std::string output_name)
Creates a ParaviewWriter from a mesh, vector of FieldState, and the name of the output paraview file....
SMITH_HOST_DEVICE auto max(dual< gradient_type > a, double b)
Implementation of max for dual numbers.
#define SMITH_MARK_FUNCTION
Dual number struct (value plus gradient)