ug4
Loading...
Searching...
No Matches
user_data_impl.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2011-2015: G-CSC, Goethe University Frankfurt
3 * Author: Andreas Vogel
4 *
5 * This file is part of UG4.
6 *
7 * UG4 is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License version 3 (as published by the
9 * Free Software Foundation) with the following additional attribution
10 * requirements (according to LGPL/GPL v3 §7):
11 *
12 * (1) The following notice must be displayed in the Appropriate Legal Notices
13 * of covered and combined works: "Based on UG4 (www.ug4.org/license)".
14 *
15 * (2) The following notice must be displayed at a prominent place in the
16 * terminal output of covered works: "Based on UG4 (www.ug4.org/license)".
17 *
18 * (3) The following bibliography is recommended for citation and must be
19 * preserved in all covered files:
20 * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively
21 * parallel geometric multigrid solver on hierarchically distributed grids.
22 * Computing and visualization in science 16, 4 (2013), 151-164"
23 * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel
24 * flexible software system for simulating pde based models on high performance
25 * computers. Computing and visualization in science 16, 4 (2013), 165-179"
26 *
27 * This program is distributed in the hope that it will be useful,
28 * but WITHOUT ANY WARRANTY; without even the implied warranty of
29 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 * GNU Lesser General Public License for more details.
31 */
32
33#ifndef __H__UG__LIB_DISC__SPATIAL_DISC__USER_DATA__USER_DATA_IMPL__
34#define __H__UG__LIB_DISC__SPATIAL_DISC__USER_DATA__USER_DATA_IMPL__
35
36#include "user_data.h"
38
39namespace ug{
40
42// ICplUserData
44
45template <int dim>
47: m_locPosDim(-1), m_timePoint(0), m_defaultTimePoint(-1), m_si(-1)
48{
49 m_vNumIP.clear();
50 m_vMayChange.clear();
51 m_pvLocIP1d.clear(); m_pvLocIP2d.clear(); m_pvLocIP3d.clear();
52 m_vTime.clear(); m_vTime.push_back(0.0);
53}
54
55template <int dim>
57{
58 local_ip_series_to_be_cleared();
59 m_vNumIP.clear();
60 m_vMayChange.clear();
61 m_locPosDim = -1;
62 m_pvLocIP1d.clear(); m_pvLocIP2d.clear(); m_pvLocIP3d.clear();
63 m_timePoint = 0;
64 m_vTime.clear(); m_vTime.push_back(0.0);
65 m_si = -1;
66}
67
68template <int dim>
69template <int ldim>
71 const size_t numIP,
72 const int timePointSpec,
73 bool bMayChange)
74{
75// check, that dimension is ok.
76 if(m_locPosDim == -1) m_locPosDim = ldim;
77 else if(m_locPosDim != ldim)
78 UG_THROW("Local IP dimension conflict");
79
80// get the "right" time point specification
81 int theTimePoint = (m_defaultTimePoint >= 0)? m_defaultTimePoint : timePointSpec;
82
83// get local positions
84 std::vector<const MathVector<ldim>*>& vvIP = get_local_ips(Int2Type<ldim>());
85
86// search for ips
87// we only identify ip series if the local ip positions will not change
88 if(!bMayChange && numIP != 0)
89 for(size_t s = 0; s < vvIP.size(); ++s)
90 {
91 // return series number iff exists and local ips remain constant
92 if(!m_vMayChange[s])
93 if(vvIP[s] == vPos && m_vNumIP[s] == numIP && m_vTimePoint[s] == theTimePoint)
94 return s;
95 }
96
97// if series not yet registered, add it
98 vvIP.push_back(vPos);
99 m_vNumIP.push_back(numIP);
100 m_vTimePoint.push_back(theTimePoint);
101 m_vMayChange.push_back(bMayChange);
102
103// invoke callback:
104// This callback is called, whenever the local_ip_series have changed. It
105// allows derived classes to react on this changes. For example, the data
106// linker must himself request local_ip_series from the data inputs of
107// the linker. In addition value fields and derivative fields must be adjusted
108// in UserData<TData, dim> etc.
109 local_ip_series_added(m_vNumIP.size() - 1);
110
111// return new series id
112 return m_vNumIP.size() - 1;
113}
114
115
116template <int dim>
117template <int ldim>
118void ICplUserData<dim>::set_local_ips(const size_t seriesID,
119 const MathVector<ldim>* vPos,
120 const size_t numIP)
121{
122// check series id
123 if(seriesID >= num_series())
124 UG_THROW("Trying to set new ips for invalid seriesID "<<seriesID);
125
126// check that series is changeable
127 if(!m_vMayChange[seriesID])
128 UG_THROW("Local IP is not changable, but trying to set new ips.");
129
130// check, that dimension is ok.
131 if(m_locPosDim == -1) m_locPosDim = ldim;
132 else if(m_locPosDim != ldim)
133 UG_THROW("Local IP dimension conflict");
134
135// get local positions
136 std::vector<const MathVector<ldim>*>& vvIP = get_local_ips(Int2Type<ldim>());
137
138// check if still at same position and with same numIP. In that case the
139// positions have not changed. We have nothing to do
140 if(vvIP[seriesID] == vPos && m_vNumIP[seriesID] == numIP) return;
141
142// remember new positions and numIP
143 vvIP[seriesID] = vPos;
144 m_vNumIP[seriesID] = numIP;
145
146// invoke callback:
147// This callback is called, whenever the local_ip_series have changed. It
148// allows derived classes to react on this changes. For example, the data
149// linker must himself request local_ip_series from the data inputs of
150// the linker. In addition value fields and derivative fields must be adjusted
151// in UserData<TData, dim> etc.
152 local_ips_changed(seriesID, numIP);
153}
154
155template <int dim>
156void ICplUserData<dim>::set_time_point(const size_t seriesID,
157 const int timePointSpec)
158{
159// check series id
160 if(seriesID >= num_series())
161 UG_THROW("Trying to set new ips for invalid seriesID "<<seriesID);
162
163// check that series is changeable
164 if(!m_vMayChange[seriesID])
165 UG_THROW("Time point specification is not changable, but trying to set a new one.");
166
167// set the new time point specification (if it is not prescribed by the object)
168 m_vTimePoint[seriesID] = (m_defaultTimePoint >= 0)? m_defaultTimePoint : timePointSpec;
169
170//TODO: Should we call the callback here? (No data sizes are changed!)
171}
172
173template <int dim>
174template <int ldim>
176{
177// check, that dimension is ok.
178 if(m_locPosDim != ldim) UG_THROW("Local IP dimension conflict");
179
180 UG_ASSERT(s < num_series(), "Wrong series id");
181
182// NOTE: local ips may be NULL, if no ip position given, i.e. num_ip(s) == 0
183 return get_local_ips(Int2Type<ldim>())[s];
184}
185
186template <int dim>
187template <int ldim>
188const MathVector<ldim>& ICplUserData<dim>::local_ip(size_t s, size_t ip) const
189{
190// check, that dimension is ok.
191 if(m_locPosDim != ldim) UG_THROW("Local IP dimension conflict");
192
193 UG_ASSERT(s < num_series(), "Wrong series id");
194 UG_ASSERT(ip < num_ip(s), "Invalid index.");
195
196 return get_local_ips(Int2Type<ldim>())[s][ip];
197}
198
199template <int dim>
201{
202 UG_ASSERT(s < num_series(), "Wrong series id");
203
204 return m_vTimePoint[s];
205}
206
207template <int dim>
208size_t ICplUserData<dim>::time_point(size_t s) const
209{
210 UG_ASSERT(s < num_series(), "Wrong series id:" << s << ">=" << num_series());
211
212// size_t time_spec;
213// if ((time_spec = m_vTimePoint[s]) >= 0)
214 if (m_vTimePoint[s] >= 0)
215 return m_vTimePoint[s];
216 return m_timePoint;
217}
218
219template <int dim>
221{
222 UG_ASSERT(s < num_series(), "Wrong series id:" << s << ">=" << num_series());
223
224 int time_spec;
225 if ((time_spec = m_vTimePoint[s]) >= 0)
226 return ((size_t) time_spec) == m_timePoint;
227 return true;
228}
229
230template <int dim>
231void ICplUserData<dim>::set_global_ips(size_t s, const MathVector<dim>* vPos, size_t numIP)
232{
233 UG_ASSERT(s < num_series(), "Wrong series id: "<<s<<" (numSeries: "<<num_series()<<")");
234
235// check number of ips (must match local ip number)
236 if(numIP != num_ip(s))
237 UG_THROW("UserData::set_global_ips: Num Local IPs is " << num_ip(s)
238 << ", but trying to set Num Global IPs: " << numIP <<
239 " for series "<< s);
240
241// remember global positions
242 m_vvGlobPos[s] = vPos;
243
244// invoke callback:
245// this callback is called every time the global position changes. It gives
246// derived classes the possibility to react on this fact. E.g. the data
247// linker must forward the global positions to its own imports.
248 global_ips_changed(s, vPos, numIP);
249}
250
251template <int dim>
252inline void ICplUserData<dim>::check_s(size_t s) const
253{
254 UG_ASSERT(s < num_series(), "Wrong series id");
255 UG_ASSERT(s < m_vvGlobPos.size(), "Invalid index.");
256}
257
258template <int dim>
259inline void ICplUserData<dim>::check_s_ip(size_t s, size_t ip) const
260{
261 check_s(s);
262 UG_ASSERT(ip < num_ip(s), "Invalid index.");
263 UG_ASSERT(m_vvGlobPos[s] != NULL, "Global IP not set.");
264}
265
267// UserData
269
270template <typename TData, int dim, typename TRet>
273{
274 typedef std::pair<DataImport<TData,dim>*, CallbackFct> Pair;
275 // m_vCallback.push_back(Pair(obj,func));
276 m_vCallback.push_back(Pair(obj, std::bind(func, obj)));
277}
278
279template <typename TData, int dim, typename TRet>
282{
283 typedef typename std::vector<std::pair<DataImport<TData,dim>*, CallbackFct> > VecType;
284 typedef typename VecType::iterator iterator;
285 iterator iter = m_vCallback.begin();
286 while(iter != m_vCallback.end())
287 {
288 if((*iter).first == obj) iter = m_vCallback.erase(iter);
289 else ++iter;
290 }
291}
292
293template <typename TData, int dim, typename TRet>
296{
297 typedef typename std::vector<std::pair<DataImport<TData,dim>*, CallbackFct> > VecType;
298 typedef typename VecType::const_iterator iterator;
299 for(iterator iter = m_vCallback.begin(); iter != m_vCallback.end(); ++iter)
300 {
301 // (((*iter).first)->*((*iter).second))();
302 ((*iter).second)();
303 }
304}
305
306template <typename TData, int dim, typename TRet>
308{
309 UG_ASSERT(s < num_series(), "Wrong series id"<<s);
310 UG_ASSERT(s < m_vvValue.size(), "Invalid index "<<s);
311}
312
313template <typename TData, int dim, typename TRet>
314inline void CplUserData<TData,dim,TRet>::check_series_ip(size_t s, size_t ip) const
315{
316 check_series(s);
317 UG_ASSERT(ip < num_ip(s), "Invalid index "<<ip);
318 UG_ASSERT(ip < m_vvValue[s].size(), "Invalid index "<<ip);
319}
320
321template <typename TData, int dim, typename TRet>
323{
324 const size_t s = seriesID;
325
326// check, that only increasing the data, this is important to guarantee,
327// that the allocated memory pointer remain valid. They are used outside of
328// the class as well to allow fast access to the data.
329 if(s < m_vvValue.size())
330 UG_THROW("Decrease is not implemented. Series: "<<s<<
331 ", currNumSeries: "<<m_vvValue.size());
332
333// increase number of series if needed
334 m_vvValue.resize(s+1);
335 m_vvBoolFlag.resize(s+1);
336
337// allocate new storage
338 m_vvValue[s].resize(num_ip(s));
339 m_vvBoolFlag[s].resize(num_ip(s), true);
340 value_storage_changed(s);
341 call_storage_callback();
342
343// call base class callback
344 base_type::local_ip_series_added(seriesID);
345}
346
347template <typename TData, int dim, typename TRet>
349{
350// free the memory
351// clear all series
352 m_vvValue.clear();
353 m_vvBoolFlag.clear();
354
355// call base class callback (if implementation given)
356// base_type::local_ip_series_to_be_cleared();
357}
358
359template <typename TData, int dim, typename TRet>
360void CplUserData<TData,dim,TRet>::local_ips_changed(const size_t seriesID, const size_t newNumIP)
361{
362// resize only when more data is needed than actually allocated
363 if(newNumIP >= m_vvValue[seriesID].size())
364 {
365 // resize
366 m_vvValue[seriesID].resize(newNumIP);
367 m_vvBoolFlag[seriesID].resize(newNumIP, true);
368
369 // invoke callback
370 value_storage_changed(seriesID);
371 call_storage_callback();
372 }
373
374// call base class callback (if implementation given)
375// base_type::local_ips_changed(seriesID);
376}
377
379// DependentUserData
381
382template <typename TData, int dim>
384{
385 this->m_fctGrp.set_function_pattern(fctPatt);
386 extract_fct_grp();
387}
388
389template <typename TData, int dim>
391{
392 set_functions(std::string(symbFct));
393}
394
395template <typename TData, int dim>
396void DependentUserData<TData,dim>::set_functions(const std::string& symbFct)
397{
398 set_functions(TokenizeTrimString(symbFct));
399}
400
401template <typename TData, int dim>
402void DependentUserData<TData,dim>::set_functions(const std::vector<std::string>& symbFct)
403{
404 m_SymbFct = symbFct;
405 extract_fct_grp();
406}
407
408template <typename TData, int dim>
410{
411 // if associated infos missing return
412 ConstSmartPtr<FunctionPattern> spFctPatt = this->m_fctGrp.function_pattern();
413 if(spFctPatt.invalid()) return;
414
415 // if no function passed, clear functions
416 if(m_SymbFct.size() == 1 && m_SymbFct[0].empty()) m_SymbFct.clear();
417
418 // if functions passed with separator, but not all tokens filled, throw error
419 for(size_t i = 0; i < m_SymbFct.size(); ++i)
420 {
421 if(m_SymbFct.empty())
422 UG_THROW("Error while setting functions in a DependentUserData: passed "
423 "function string lacks a "
424 "function specification at position "<<i<<"(of "
425 <<m_SymbFct.size()-1<<")");
426 }
427
428 if(m_SymbFct.empty()){
429 this->m_fctGrp.clear();
430 return;
431 }
432
433 // create function group of this elem disc
434 try{
435 this->m_fctGrp.clear();
436 this->m_fctGrp.add(m_SymbFct);
437 }UG_CATCH_THROW("DependentUserData: Cannot find some symbolic function "
438 "name.");
439
440 // create a mapping between all functions and the function group of this
441 // element disc.
442 try{
443 CreateFunctionIndexMapping(this->m_map, this->m_fctGrp, spFctPatt);
444 }UG_CATCH_THROW("DependentUserData: Cannot create Function Index Mapping.");
445
446 this->check_setup();
447}
448
449template <typename TData, int dim>
451{
452// check size
453 const FunctionIndexMapping& map = this->map();
454 UG_ASSERT(map.num_fct() == this->num_fct(), "Number function mismatch.");
455
456// cache numFct and their numDoFs
457 m_vvNumDoFPerFct.resize(map.num_fct());
458 for(size_t fct = 0; fct < m_vvNumDoFPerFct.size(); ++fct)
459 m_vvNumDoFPerFct[fct] = ind.num_dof(map[fct]);
460
461 resize_deriv_array();
462}
463
464template <typename TData, int dim>
466{
467// resize num fct
468 for(size_t s = 0; s < m_vvvvDeriv.size(); ++s)
469 resize_deriv_array(s);
470}
471
472template <typename TData, int dim>
474{
475// resize ips
476 m_vvvvDeriv[s].resize(num_ip(s));
477
478 for(size_t ip = 0; ip < m_vvvvDeriv[s].size(); ++ip)
479 {
480 // resize num fct
481 m_vvvvDeriv[s][ip].resize(m_vvNumDoFPerFct.size());
482
483 // resize dofs
484 for(size_t fct = 0; fct < m_vvNumDoFPerFct.size(); ++fct)
485 m_vvvvDeriv[s][ip][fct].resize(m_vvNumDoFPerFct[fct]);
486 }
487}
488
489template <typename TData, int dim>
490void DependentUserData<TData,dim>::set_zero(std::vector<std::vector<TData> > vvvDeriv[], const size_t nip)
491{
492 for(size_t ip = 0; ip < nip; ++ip)
493 for(size_t fct = 0; fct < vvvDeriv[ip].size(); ++fct)
494 for(size_t sh = 0; sh < vvvDeriv[ip][fct].size(); ++sh)
495 {
496 vvvDeriv[ip][fct][sh] = 0.0;
497 }
498}
499
500template <typename TData, int dim>
501inline void DependentUserData<TData,dim>::check_s_ip(size_t s, size_t ip) const
502{
503 UG_ASSERT(s < this->num_series(), "Wrong series id"<<s);
504 UG_ASSERT(s < m_vvvvDeriv.size(), "Invalid index "<<s);
505 UG_ASSERT(ip < this->num_ip(s), "Invalid index "<<ip);
506 UG_ASSERT(ip < m_vvvvDeriv[s].size(), "Invalid index "<<ip);
507}
508
509template <typename TData, int dim>
510inline void DependentUserData<TData,dim>::check_s_ip_fct(size_t s, size_t ip, size_t fct) const
511{
512 check_s_ip(s,ip);
513 UG_ASSERT(fct < m_vvvvDeriv[s][ip].size(), "Invalid index.");
514}
515
516template <typename TData, int dim>
517inline void DependentUserData<TData,dim>::check_s_ip_fct_dof(size_t s, size_t ip, size_t fct, size_t dof) const
518{
519 check_s_ip_fct(s,ip,fct);
520 UG_ASSERT(dof < m_vvvvDeriv[s][ip][fct].size(), "Invalid index.");
521}
522
523template <typename TData, int dim>
525{
526// adjust data arrays
527 m_vvvvDeriv.resize(seriesID+1);
528
529// forward change signal to base class
530 base_type::local_ip_series_added(seriesID);
531}
532
533template <typename TData, int dim>
535{
536// adjust data arrays
537 m_vvvvDeriv.clear();
538
539// forward change signal to base class
540 base_type::local_ip_series_to_be_cleared();
541}
542
543template <typename TData, int dim>
544void DependentUserData<TData,dim>::local_ips_changed(const size_t seriesID, const size_t newNumIP)
545{
546 UG_ASSERT(seriesID < m_vvvvDeriv.size(), "wrong series id.");
547
548// resize only when more data is needed than actually allocated
549 if(newNumIP >= m_vvvvDeriv[seriesID].size())
550 resize_deriv_array(seriesID);
551
552// call base class callback (if implementation given)
553 base_type::local_ips_changed(seriesID, newNumIP);
554}
555
556} // end namespace ug
558#endif /* __H__UG__LIB_DISC__SPATIAL_DISC__USER_DATA__USER_DATA_IMPL__ */
parameterString s
Definition smart_pointer.h:296
bool invalid() const
returns true if the pointer is invalid, false if not.
Definition smart_pointer.h:421
void check_series(size_t s) const
checks in debug mode the correct index
Definition user_data_impl.h:307
void register_storage_callback(DataImport< TData, dim > *obj, void(DataImport< TData, dim >::*func)())
register external callback, invoked when data storage changed
Definition user_data_impl.h:272
std::vector< std::pair< DataImport< TData, dim > *, CallbackFct > > m_vCallback
Definition user_data.h:587
void call_storage_callback() const
calls are registered external storage callbacks
Definition user_data_impl.h:295
void check_series_ip(size_t s, size_t ip) const
checks in debug mode the correct index
Definition user_data_impl.h:314
virtual void local_ip_series_added(const size_t seriesID)
resizes the data field, when local ip changed signaled
Definition user_data_impl.h:322
virtual void local_ip_series_to_be_cleared()
free the data field memory and set series to zero
Definition user_data_impl.h:348
std::function< void()> CallbackFct
registered callbacks
Definition user_data.h:586
void unregister_storage_callback(DataImport< TData, dim > *obj)
register all callbacks registered by class
Definition user_data_impl.h:281
virtual void local_ips_changed(const size_t seriesID, const size_t newNumIP)
implement callback, called when local IPs changed
Definition user_data_impl.h:360
Data import.
Definition data_import.h:180
void resize_deriv_array()
resizes the derivative arrays for current number of ips.
Definition user_data_impl.h:465
virtual void local_ip_series_to_be_cleared()
implement callback, invoked when local ips are cleared
Definition user_data_impl.h:534
void extract_fct_grp()
extracts the function group
Definition user_data_impl.h:409
virtual void local_ip_series_added(const size_t seriesID)
resizes the derivative field when local ip change is signaled
Definition user_data_impl.h:524
void check_s_ip_fct(size_t s, size_t ip, size_t fct) const
checks in debug mode the correct usage of indices
Definition user_data_impl.h:510
static void set_zero(std::vector< std::vector< TData > > vvvDeriv[], const size_t nip)
sets all derivative values to zero
Definition user_data_impl.h:490
virtual void set_function_pattern(ConstSmartPtr< FunctionPattern > fctPatt)
sets the associated function pattern
Definition user_data_impl.h:383
virtual void update_dof_sizes(const LocalIndices &ind)
resize lin defect arrays
Definition user_data_impl.h:450
void check_s_ip_fct_dof(size_t s, size_t ip, size_t fct, size_t dof) const
checks in debug mode the correct usage of indices
Definition user_data_impl.h:517
void check_s_ip(size_t s, size_t ip) const
checks in debug mode the correct usage of indices
Definition user_data_impl.h:501
virtual void local_ips_changed(const size_t seriesID, const size_t newNumIP)
implement callback, called when local IPs changed
Definition user_data_impl.h:544
void set_functions(const char *symbFct)
Definition user_data_impl.h:390
describes a mapping between two local index sets
Definition function_group.h:186
size_t num_fct() const
returns the number of indices that are mapped
Definition function_group.h:195
std::vector< const MathVector< 2 > * > m_pvLocIP2d
Definition user_data.h:465
bool at_current_time(size_t s) const
returns true iff the time point specification is equal to the current one, or not specified
Definition user_data_impl.h:220
ICplUserData()
default constructor
Definition user_data_impl.h:46
void check_s(size_t s) const
checks in debug mode the correct usage of indices
Definition user_data_impl.h:252
const MathVector< ldim > * local_ips(size_t s) const
returns local ips
Definition user_data_impl.h:175
void clear()
clear all data
Definition user_data_impl.h:56
void set_local_ips(const size_t seriesId, const MathVector< ldim > *vPos, const size_t numIP)
sets new local ip positions for a local ip series
Definition user_data_impl.h:118
void set_time_point(size_t timePoint)
sets the current time point
Definition user_data.h:281
size_t time_point()
returns the current time point
Definition user_data.h:284
std::vector< const MathVector< 1 > * > m_pvLocIP1d
local ips of dimension 1d-3d
Definition user_data.h:464
std::vector< const MathVector< 3 > * > m_pvLocIP3d
Definition user_data.h:466
void check_s_ip(size_t s, size_t ip) const
checks in debug mode the correct usage of indices
Definition user_data_impl.h:259
std::vector< size_t > m_vNumIP
number of evaluation points (-1 indicates no ips set)
Definition user_data.h:458
std::vector< number > m_vTime
time for evaluation
Definition user_data.h:475
size_t register_local_ip_series(const MathVector< ldim > *vPos, const size_t numIP, const int timePointSpec, bool bMayChange=true)
set local positions, returns series id
Definition user_data_impl.h:70
void set_global_ips(size_t s, const MathVector< dim > *vPos, size_t numIP)
set global positions
Definition user_data_impl.h:231
int time_point_specification(size_t s) const
returns the time point specification (note: it may be -1, i.e. not specified)
Definition user_data_impl.h:200
const MathVector< ldim > & local_ip(size_t s, size_t ip) const
returns local ip
Definition user_data_impl.h:188
std::vector< bool > m_vMayChange
flags if local ips may change
Definition user_data.h:455
Definition local_algebra.h:50
size_t num_dof(size_t fct) const
number of dofs for accessible function
Definition local_algebra.h:117
a mathematical Vector with N entries.
Definition math_vector.h:97
#define UG_ASSERT(expr, msg)
Definition assert.h:70
#define UG_CATCH_THROW(msg)
Definition error.h:64
#define UG_THROW(msg)
Definition error.h:57
the ug namespace
void TokenizeTrimString(const string &str, vector< string > &vToken, const char delimiter)
Definition string_util.cpp:83
void CreateFunctionIndexMapping(FunctionIndexMapping &map, const FunctionGroup &grpFromSmall, const FunctionGroup &grpToLarge)
Definition groups_util.cpp:44
function func(x, y, z, t, si)
bool resize(size_t newRows, size_t newCols)
Definition metaprogramming_util.h:42