204 {
206
207 SmartPetscObj<Vec> smart_vec_in;
208 if (vec_in)
209 smart_vec_in = SmartPetscObj<Vec>(vec_in, true);
210
211 MOFEM_LOG(
"REMESHING", Sev::inform) <<
"Got past smart vector";
212
213 feRhs->getOpPtrVector().clear();
214
215 MOFEM_LOG(
"REMESHING", Sev::inform) <<
"Cleared RHS FE";
216
218
220
221
222
229
230 auto T_ptr = boost::make_shared<VectorDouble>();
231 auto TAU_ptr = boost::make_shared<VectorDouble>();
232 auto EP_ptr = boost::make_shared<MatrixDouble>();
233
234 auto set_domain_rhs = [&](auto &pip) {
236
238
239 auto old_T_ptr = boost::make_shared<VectorDouble>();
240 auto old_TAU_ptr = boost::make_shared<VectorDouble>();
241 auto old_EP_ptr = boost::make_shared<MatrixDouble>();
242
243 auto old_el_ops = [&](auto &pip) {
245
246
247 if (vec_in) {
248 pip.push_back(
249 new OpCalculateScalarFieldValues("T", old_T_ptr, smart_vec_in));
250 pip.push_back(
251 new OpCalculateScalarFieldValues("TAU", old_TAU_ptr, smart_vec_in));
252 pip.push_back(new OpCalculateTensor2SymmetricFieldValues<SPACE_DIM>(
253 "EP", old_EP_ptr, smart_vec_in));
254 } else {
255 pip.push_back(new OpCalculateScalarFieldValues("T", old_T_ptr));
256 pip.push_back(new OpCalculateScalarFieldValues("TAU", old_TAU_ptr));
257 pip.push_back(new OpCalculateTensor2SymmetricFieldValues<SPACE_DIM>(
258 "EP", old_EP_ptr));
259 }
260
261
262
263
264
265
266
268 };
269
270 auto new_el_ops = [&](auto &pp_fe, auto &&p) {
272
273 auto new_T_ptr = boost::make_shared<VectorDouble>();
274 auto new_TAU_ptr = boost::make_shared<VectorDouble>();
275 auto new_EP_ptr = boost::make_shared<MatrixDouble>();
276 if (vec_in) {
277 pip.push_back(
278 new OpCalculateScalarFieldValues("T", new_T_ptr, smart_vec_in));
279 pip.push_back(
280 new OpCalculateScalarFieldValues("TAU", new_TAU_ptr, smart_vec_in));
281 pip.push_back(new OpCalculateTensor2SymmetricFieldValues<SPACE_DIM>(
282 "EP", new_EP_ptr, smart_vec_in));
283 } else {
284 MOFEM_LOG(
"REMESHING", Sev::inform) <<
"In other branch of child ops";
285 pip.push_back(new OpCalculateScalarFieldValues("T", new_T_ptr));
286 pip.push_back(new OpCalculateScalarFieldValues("TAU", new_TAU_ptr));
287 pip.push_back(new OpCalculateTensor2SymmetricFieldValues<SPACE_DIM>(
288 "EP", new_EP_ptr));
289 }
290
291 pip.push_back(
293 "T", old_T_ptr,
nullptr, new_T_ptr,
nullptr,
m_field));
294 pip.push_back(
296 "TAU", old_TAU_ptr,
nullptr, new_TAU_ptr,
nullptr,
m_field));
297 pip.push_back(
300 "EP", old_EP_ptr,
nullptr, new_EP_ptr,
nullptr,
m_field));
301
303 };
304
305
306 auto op_range = new OpLoopRange<DomainEleOnRange>(
308 boost::make_shared<Range>(els_to_flip), Sev::noisy);
309
310 op_range->getRangeFEPtr()->getRuleHook = [](
int,
int,
int) {
return -1; };
311
312
313 pip.push_back(op_range);
314
315
316 CHK_MOAB_THROW(new_el_ops(pip, old_el_ops(op_range->getOpPtrVector())),
317 "failed to loop over child ops");
318
320 };
321
322 auto set_domain_lhs = [&](auto &pip) {
324
326
327 using OpLhsScalarLeastSquaresProj = FormsIntegrators<DomainEleOp>::Assembly<
329 pip.push_back(new OpLhsScalarLeastSquaresProj("T", "T"));
330 pip.push_back(new OpLhsScalarLeastSquaresProj("TAU", "TAU"));
331 pip.push_back(
333 "EP", "EP"));
334
336 };
337
340
342};
void simple(double P1[], double P2[], double P3[], double c[], const int N)
constexpr int SPACE_DIM
[Define dimension]
@ L2
field with C-1 continuity
#define CHK_MOAB_THROW(err, msg)
Check error code of MoAB function and throw MoFEM exception.
#define MOFEM_LOG(channel, severity)
Log.
Rhs for mapping scalar fields with least squares.
Rhs for mapping symmetric tensor fields with least squares.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
constexpr AssemblyType AT
constexpr IntegrationType IT
int geom_order
Order if fixed.