12 #include "libmesh/parallel.h"
13 #include "libmesh/parallel_algebra.h"
23 params += validParams<TransientInterface>();
25 params.addClassDescription(
26 "Base class for slope limiting to limit the slopes of cell average variables.");
28 params.addParam<
bool>(
"include_bc",
true,
"Indicate whether to include bc, default = true");
36 declareRestartableData<std::map<dof_id_type, std::vector<
RealGradient>>>(
"limited_slope")),
37 _include_bc(getParam<bool>(
"include_bc")),
38 _q_point_face(_assembly.qPointsFace()),
39 _qrule_face(_assembly.qRuleFace()),
40 _JxW_face(_assembly.JxWFace()),
41 _normals_face(_assembly.normals()),
42 _side(_assembly.side()),
43 _side_elem(_assembly.sideElem()),
44 _side_volume(_assembly.sideElemVolume()),
45 _neighbor_elem(_assembly.neighbor())
57 const std::vector<RealGradient> &
60 Threads::spin_mutex::scoped_lock lock(
_mutex);
61 std::map<dof_id_type, std::vector<RealGradient>>::const_iterator pos =
_lslope.find(elementid);
64 mooseError(
"Limited slope is not cached for element id '", elementid,
"' in ", __FUNCTION__);
80 std::ostringstream oss;
84 oss.write((
char *)&size,
sizeof(size));
88 storeHelper(oss, *it,
this);
89 storeHelper(oss,
_lslope[*it],
this);
93 serialized_buffer.assign(oss.str());
100 std::istringstream iss;
102 mooseAssert(serialized_buffers.size() == _app.n_processors(),
103 "Unexpected size of serialized_buffers: " << serialized_buffers.size());
105 for (
auto rank = decltype(_app.n_processors())(0); rank < serialized_buffers.size(); ++rank)
107 if (rank == processor_id())
110 iss.str(serialized_buffers[rank]);
115 unsigned int size = 0;
116 iss.read((
char *)&size,
sizeof(size));
118 for (
unsigned int i = 0; i < size; i++)
121 loadHelper(iss, key,
this);
123 std::vector<RealGradient> value;
124 loadHelper(iss, value,
this);
127 _lslope.insert(std::pair<dof_id_type, std::vector<RealGradient>>(key, value));
137 if (_app.n_processors() > 1)
139 std::vector<std::string> send_buffers(1);
140 std::vector<std::string> recv_buffers;
142 recv_buffers.reserve(_app.n_processors());
144 comm().allgather_packed_range((
void *)(
nullptr),
145 send_buffers.begin(),
147 std::back_inserter(recv_buffers));