FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
PanelClampLog.h
1#pragma once
2
18#include "PanelLoadTypes.h"
19
20#include <atomic>
21#include <fhsim/ISimObjectLogger.h>
22#include <string>
23
24namespace hydrodynamics
25{
26
28constexpr unsigned kReportedClampFlags = kPanelFlagSolidityClamped | kPanelFlagReynoldsClamped | kPanelFlagFlowNotFinite;
29
31{
32public:
37 void Note(unsigned flags) const
38 {
39 const unsigned relevant = flags & kReportedClampFlags;
40 if (relevant != 0 && (m_seen.load(std::memory_order_relaxed) | relevant) != m_seen.load(std::memory_order_relaxed))
41 m_seen.fetch_or(relevant, std::memory_order_relaxed);
42 }
43
50 void Report(ISimObjectLogger& logger, const std::string& name)
51 {
52 const unsigned fresh = m_seen.load(std::memory_order_relaxed) & ~m_reported;
53 if (fresh & kPanelFlagSolidityClamped)
54 logger.LogInfo(name + ": Warning: a panel's solidity was clamped into its load law's range, so its load is capped. Check KnotFactor and Solidity, and whether the mesh has closed up. Logged once per run.");
55 if (fresh & kPanelFlagReynoldsClamped)
56 logger.LogInfo(name + ": a panel's Reynolds number was clamped into its load law's fit range, so its drag coefficient is held at the bound. Logged once per run.");
57 if (fresh & kPanelFlagFlowNotFinite)
58 logger.LogInfo(name + ": Warning: a panel's relative water velocity was not finite, so its load was set to zero. The state is diverging; reduce the step size or check the inputs. Logged once per run.");
59 m_reported |= fresh;
60 }
61
62private:
63 mutable std::atomic<unsigned> m_seen {0};
64 unsigned m_reported = 0;
65};
66
67} // namespace hydrodynamics
Definition PanelClampLog.h:31
void Report(ISimObjectLogger &logger, const std::string &name)
Definition PanelClampLog.h:50
void Note(unsigned flags) const
Definition PanelClampLog.h:37