19 params.addClassDescription(
"One-dimensional slope limiting to get the limited slope of cell "
20 "average variable for the advection equation using a cell-centered "
21 "finite volume method.");
22 params.addRequiredCoupledVar(
"u",
"constant monomial variable");
23 MooseEnum scheme(
"none minmod mc superbee",
"none");
24 params.addParam<MooseEnum>(
"scheme", scheme,
"TVD-type slope limiting scheme");
29 :
SlopeLimitingBase(parameters), _u(getVar(
"u", 0)), _scheme(getParam<MooseEnum>(
"scheme"))
33 std::vector<RealGradient>
38 unsigned int nvars = 1;
52 unsigned int nside = elem->n_sides();
55 unsigned int nsten = nside + 1;
58 std::vector<RealGradient> ugrad(nvars,
RealGradient(0., 0., 0.));
61 std::vector<Real> xc(nsten, 0.);
64 xc[0] = elem->centroid()(0);
67 std::vector<std::vector<Real>> ucell(nsten, std::vector<Real>(nvars, 0.));
85 std::vector<std::vector<Real>> sigma(nsten, std::vector<Real>(nvars, 0.));
89 ucell[0][0] =
_u->getElementalValue(elem);
91 ucell[0][0] =
_u->getElementalValueOld(elem);
95 unsigned int bflag = 0;
99 for (is = 0; is < nside; is++)
104 if (elem->neighbor_ptr(is) != NULL)
106 const Elem * neig = elem->neighbor_ptr(is);
107 if (this->hasBlocks(neig->subdomain_id()))
109 xc[in] = neig->centroid()(0);
113 ucell[in][0] =
_u->getElementalValue(neig);
115 ucell[in][0] =
_u->getElementalValueOld(neig);
119 for (iv = 0; iv < nvars; iv++)
120 sigma[in][iv] = (ucell[0][iv] - ucell[in][iv]) / (xc[0] - xc[in]);
149 for (iv = 0; iv < nvars; iv++)
151 if ((sigma[1][iv] * sigma[2][iv]) > 0.)
153 if (std::abs(sigma[1][iv]) < std::abs(sigma[2][iv]))
154 ugrad[iv](0) = sigma[1][iv];
156 ugrad[iv](0) = sigma[2][iv];
169 for (iv = 0; iv < nvars; iv++)
170 sigma[0][iv] = (ucell[1][iv] - ucell[2][iv]) / (xc[1] - xc[2]);
172 for (iv = 0; iv < nvars; iv++)
174 if (sigma[0][iv] > 0. && sigma[1][iv] > 0. && sigma[2][iv] > 0.)
175 ugrad[iv](0) = std::min(sigma[0][iv], 2. * std::min(sigma[1][iv], sigma[2][iv]));
176 else if (sigma[0][iv] < 0. && sigma[1][iv] < 0. && sigma[2][iv] < 0.)
177 ugrad[iv](0) = std::max(sigma[0][iv], 2. * std::max(sigma[1][iv], sigma[2][iv]));
189 for (iv = 0; iv < nvars; iv++)
195 if (sigma[2][iv] > 0. && sigma[1][iv] > 0.)
196 sigma1 = std::min(sigma[2][iv], 2. * sigma[1][iv]);
197 else if (sigma[2][iv] < 0. && sigma[1][iv] < 0.)
198 sigma1 = std::max(sigma[2][iv], 2. * sigma[1][iv]);
201 if (sigma[2][iv] > 0. && sigma[1][iv] > 0.)
202 sigma2 = std::min(2. * sigma[2][iv], sigma[1][iv]);
203 else if (sigma[2][iv] < 0. && sigma[1][iv] < 0.)
204 sigma2 = std::max(2. * sigma[2][iv], sigma[1][iv]);
207 if (sigma1 > 0. && sigma2 > 0.)
208 ugrad[iv](0) = std::max(sigma1, sigma2);
209 else if (sigma1 < 0. && sigma2 < 0.)
210 ugrad[iv](0) = std::min(sigma1, sigma2);
216 mooseError(
"Unknown 1D TVD-type slope limiter scheme");