v0.15.5
Loading...
Searching...
No Matches
PipelineGraph.cpp
Go to the documentation of this file.
1/**
2 * @file PipelineGraph.cpp
3 * @brief Plot pipeline graph
4 * @version 0.1
5 * @date 2025-12-26
6 *
7 * @copyright Copyright (c) 2025
8 *
9 */
10
11#include <MoFEM.hpp>
12
13#include <boost/graph/adjacency_list.hpp>
14#include <boost/graph/graphviz.hpp>
15
16struct VertexData {
17 std::string label;
18 std::string shape;
19 std::string style;
20 std::string color;
21};
22
23using Graph =
24 boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS,
25 boost::property<boost::vertex_name_t, VertexData>,
26 boost::property<boost::edge_name_t, std::string>>;
27
28namespace MoFEM {
29
31using VertexDescriptor = boost::graph_traits<Graph>::vertex_descriptor;
32
34plot_pipeline_graph_impl(const boost::ptr_deque<UserDataOperator> &pip,
35 std::string pip_name, boost::shared_ptr<Graph> g_ptr,
36 VertexDescriptor root_vertex) {
37
38 auto get_fe_name = [](const auto &fe) {
39 std::ostringstream ss;
40 ss << "FE:" << boost::typeindex::type_id_runtime(fe).pretty_name();
41 return ss;
42 };
43
44 auto get_name_short = [](const auto &op) {
45 std::ostringstream ss;
46 ss << "OP:" << boost::typeindex::type_id_runtime(op).pretty_name();
47 return ss;
48 };
49
50 auto get_name_long = [get_name_short](const auto &op) {
51 auto ss = get_name_short(op);
52 switch (op.getOpType()) {
54 ss << ":r:" << op.rowFieldName;
55 break;
57 ss << ":c:" << op.colFieldName;
58 break;
60 ss << ":r:" << op.rowFieldName << ":c:" << op.colFieldName;
61 break;
63 ss << ":s:" << FieldSpaceNames[op.sPace];
64 break;
65 default:
66 CHK_THROW_MESSAGE(MOFEM_DATA_INCONSISTENCY, "Impossible operator type");
67 };
68 return ss;
69 };
70
71 auto &g = *g_ptr;
72
73 auto vname = get(boost::vertex_name, g);
74 auto ename = get(boost::edge_name, g);
75
76
77 std::function<VertexDescriptor(VertexDescriptor &,
78 const boost::ptr_deque<UserDataOperator> &)>
79 add_tree = [&](VertexDescriptor &root_vertex,
80 const boost::ptr_deque<UserDataOperator> &pip) {
81 auto prev_vertex = root_vertex;
82
83 for (auto &op : pip) {
84
85 auto op_vertex = boost::add_vertex(g);
86 vname[op_vertex] = {get_name_long(op).str(), "box", "solid",
87 "black"};
88
89 auto fe_weak_ptr = op.getSubPipelinePtr();
90
91 if (auto fe = fe_weak_ptr.lock()) {
92
93 auto fe_vertex = boost::add_vertex(g);
94 vname[fe_vertex] = {get_fe_name(*fe).str(), "box3d", "filled", "lightgrey"};
95
96 auto last_vertex = add_tree(fe_vertex, fe->getOpPtrVector());
97
98 // add edges back and from loop
99 auto [e_loop_start, ok1_start] =
100 add_edge(op_vertex, fe_vertex, g);
101 ename[e_loop_start] = "go to loop";
102 auto [e_loop_end, ok1_end] = add_edge(last_vertex, op_vertex, g);
103 ename[e_loop_end] = "back from loop";
104 }
105
106 auto [e, ok1] = add_edge(prev_vertex, op_vertex, g);
107
108 prev_vertex = op_vertex;
109 }
110
111 return prev_vertex;
112 };
113
114 auto pip_vertex = boost::add_vertex(g);
115 vname[pip_vertex] = {pip_name, "box3d", "filled", "lightgrey"};
116 auto [e_root_pip, ok] = add_edge(root_vertex, pip_vertex, g);
117 ename[e_root_pip] = "pipeline";
118
119 auto last_vertex = add_tree(pip_vertex, pip);
120
121 return last_vertex;
122}
123
124static void write_graphviz_impl(std::string file_name,
125 boost::shared_ptr<Graph> g_ptr) {
126
127 auto &g = *g_ptr;
128 std::ofstream ofs(file_name);
129
130 // Use a custom vertex writer
131 auto vertex_writer = [&g](std::ostream& out, const VertexDescriptor& v) {
132 auto vdata = get(boost::vertex_name, g)[v];
133 out << "[label=\"" << vdata.label << "\", shape=" << vdata.shape
134 << ", style=" << vdata.style << ", color=" << vdata.color << "]";
135 };
136
137 // Use the existing edge name property
138 auto edge_writer = boost::make_label_writer(get(boost::edge_name, g));
139
140 boost::write_graphviz(ofs, g, vertex_writer, edge_writer);
141
142
143}
144
146 std::string file_name, std::string pip_name,
147 const boost::ptr_deque<UserDataOperator> &pip) {
149 boost::shared_ptr<Graph> g_ptr(new Graph());
150 auto vname = get(boost::vertex_name, *g_ptr);
151 auto root_vertex = boost::add_vertex(*g_ptr);
152 vname[root_vertex] = {"Finite Element Pipeline Graph", "ellipse", "solid",
153 "black"};
154 plot_pipeline_graph_impl(pip, pip_name, g_ptr, root_vertex);
155 write_graphviz_impl(file_name, g_ptr);
157};
158
161 VertexDescriptor start_vertex,
162 boost::shared_ptr<Graph> g_ptr) {
163 boost::ptr_deque<UserDataOperator> null_pip;
164 auto vname = get(boost::vertex_name, *g_ptr);
165
166 auto get_fe_name = [](const auto &fe) {
167 std::ostringstream ss;
168 ss << "FE:" << boost::typeindex::type_id_runtime(fe).pretty_name();
169 return ss;
170 };
171
172 auto pre_vertex = boost::add_vertex(*g_ptr);
173 vname[pre_vertex] = {"Stage PreProcess", "ellipse", "solid", "black"};
174 auto [pre_rhs, ok_pre_rhs] = add_edge(start_vertex, pre_vertex, *g_ptr);
175
176 auto prev_vertex = pre_vertex;
177 for (auto &bit : pre) {
178 auto name = "BM:" + get_fe_name(bit.get()).str();
179 prev_vertex = plot_pipeline_graph_impl(null_pip, name, g_ptr, prev_vertex);
180 }
181
182 auto pro_vertex = boost::add_vertex(*g_ptr);
183 vname[pro_vertex] = {"Stage Processs", "ellipse", "solid", "black"};
184 auto [pro_rhs, ok_pro_rhs] = add_edge(prev_vertex, pro_vertex, *g_ptr);
185
186 prev_vertex = pro_vertex;
187 for (auto &lit : op) {
188 auto name = lit.first + ":" + get_fe_name(*(lit.second)).str();
189 if (auto fe_ptr =
190 boost::dynamic_pointer_cast<ForcesAndSourcesCore>(lit.second)) {
191 prev_vertex = plot_pipeline_graph_impl(fe_ptr->getOpPtrVector(), name, g_ptr,
192 prev_vertex);
193 } else {
194 prev_vertex = plot_pipeline_graph_impl(null_pip, name, g_ptr, prev_vertex);
195 }
196 }
197
198 auto post_vertex = boost::add_vertex(*g_ptr);
199 vname[post_vertex] = {"Stage PostProcesss", "ellipse", "solid", "black"};
200 auto [post_rhs, ok_post_rhs] = add_edge(prev_vertex, post_vertex, *g_ptr);
201
202 prev_vertex = post_vertex;
203 for (auto &bit : post) {
204 auto name = "BM:" + get_fe_name(bit.get()).str();
205 prev_vertex = plot_pipeline_graph_impl(null_pip, name, g_ptr, prev_vertex);
206 }
207}
208
211 std::string file_name) {
213 boost::shared_ptr<Graph> g_ptr(new Graph());
214 auto &g = *g_ptr;
215
216 auto vname = get(boost::vertex_name, g);
217 auto ename = get(boost::edge_name, g);
218
219 auto root_vertex = boost::add_vertex(g);
220 vname[root_vertex] = {"KSP Graph", "ellipse", "solid", "black"};
221
222 auto lhs_vertex = boost::add_vertex(g);
223 vname[lhs_vertex] = {"Lhs", "box3d", "filled", "lightgrey"};
224 add_edge(root_vertex, lhs_vertex, g);
226 ksp_ctx->getPostProcSetOperators(), lhs_vertex, g_ptr);
227
228 auto rhs_vertex = boost::add_vertex(g);
229 vname[rhs_vertex] = {"Rhs", "box3d", "filled", "lightgrey"};
230 add_edge(root_vertex, rhs_vertex, g);
231 add_stages(ksp_ctx->getPreProcComputeRhs(), ksp_ctx->getComputeRhs(),
232 ksp_ctx->getPostProcComputeRhs(), rhs_vertex, g_ptr);
233
234 write_graphviz_impl(file_name, g_ptr);
236}
237
240 std::string file_name) {
242 boost::shared_ptr<Graph> g_ptr(new Graph());
243 auto &g = *g_ptr;
244
245 auto vname = get(boost::vertex_name, g);
246 auto ename = get(boost::edge_name, g);
247
248 auto root_vertex = boost::add_vertex(g);
249 vname[root_vertex] = {"SNES Graph", "ellipse", "solid", "black"};
250
251 auto lhs_vertex = boost::add_vertex(g);
252 vname[lhs_vertex] = {"Lhs", "box3d", "filled", "lightgrey"};
253 add_edge(root_vertex, lhs_vertex, g);
254 add_stages(snes_ctx->getPreProcSetOperators(), snes_ctx->getSetOperators(),
255 snes_ctx->getPostProcSetOperators(), lhs_vertex, g_ptr);
256
257 auto rhs_vertex = boost::add_vertex(g);
258 vname[rhs_vertex] = {"Rhs", "box3d", "filled", "lightgrey"};
259 add_edge(root_vertex, rhs_vertex, g);
260 add_stages(snes_ctx->getPreProcComputeRhs(), snes_ctx->getComputeRhs(),
261 snes_ctx->getPostProcComputeRhs(), rhs_vertex, g_ptr);
262
263 auto load_vertex = boost::add_vertex(g);
264 vname[load_vertex] = {"LoadTangent", "box3d", "filled", "lightgrey"};
265 add_edge(root_vertex, load_vertex, g);
266 add_stages(snes_ctx->getPreProcLoadTangent(), snes_ctx->getLoadTangent(),
267 snes_ctx->getPostProcLoadTangent(), load_vertex, g_ptr);
268
269 write_graphviz_impl(file_name, g_ptr);
270
272}
273
276 std::string file_name) {
278 boost::shared_ptr<Graph> g_ptr(new Graph());
279 auto &g = *g_ptr;
280
281 auto vname = get(boost::vertex_name, g);
282 auto ename = get(boost::edge_name, g);
283
284 auto root_vertex = boost::add_vertex(g);
285 vname[root_vertex] = {"TS Graph", "ellipse", "solid", "black"};
286
287 auto ifunction_vertex = boost::add_vertex(g);
288 vname[ifunction_vertex] = {"IFunction", "box3d", "filled", "lightgrey"};
289 add_edge(root_vertex, ifunction_vertex, g);
291 ts_ctx->getPostProcessIFunction(), ifunction_vertex, g_ptr);
292
293 auto rhsfunction_vertex = boost::add_vertex(g);
294 vname[rhsfunction_vertex] = {"RHSFunction", "box3d", "filled", "lightgrey"};
295 add_edge(root_vertex, rhsfunction_vertex, g);
297 ts_ctx->getPostProcessRHSFunction(), rhsfunction_vertex, g_ptr);
298
299 auto ijjacobian_vertex = boost::add_vertex(g);
300 vname[ijjacobian_vertex] = {"IJacobian", "box3d", "filled", "lightgrey"};
301 add_edge(root_vertex, ijjacobian_vertex, g);
303 ts_ctx->getPostProcessIJacobian(), ijjacobian_vertex, g_ptr);
304
305 auto rhsjacobian_vertex = boost::add_vertex(g);
306 vname[rhsjacobian_vertex] = {"RHSJacobian", "box3d", "filled", "lightgrey"};
307 add_edge(root_vertex, rhsjacobian_vertex, g);
309 ts_ctx->getPostProcessRHSJacobian(), rhsjacobian_vertex, g_ptr);
310
311 auto monitor_vertex = boost::add_vertex(g);
312 vname[monitor_vertex] = {"Monitor", "box3d", "filled", "lightgrey"};
313 add_edge(root_vertex, monitor_vertex, g);
315 ts_ctx->getPostProcessMonitor(), monitor_vertex, g_ptr);
316
317 write_graphviz_impl(file_name, g_ptr);
319}
320
323 PipelineManager *pip_mng) {
325 boost::shared_ptr<Graph> g_ptr(new Graph());
326 auto vname = get(boost::vertex_name, *g_ptr);
327 auto root_vertex = boost::add_vertex(*g_ptr);
328 vname[root_vertex] = {"Pipeline Manager Graph", "ellipse", "solid", "black"};
329
330 // lhs
331 if (pip_mng->getDomainLhsFE())
333 "DomainLhsPipeline", g_ptr, root_vertex);
334 if (pip_mng->getBoundaryLhsFE())
336 "BoundaryLhsPipeline", g_ptr, root_vertex);
337 if (pip_mng->getSkeletonLhsFE())
339 "SkeletonLhsPipeline", g_ptr, root_vertex);
340
341 // rhs
342 if (pip_mng->getDomainRhsFE())
344 "DomainRhsPipeline", g_ptr, root_vertex);
345 if (pip_mng->getBoundaryRhsFE())
347 "BoundaryRhsPipeline", g_ptr, root_vertex);
348
349 if (pip_mng->getSkeletonRhsFE())
351 "SkeletonRhsPipeline", g_ptr, root_vertex);
352 // rhs explict
353 if (pip_mng->getDomainExplicitRhsFE())
355 "DomainRhsExplicitPipeline", g_ptr,
356 root_vertex);
357 if (pip_mng->getBoundaryExplicitRhsFE())
359 "BoundaryRhsExplicitPipeline", g_ptr,
360 root_vertex);
361 if (pip_mng->getSkeletonExplicitRhsFE())
363 "SkeletonRhsExplicitPipeline", g_ptr,
364 root_vertex);
365
366 // meshset
367 if (pip_mng->getMeshsetLhsFE())
369 "MeshsetLhsPipeline", g_ptr, root_vertex);
370 if (pip_mng->getMeshsetRhsFE())
372 "MeshsetRhsPipeline", g_ptr, root_vertex);
373 if (pip_mng->getMeshsetExplicitRhsFE())
375 "MeshsetRhsExplicitPipeline", g_ptr,
376 root_vertex);
377
378 write_graphviz_impl(file_name, g_ptr);
379
381}
382
384PipelineGraph::query_interface(boost::typeindex::type_index type_index,
385 UnknownInterface **iface) const {
386 *iface = const_cast<PipelineGraph *>(this);
387 return 0;
388}
389
391 : cOre(const_cast<Core &>(core)) {}
392
393} // namespace MoFEM
boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS, boost::property< boost::vertex_name_t, VertexData >, boost::property< boost::edge_name_t, std::string > > Graph
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
static const char *const FieldSpaceNames[]
Definition definitions.h:92
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_DATA_INCONSISTENCY
Definition definitions.h:31
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
boost::ptr_deque< UserDataOperator > & getOpBoundaryExplicitRhsPipeline()
Get the Op Boundary Rhs Pipeline object for implicit-explicit G term.
boost::ptr_deque< UserDataOperator > & getOpDomainExplicitRhsPipeline()
Get the Op Domain Rhs Pipeline object for implicit-explicit G term.
boost::ptr_deque< UserDataOperator > & getOpSkeletonExplicitRhsPipeline()
Get the Op Skeleton Rhs Pipeline object for implicit-explicit G term.
boost::ptr_deque< UserDataOperator > & getOpDomainLhsPipeline()
Get the Op Domain Lhs Pipeline object.
boost::ptr_deque< UserDataOperator > & getOpSkeletonLhsPipeline()
Get the Op Skeleton Lhs Pipeline object.
boost::ptr_deque< UserDataOperator > & getOpBoundaryLhsPipeline()
Get the Op Boundary Lhs Pipeline object.
boost::ptr_deque< UserDataOperator > & getOpBoundaryRhsPipeline()
Get the Op Boundary Rhs Pipeline object.
boost::ptr_deque< UserDataOperator > & getOpSkeletonRhsPipeline()
Get the Op Skeleton Rhs Pipeline object.
boost::ptr_deque< UserDataOperator > & getOpDomainRhsPipeline()
Get the Op Domain Rhs Pipeline object.
auto bit
set bit
const double v
phase velocity of light in medium (cm/ns)
MoFEM::TsCtx * ts_ctx
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
Definition Common.hpp:10
static void write_graphviz_impl(std::string file_name, boost::shared_ptr< Graph > g_ptr)
boost::graph_traits< Graph >::vertex_descriptor VertexDescriptor
static VertexDescriptor plot_pipeline_graph_impl(const boost::ptr_deque< UserDataOperator > &pip, std::string pip_name, boost::shared_ptr< Graph > g_ptr, VertexDescriptor root_vertex)
std::deque< BasicMethodPtr > BasicMethodsSequence
Definition AuxPETSc.hpp:58
std::deque< PairNameFEMethodPtr > FEMethodsSequence
Definition AuxPETSc.hpp:57
static void add_stages(BasicMethodsSequence &pre, FEMethodsSequence &op, BasicMethodsSequence &post, VertexDescriptor start_vertex, boost::shared_ptr< Graph > g_ptr)
constexpr double g
Core (interface) class.
Definition Core.hpp:82
@ OPCOL
operator doWork function is executed on FE columns
@ OPROW
operator doWork function is executed on FE rows
@ OPROWCOL
operator doWork is executed on FE rows &columns
@ OPSPACE
operator do Work is execute on space data
Interface for linear (KSP) solver.
Definition KspCtx.hpp:14
BasicMethodsSequence & getPostProcComputeRhs()
Definition KspCtx.cpp:114
BasicMethodsSequence & getPreProcComputeRhs()
Definition KspCtx.cpp:110
BasicMethodsSequence & getPreProcSetOperators()
Definition KspCtx.cpp:118
FEMethodsSequence & getSetOperators()
Definition KspCtx.cpp:102
FEMethodsSequence & getComputeRhs()
Definition KspCtx.cpp:106
BasicMethodsSequence & getPostProcSetOperators()
Definition KspCtx.cpp:122
static MoFEMErrorCode writeTSGraphGraphviz(TsCtx *ts_ctx, std::string file_name)
TS graph to Graphviz file.
static MoFEMErrorCode writeKSPGraphGraphviz(KspCtx *ksp_ctx, std::string filename)
KSP graph to Graphviz file.
static MoFEMErrorCode writeGraphGraphviz(std::string filename, std::string pip_name, const boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip)
Pipeline graph to Graphviz file.
static MoFEMErrorCode writePiplineManagerGraphGraphviz(std::string filename, PipelineManager *pip_mng)
Write pipeline manager graph to Graphviz file.
static MoFEMErrorCode writeSNESGraphGraphviz(SnesCtx *snes_ctx, std::string file_name)
SNES graph to Graphviz file.
MoFEMErrorCode query_interface(boost::typeindex::type_index type_index, UnknownInterface **iface) const
Query interface for type-safe casting.
PipelineGraph(const MoFEM::Core &core)
PipelineManager interface.
boost::shared_ptr< FEMethod > & getDomainRhsFE()
Get domain right-hand side finite element.
boost::ptr_deque< UserDataOperator > & getOpMeshsetRhsPipeline()
Get the Op Meshset Rhs Pipeline object.
boost::shared_ptr< FEMethod > & getDomainLhsFE()
Get domain left-hand side finite element.
boost::ptr_deque< UserDataOperator > & getOpMeshsetExplicitRhsPipeline()
Get the Op Meshset Explicit Rhs Pipeline object.
boost::shared_ptr< FEMethod > & getSkeletonRhsFE()
Get skeleton right-hand side finite element.
boost::shared_ptr< FEMethod > & getMeshsetLhsFE()
Get meshset left-hand side finite element.
boost::shared_ptr< FEMethod > & getBoundaryLhsFE()
Get boundary left-hand side finite element.
boost::shared_ptr< FEMethod > & getSkeletonLhsFE()
Get skeleton left-hand side finite element.
boost::shared_ptr< FEMethod > & getMeshsetRhsFE()
Get meshset right-hand side finite element.
boost::shared_ptr< FEMethod > & getDomainExplicitRhsFE()
Get domain explicit right-hand side finite element.
boost::shared_ptr< FEMethod > & getBoundaryRhsFE()
Get boundary right-hand side finite element.
boost::ptr_deque< UserDataOperator > & getOpMeshsetLhsPipeline()
Get the Op Meshset Lhs Pipeline object.
boost::shared_ptr< FEMethod > & getSkeletonExplicitRhsFE()
Get skeleton explicit right-hand side finite element.
boost::shared_ptr< FEMethod > & getBoundaryExplicitRhsFE()
Get boundary explicit right-hand side finite element.
boost::shared_ptr< FEMethod > & getMeshsetExplicitRhsFE()
Get meshset explicit right-hand side finite element.
Interface for nonlinear (SNES) solver.
Definition SnesCtx.hpp:15
FEMethodsSequence & getSetOperators()
Definition SnesCtx.cpp:133
BasicMethodsSequence & getPreProcLoadTangent()
Get the BasicMethod sequence for preprocessing of FunctionFn.
Definition SnesCtx.cpp:161
BasicMethodsSequence & getPreProcSetOperators()
Definition SnesCtx.cpp:149
BasicMethodsSequence & getPostProcLoadTangent()
Get the BasicMethod sequence for postprocessing of FunctionFn.
Definition SnesCtx.cpp:165
BasicMethodsSequence & getPostProcComputeRhs()
Definition SnesCtx.cpp:145
BasicMethodsSequence & getPostProcSetOperators()
Definition SnesCtx.cpp:153
BasicMethodsSequence & getPreProcComputeRhs()
Definition SnesCtx.cpp:141
FEMethodsSequence & getLoadTangent()
Get the finite element pipeline for FunctionFn, that calculate tangent of function load for arc lengt...
Definition SnesCtx.cpp:157
FEMethodsSequence & getComputeRhs()
Definition SnesCtx.cpp:137
Interface for Time Stepping (TS) solver.
Definition TsCtx.hpp:17
BasicMethodsSequence & getPostProcessRHSFunction()
Get the postProcess to do RHSFunction object.
Definition TsCtx.hpp:182
BasicMethodsSequence & getPostProcessIJacobian()
Get the postProcess to do IJacobian object.
Definition TsCtx.hpp:132
FEMethodsSequence & getLoopsMonitor()
Get the loops to do Monitor object.
Definition TsCtx.hpp:102
BasicMethodsSequence & getPreProcessMonitor()
Get the preProcess to do Monitor object.
Definition TsCtx.hpp:141
BasicMethodsSequence & getPostProcessRHSJacobian()
Get the postProcess to do RHSJacobian object.
Definition TsCtx.hpp:164
BasicMethodsSequence & getPostProcessIFunction()
Get the postProcess to do IFunction object.
Definition TsCtx.hpp:116
BasicMethodsSequence & getPreProcessRHSFunction()
Get the preProcess to do RHSFunction object.
Definition TsCtx.hpp:173
FEMethodsSequence & getLoopsIFunction()
Get the loops to do IFunction object.
Definition TsCtx.hpp:63
FEMethodsSequence & getLoopsRHSJacobian()
Get the loops to do RHSJacobian object.
Definition TsCtx.hpp:93
BasicMethodsSequence & getPreProcessIFunction()
Get the preProcess to do IFunction object.
Definition TsCtx.hpp:109
FEMethodsSequence & getLoopsRHSFunction()
Get the loops to do RHSFunction object.
Definition TsCtx.hpp:73
FEMethodsSequence & getLoopsIJacobian()
Get the loops to do IJacobian object.
Definition TsCtx.hpp:83
BasicMethodsSequence & getPreProcessRHSJacobian()
Get the preProcess to do RHSJacobian object.
Definition TsCtx.hpp:155
BasicMethodsSequence & getPostProcessMonitor()
Get the postProcess to do Monitor object.
Definition TsCtx.hpp:148
BasicMethodsSequence & getPreProcessIJacobian()
Get the preProcess to do IJacobian object.
Definition TsCtx.hpp:125
base class for all interface classes
std::string shape
std::string color
std::string label
std::string style