Currently, the PatchRecoveryErrorEstimator object examines
ErrorEstimator::sobolev_order(), and returns an element-wise
L_infinity error in either the gradient or hessian.  This is fine for
some purposes, but in other circumstances it can potentially
lead to overrefinement into layers/singularities.  In one circumstance
I just ran into, using PatchRecovery leads to unstable runaway
overrefinement.

I'd like to fix that, and the simplest fix is to just make
PatchRecovery start returning L_2 errors in either the gradient or
hessian.  I'd like to make that the default PatchRecovery behavior,
unless anyone objects.

The next question, then, is how to handle non-default behavior.  Our
best API for this is the SystemNorm class I added a while ago for some
System methods: a SystemNorm can express all the information that we
currently expose via sobolev_order() and component_scale, but can also
express a strict superset of that information, including making
distinctions between L_2- and L_infinity-based seminorms.

But making ErrorEstimator objects use a SystemNorm is another story.
We're already in the middle of an API-breaking change from
component_mask to component_scale; it seems rude to deprecate the
latter before the former is even removed, and it would be dangerously
convoluted to write implementation code that is backwards compatible
with that many ways of specifying norm type.  Part of me wants to just
delete component_* and sobolev_order, replace them all with a single
SystemNorm, and make everyone change their code to suit, but I figure
I'd better throw that out as a suggestion on the mailing lists first.

Any comments? ideas? complaints? angry rants?
---
Roy

------------------------------------------------------------------------------
_______________________________________________
Libmesh-users mailing list
Libmesh-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libmesh-users

Reply via email to