68 bool blending_available)
71 const bool has_blending_default = blending_available;
75 if (has_blending_default)
80 if (!runtime.contains(
"visualization"))
85 const auto &visualization = runtime.at(
"visualization");
86 if (!visualization.is_object())
88 throw std::invalid_argument(
"runTime.visualization must be an object");
90 if (!visualization.contains(
"fields"))
96 const auto &configured_fields = visualization.at(
"fields");
97 if (!configured_fields.is_array())
99 throw std::invalid_argument(
100 "runTime.visualization.fields must be an array of strings");
102 if (configured_fields.empty())
104 throw std::invalid_argument(
105 "runTime.visualization.fields must contain at least one field");
108 result.fields_.clear();
109 for (
const auto &entry : configured_fields)
111 if (!entry.is_string())
113 throw std::invalid_argument(
114 "runTime.visualization.fields entries must be strings");
117 const auto &spec = FindField(entry.get<std::string>());
121 throw std::invalid_argument(
122 "Visualization field 'blending_coefficient' is unavailable because Theseus "
123 "was built without SUBCELL_FV_BLENDING");
125 if (std::find(result.fields_.begin(), result.fields_.end(), spec.field) ==
126 result.fields_.end())
128 result.fields_.push_back(spec.field);
133 if (visualization.contains(
"mesh_mode"))
135 const auto &mesh_mode = visualization.at(
"mesh_mode");
136 if (!mesh_mode.is_string())
138 throw std::invalid_argument(
139 "runTime.visualization.mesh_mode must be a string");
141 const std::string mode = mesh_mode.get<std::string>();
142 if (mode ==
"vtk_high_order")
146 else if (mode ==
"gll_subcells")
152 throw std::invalid_argument(
153 "Unknown visualization mesh mode '" + mode +
154 "'. Supported modes: vtk_high_order, gll_subcells");