From: Roy S. <roy...@ic...> - 2009-07-02 18:45:12
|
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 |