Theseus
Compressible flow solver
Loading...
Searching...
No Matches
VisualizationConfig.hpp
Go to the documentation of this file.
1// Copyright (c) 2025-2026 Board of Trustees of the University of Illinois
2//
3// This file is part of Theseus.
4//
5// SPDX-License-Identifier: BSD-3-Clause
6#pragma once
7
8#include "json.hpp"
9
10#include <algorithm>
11#include <array>
12#include <stdexcept>
13#include <string>
14#include <vector>
15
16namespace Theseus
17{
18
20 {
21 density,
25 };
26
32
38
40 {
41 private:
42 std::vector<VisualizationField> fields_;
44
45 static constexpr std::array<VisualizationFieldSpec, 4> field_registry_
46 {{
47 {VisualizationField::density, "density"},
48 {VisualizationField::velocity, "velocity"},
49 {VisualizationField::pressure, "pressure"},
50 {VisualizationField::blending_coefficient, "blending_coefficient"}
51 }};
52
53 static const VisualizationFieldSpec &FindField(const std::string &name)
54 {
55 const auto it = std::find_if(field_registry_.begin(), field_registry_.end(),
56 [&name](const auto &spec) { return name == spec.name; });
57 if (it == field_registry_.end())
58 {
59 throw std::invalid_argument("Unknown visualization field '" + name +
60 "'. Supported fields: density, velocity, pressure, "
61 "blending_coefficient");
62 }
63 return *it;
64 }
65
66 public:
67 static VisualizationConfig FromRuntime(const nlohmann::json &runtime,
68 bool blending_available)
69 {
71 const bool has_blending_default = blending_available;
72 result.fields_ = {VisualizationField::density,
75 if (has_blending_default)
76 {
77 result.fields_.push_back(VisualizationField::blending_coefficient);
78 }
79
80 if (!runtime.contains("visualization"))
81 {
82 return result;
83 }
84
85 const auto &visualization = runtime.at("visualization");
86 if (!visualization.is_object())
87 {
88 throw std::invalid_argument("runTime.visualization must be an object");
89 }
90 if (!visualization.contains("fields"))
91 {
92 // Continue parsing other visualization options.
93 }
94 else
95 {
96 const auto &configured_fields = visualization.at("fields");
97 if (!configured_fields.is_array())
98 {
99 throw std::invalid_argument(
100 "runTime.visualization.fields must be an array of strings");
101 }
102 if (configured_fields.empty())
103 {
104 throw std::invalid_argument(
105 "runTime.visualization.fields must contain at least one field");
106 }
107
108 result.fields_.clear();
109 for (const auto &entry : configured_fields)
110 {
111 if (!entry.is_string())
112 {
113 throw std::invalid_argument(
114 "runTime.visualization.fields entries must be strings");
115 }
116
117 const auto &spec = FindField(entry.get<std::string>());
119 !blending_available)
120 {
121 throw std::invalid_argument(
122 "Visualization field 'blending_coefficient' is unavailable because Theseus "
123 "was built without SUBCELL_FV_BLENDING");
124 }
125 if (std::find(result.fields_.begin(), result.fields_.end(), spec.field) ==
126 result.fields_.end())
127 {
128 result.fields_.push_back(spec.field);
129 }
130 }
131 }
132
133 if (visualization.contains("mesh_mode"))
134 {
135 const auto &mesh_mode = visualization.at("mesh_mode");
136 if (!mesh_mode.is_string())
137 {
138 throw std::invalid_argument(
139 "runTime.visualization.mesh_mode must be a string");
140 }
141 const std::string mode = mesh_mode.get<std::string>();
142 if (mode == "vtk_high_order")
143 {
144 result.mesh_mode_ = VisualizationMeshMode::vtk_high_order;
145 }
146 else if (mode == "gll_subcells")
147 {
148 result.mesh_mode_ = VisualizationMeshMode::gll_subcells;
149 }
150 else
151 {
152 throw std::invalid_argument(
153 "Unknown visualization mesh mode '" + mode +
154 "'. Supported modes: vtk_high_order, gll_subcells");
155 }
156 }
157 return result;
158 }
159
160 bool Has(VisualizationField field) const
161 {
162 return std::find(fields_.begin(), fields_.end(), field) != fields_.end();
163 }
164
165 const std::vector<VisualizationField> &Fields() const { return fields_; }
166
167 VisualizationMeshMode MeshMode() const { return mesh_mode_; }
168 };
169
170}
Definition VisualizationConfig.hpp:40
static VisualizationConfig FromRuntime(const nlohmann::json &runtime, bool blending_available)
Definition VisualizationConfig.hpp:67
const std::vector< VisualizationField > & Fields() const
Definition VisualizationConfig.hpp:165
bool Has(VisualizationField field) const
Definition VisualizationConfig.hpp:160
VisualizationMeshMode MeshMode() const
Definition VisualizationConfig.hpp:167
Definition AxisymmetricGeometry.hpp:15
VisualizationMeshMode
Definition VisualizationConfig.hpp:28
VisualizationField
Definition VisualizationConfig.hpp:20
Definition VisualizationConfig.hpp:34
VisualizationField field
Definition VisualizationConfig.hpp:35
const char * name
Definition VisualizationConfig.hpp:36