-
Notifications
You must be signed in to change notification settings - Fork 80
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Producing residual maps #3107
base: develop
Are you sure you want to change the base?
Producing residual maps #3107
Conversation
* move dump to trigger when Newton struggles
…e history of convergence
# Conflicts: # src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## develop #3107 +/- ##
===========================================
- Coverage 53.57% 53.53% -0.05%
===========================================
Files 1003 1005 +2
Lines 85289 85374 +85
===========================================
+ Hits 45696 45702 +6
- Misses 39593 39672 +79 ☔ View full report in Codecov by Sentry. |
thanks @jafranc |
Of course, <Events
maxTime="2e7">
<PeriodicEvent
name="outputs"
timeFrequency="2e7"
target="/Outputs/vtkOutput"/>
<PeriodicEvent
name="solverApplications1"
forceDt="1e5"
endTime="1e5"
target="/Solvers/compflow" />
<ResidualDumpEvent
name="solverApplications2"
forceDt="2.5e6"
beginTime="1e5"
endTime="2e7"
target="/Solvers/compflow"
secondaryTarget="/Outputs/vtkOutput" />
</Events> for an example in on the Another way of testing it is to stop with the debugger in a |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry about an unsolicited review. I wonder if you considered implementing residual dump as a task instead of a new event type. Reason being events are meant to be general and not have solver-specific semantics in them, while tasks can be specialized for a single purpose.
<Events
maxTime="2e7">
<PeriodicEvent
name="outputs"
timeFrequency="2e7"
target="/Outputs/vtkOutput"/>
<PeriodicEvent
name="solverApplications1"
forceDt="1e5"
endTime="1e5"
target="/Solvers/compflow" />
<PeriodicEvent
name="residualDumpEvent"
forceDt="2.5e6"
beginTime="1e5"
endTime="2e7"
target="/Tasks/residualDump"/>
</Events>
<Tasks>
<ResidualDump
name="residualDump"
solverTarget="/Solvers/compflow"
outputTarget="/Outputs/vtkOutput"/>
</Tasks>
@@ -243,12 +243,13 @@ bool SolverBase::execute( real64 const time_n, | |||
real64 nextDt = dt; | |||
|
|||
integer const maxSubSteps = m_nonlinearSolverParameters.m_maxSubSteps; | |||
m_rootFlag = new BitNodes< SolverGroupFlags >( nullptr ); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
None of these raw new
s seem to have a corresponding delete
, so it seems like memory is leaked (correct me if I'm wrong).
In general, I have a hard time understanding what this convergence tree is needed for, is there a short explanation? Just curious.
On a surface level it seems the residual dump event only cares if any node in the tree has a flag set (and nodes are never removed/reset), so why couldn't we just track this with a single variable bool m_thisStepEncounteredConvergenceDifficultiesSomewhereAlongTheWay
(name exaggerated but you get the idea)? I'm pretty sure I'm missing something after a cursory look.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- You are perfectly right, I forgot to include corresponding
delete
that will result in mem leak. I will fix it - I am unsure it is required to have a tree struct, though if the time step gets cut, then the flag is set to struggling and the residual updated. The solver then retry with a series of smaller time-steps that hopefully are not cut though the flag is still set to struggle and the residual updated. I guess a clean reset would have been the solution. However, I went for the solution that we might want to exploit further down the road to output some convergence history. I thought it could have been useful in case of some remediation based on flag presences or not.
No worries, it is really useful. This is results of a first attempt and I definitively overlooked that semantic. I will recast in a |
This PR intends at implementing a mechanism to produce residual maps in addition to other fields produce by the
CompositionalMultiphaseFVM
solver. The desirable features are:First point is tacked in:
Residual are for now store through the call at
SolverBase::updateResidualField()
's overload inCompositionalMultiphaseFVM
ifm_logLevel
is greater that level 0 and at the last iteration.Second point is tacked in:
An extra eventResidualDumpEvent
that inherits fromPeriodicEvent
with an extram_secondaryTarget
is introduced. It also conditional triggering of second target on a flag from the (main) target, i.e. solver. A n-tree struct templated (BitNodes<T>
) on an enum flag (SolverBase::SolverGroupFlags
) is used to tack nonlinear convergence history and then trigger exceptional output.A new
ResidualTask
is added to be triggered from aPeriodicEvent
. It has an extram_secondaryTarget
is introduced and set tovtkOutput
. The (main) target, i.e. solver, is holding a flagm_hasNonLinearIssues
to trigger this secondary target if needed and to dump the residual when convergence is struggling.Limitations/To go further: