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__
47: m_locPosDim(-1), m_timePoint(0), m_defaultTimePoint(-1), m_si(-1)
58 local_ip_series_to_be_cleared();
62 m_pvLocIP1d.clear(); m_pvLocIP2d.clear(); m_pvLocIP3d.clear();
64 m_vTime.clear(); m_vTime.push_back(0.0);
72 const int timePointSpec,
76 if(m_locPosDim == -1) m_locPosDim = ldim;
77 else if(m_locPosDim != ldim)
78 UG_THROW(
"Local IP dimension conflict");
81 int theTimePoint = (m_defaultTimePoint >= 0)? m_defaultTimePoint : timePointSpec;
84 std::vector<const MathVector<ldim>*>& vvIP = get_local_ips(
Int2Type<ldim>());
88 if(!bMayChange && numIP != 0)
89 for(
size_t s = 0;
s < vvIP.size(); ++
s)
93 if(vvIP[
s] == vPos && m_vNumIP[
s] == numIP && m_vTimePoint[
s] == theTimePoint)
99 m_vNumIP.push_back(numIP);
100 m_vTimePoint.push_back(theTimePoint);
101 m_vMayChange.push_back(bMayChange);
109 local_ip_series_added(m_vNumIP.size() - 1);
112 return m_vNumIP.size() - 1;
123 if(seriesID >= num_series())
124 UG_THROW(
"Trying to set new ips for invalid seriesID "<<seriesID);
127 if(!m_vMayChange[seriesID])
128 UG_THROW(
"Local IP is not changable, but trying to set new ips.");
131 if(m_locPosDim == -1) m_locPosDim = ldim;
132 else if(m_locPosDim != ldim)
133 UG_THROW(
"Local IP dimension conflict");
136 std::vector<const MathVector<ldim>*>& vvIP = get_local_ips(
Int2Type<ldim>());
140 if(vvIP[seriesID] == vPos && m_vNumIP[seriesID] == numIP)
return;
143 vvIP[seriesID] = vPos;
144 m_vNumIP[seriesID] = numIP;
152 local_ips_changed(seriesID, numIP);
157 const int timePointSpec)
160 if(seriesID >= num_series())
161 UG_THROW(
"Trying to set new ips for invalid seriesID "<<seriesID);
164 if(!m_vMayChange[seriesID])
165 UG_THROW(
"Time point specification is not changable, but trying to set a new one.");
168 m_vTimePoint[seriesID] = (m_defaultTimePoint >= 0)? m_defaultTimePoint : timePointSpec;
178 if(m_locPosDim != ldim)
UG_THROW(
"Local IP dimension conflict");
180 UG_ASSERT(
s < num_series(),
"Wrong series id");
191 if(m_locPosDim != ldim)
UG_THROW(
"Local IP dimension conflict");
193 UG_ASSERT(
s < num_series(),
"Wrong series id");
202 UG_ASSERT(
s < num_series(),
"Wrong series id");
204 return m_vTimePoint[
s];
210 UG_ASSERT(
s < num_series(),
"Wrong series id:" <<
s <<
">=" << num_series());
214 if (m_vTimePoint[
s] >= 0)
215 return m_vTimePoint[
s];
222 UG_ASSERT(
s < num_series(),
"Wrong series id:" <<
s <<
">=" << num_series());
225 if ((time_spec = m_vTimePoint[
s]) >= 0)
226 return ((
size_t) time_spec) == m_timePoint;
233 UG_ASSERT(
s < num_series(),
"Wrong series id: "<<
s<<
" (numSeries: "<<num_series()<<
")");
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 <<
242 m_vvGlobPos[
s] = vPos;
248 global_ips_changed(
s, vPos, numIP);
254 UG_ASSERT(
s < num_series(),
"Wrong series id");
255 UG_ASSERT(
s < m_vvGlobPos.size(),
"Invalid index.");
263 UG_ASSERT(m_vvGlobPos[
s] != NULL,
"Global IP not set.");
270template <
typename TData,
int dim,
typename TRet>
274 typedef std::pair<DataImport<TData,dim>*,
CallbackFct> Pair;
279template <
typename TData,
int dim,
typename TRet>
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())
288 if((*iter).first == obj) iter = m_vCallback.erase(iter);
293template <
typename TData,
int dim,
typename TRet>
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)
306template <
typename TData,
int dim,
typename TRet>
310 UG_ASSERT(
s < m_vvValue.size(),
"Invalid index "<<
s);
313template <
typename TData,
int dim,
typename TRet>
317 UG_ASSERT(ip < num_ip(
s),
"Invalid index "<<ip);
318 UG_ASSERT(ip < m_vvValue[
s].size(),
"Invalid index "<<ip);
321template <
typename TData,
int dim,
typename TRet>
324 const size_t s = seriesID;
329 if(
s < m_vvValue.size())
330 UG_THROW(
"Decrease is not implemented. Series: "<<
s<<
331 ", currNumSeries: "<<m_vvValue.size());
334 m_vvValue.resize(
s+1);
335 m_vvBoolFlag.resize(
s+1);
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();
344 base_type::local_ip_series_added(seriesID);
347template <
typename TData,
int dim,
typename TRet>
353 m_vvBoolFlag.clear();
359template <
typename TData,
int dim,
typename TRet>
363 if(newNumIP >= m_vvValue[seriesID].size())
366 m_vvValue[seriesID].resize(newNumIP);
367 m_vvBoolFlag[seriesID].resize(newNumIP,
true);
370 value_storage_changed(seriesID);
371 call_storage_callback();
382template <
typename TData,
int dim>
385 this->m_fctGrp.set_function_pattern(fctPatt);
389template <
typename TData,
int dim>
392 set_functions(std::string(symbFct));
395template <
typename TData,
int dim>
401template <
typename TData,
int dim>
408template <
typename TData,
int dim>
413 if(spFctPatt.
invalid())
return;
416 if(m_SymbFct.size() == 1 && m_SymbFct[0].empty()) m_SymbFct.clear();
419 for(
size_t i = 0; i < m_SymbFct.size(); ++i)
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<<
")");
428 if(m_SymbFct.empty()){
429 this->m_fctGrp.clear();
435 this->m_fctGrp.clear();
436 this->m_fctGrp.add(m_SymbFct);
437 }
UG_CATCH_THROW(
"DependentUserData: Cannot find some symbolic function "
444 }
UG_CATCH_THROW(
"DependentUserData: Cannot create Function Index Mapping.");
449template <
typename TData,
int dim>
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]);
461 resize_deriv_array();
464template <
typename TData,
int dim>
468 for(
size_t s = 0;
s < m_vvvvDeriv.size(); ++
s)
469 resize_deriv_array(
s);
472template <
typename TData,
int dim>
476 m_vvvvDeriv[
s].resize(num_ip(
s));
478 for(
size_t ip = 0; ip < m_vvvvDeriv[
s].size(); ++ip)
481 m_vvvvDeriv[
s][ip].resize(m_vvNumDoFPerFct.size());
484 for(
size_t fct = 0; fct < m_vvNumDoFPerFct.size(); ++fct)
485 m_vvvvDeriv[
s][ip][fct].
resize(m_vvNumDoFPerFct[fct]);
489template <
typename TData,
int dim>
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)
496 vvvDeriv[ip][fct][sh] = 0.0;
500template <
typename TData,
int dim>
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);
509template <
typename TData,
int dim>
513 UG_ASSERT(fct < m_vvvvDeriv[
s][ip].size(),
"Invalid index.");
516template <
typename TData,
int dim>
519 check_s_ip_fct(
s,ip,fct);
520 UG_ASSERT(dof < m_vvvvDeriv[
s][ip][fct].size(),
"Invalid index.");
523template <
typename TData,
int dim>
527 m_vvvvDeriv.resize(seriesID+1);
530 base_type::local_ip_series_added(seriesID);
533template <
typename TData,
int dim>
540 base_type::local_ip_series_to_be_cleared();
543template <
typename TData,
int dim>
546 UG_ASSERT(seriesID < m_vvvvDeriv.size(),
"wrong series id.");
549 if(newNumIP >= m_vvvvDeriv[seriesID].size())
550 resize_deriv_array(seriesID);
553 base_type::local_ips_changed(seriesID, newNumIP);
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
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