Theseus
Compressible flow solver
Loading...
Searching...
No Matches
TimeStepControl.hpp
Go to the documentation of this file.
1// Copyright (c) 2025-2026 Board of Trustees of the University of Illinois
2//
3// SPDX-License-Identifier: BSD-3-Clause
4#pragma once
5
6#include <algorithm>
7#include <cmath>
8#include <initializer_list>
9#include <limits>
10
11#include "mfem.hpp"
12
13namespace Theseus
14{
15 inline mfem::real_t TimeEventTolerance(const mfem::real_t time)
16 {
17 return 16.0 * std::numeric_limits<mfem::real_t>::epsilon()
18 * std::max(mfem::real_t(1.0), std::abs(time));
19 }
20
21 inline bool TimeEventReached(const mfem::real_t time,
22 const mfem::real_t event_time)
23 {
24 return time + TimeEventTolerance(time) >= event_time;
25 }
26
27 inline mfem::real_t TimeToNextEvent(
28 const mfem::real_t time,
29 const std::initializer_list<mfem::real_t> event_times)
30 {
31 mfem::real_t result = mfem::infinity();
32 const mfem::real_t tolerance = TimeEventTolerance(time);
33 for (const mfem::real_t event_time : event_times)
34 {
35 const mfem::real_t delta = event_time - time;
36 if (std::isfinite(event_time) && delta > tolerance)
37 result = std::min(result, delta);
38 }
39 return result;
40 }
41
42 inline mfem::real_t LimitTimeStepToEvents(
43 const mfem::real_t nominal_step,
44 const mfem::real_t time,
45 const std::initializer_list<mfem::real_t> event_times)
46 {
47 return std::min(nominal_step, TimeToNextEvent(time, event_times));
48 }
49}
Definition AxisymmetricGeometry.hpp:15
mfem::real_t LimitTimeStepToEvents(const mfem::real_t nominal_step, const mfem::real_t time, const std::initializer_list< mfem::real_t > event_times)
Definition TimeStepControl.hpp:42
mfem::real_t TimeToNextEvent(const mfem::real_t time, const std::initializer_list< mfem::real_t > event_times)
Definition TimeStepControl.hpp:27
bool TimeEventReached(const mfem::real_t time, const mfem::real_t event_time)
Definition TimeStepControl.hpp:21
mfem::real_t TimeEventTolerance(const mfem::real_t time)
Definition TimeStepControl.hpp:15