37 params.addClassDescription(
"Cross-shaped initial condition");
38 params.addParam<Real>(
"x1", 0.0,
"The x coordinate of the lower left-hand corner of the box");
39 params.addParam<Real>(
"y1", 0.0,
"The y coordinate of the lower left-hand corner of the box");
40 params.addParam<Real>(
"x2", 1.0,
"The x coordinate of the upper right-hand corner of the box");
41 params.addParam<Real>(
"y2", 1.0,
"The y coordinate of the upper right-hand corner of the box");
47 _x1(parameters.get<Real>(
"x1")),
48 _y1(parameters.get<Real>(
"y1")),
49 _x2(parameters.get<Real>(
"x2")),
50 _y2(parameters.get<Real>(
"y2"))
57 const Real x = (p(0) -
_x1) / (
_x2 -
_x1);
58 const Real y = (p(1) -
_y1) / (
_y2 -
_y1);
67 else if (x > 0.5 +
_length / 2.0)
73 else if (y > 0.5 +
_width / 2.0)
75 Real xd = x - .5 -
_length / 2.0;
76 Real yd = y - .5 -
_width / 2.0;
77 Real r = std::sqrt(xd * xd + yd * yd);
80 else if (y > 0.5 -
_width / 2.0)
86 Real xd = x - .5 -
_length / 2.0;
87 Real yd = y - .5 +
_width / 2.0;
88 Real r = std::sqrt(xd * xd + yd * yd);
100 else if (y > 0.5 +
_width / 2.0)
102 else if (y > 0.5 -
_width / 2.0)
109 else if (x > 0.5 +
_width / 2.0)
115 else if (y > 0.5 +
_length / 2.0)
117 Real xd = x - (.5 +
_width / 2.0);
118 Real yd = y - (.5 +
_length / 2.0);
119 Real r = std::sqrt(xd * xd + yd * yd);
126 else if (y > 0.5 +
_width / 2.0)
130 Real r = std::sqrt(xd * xd + yd * yd);
133 else if (y > 0.5 -
_width / 2.0)
141 Real r = std::sqrt(xd * xd + yd * yd);
144 else if (y > 0.5 -
_length / 2.0)
150 Real xd = x - (.5 +
_width / 2.0);
151 Real yd = y - (.5 -
_length / 2.0);
152 Real r = std::sqrt(xd * xd + yd * yd);
160 else if (x > 0.5 -
_width / 2.0)
164 else if (y > 0.5 +
_length / 2.0)
166 else if (y > 0.5 -
_length / 2.0)
179 else if (y > 0.5 +
_length / 2.0)
181 Real xd = x - (.5 -
_width / 2.0);
182 Real yd = y - (.5 +
_length / 2.0);
183 Real r = std::sqrt(xd * xd + yd * yd);
190 else if (y > 0.5 +
_width / 2.0)
194 Real r = std::sqrt(xd * xd + yd * yd);
197 else if (y > 0.5 -
_width / 2.0)
205 Real r = std::sqrt(xd * xd + yd * yd);
208 else if (y > 0.5 -
_length / 2.0)
214 Real xd = x - (.5 -
_width / 2.0);
215 Real yd = y - (.5 -
_length / 2.0);
216 Real r = std::sqrt(xd * xd + yd * yd);
224 else if (x > 0.5 -
_length / 2.0)
228 else if (y > 0.5 +
_width / 2.0)
230 else if (y > 0.5 -
_width / 2.0)
243 else if (y > 0.5 +
_width / 2.0)
245 Real xd = x - (.5 -
_length / 2.0);
246 Real yd = y - .5 -
_width / 2.0;
247 Real r = std::sqrt(xd * xd + yd * yd);
250 else if (y > 0.5 -
_width / 2.0)
256 Real xd = x - (.5 -
_length / 2.0);
257 Real yd = y - .5 +
_width / 2.0;
258 Real r = std::sqrt(xd * xd + yd * yd);
271 Point pxminus = p, pxplus = p, pyminus = p, pyplus = p;
273 pxminus(0) -= TOLERANCE;
274 pyminus(1) -= TOLERANCE;
275 pxplus(0) += TOLERANCE;
276 pyplus(1) += TOLERANCE;
278 Number uxminus =
value(pxminus), uxplus =
value(pxplus), uyminus =
value(pyminus),
279 uyplus =
value(pyplus);
281 return Gradient((uxplus - uxminus) / 2.0 / TOLERANCE, (uyplus - uyminus) / 2.0 / TOLERANCE);