33#ifndef __H__UG__LIB_DISC__SPATIAL_DISC__DATA_IMPORT_IMPL__
34#define __H__UG__LIB_DISC__SPATIAL_DISC__DATA_IMPORT_IMPL__
44template <
typename TData,
int dim>
47 if(data_given()) m_spUserData->unregister_storage_callback(
this);
50template <
typename TData,
int dim>
54 UG_THROW(
"DataImport::set_roid: Setting unknown ReferenceObjectId.");
59template <
typename TData,
int dim>
63 if(!this->m_bCompLinDefect)
return;
66 UG_THROW(
"DataImport::check_setup: The reference element "
67 "type has not been set for evaluation.");
70 if(m_vLinDefectFunc[m_id] != NULL)
74 UG_THROW(
"DataImport::check_setup: No evaluation function for computation of "
75 "linearized defect registered for "<<m_id<<
", but required. "
76 "(world dim: "<<dim<<
", part: "<<this->part()<<
")");
79template <
typename TData,
int dim>
80template <
typename TClass>
85 std::vector<
std::vector<TData> > vvvLinDefect[],
89 UG_THROW(
"Reference Object id invalid: "<<
id);
92 std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
95template <
typename TData,
int dim>
100 std::vector<std::vector<TData> > vvvLinDefect[],
104 UG_THROW(
"Reference Object id invalid: "<<
id);
106 m_vLinDefectFunc[id] =
func;
109template <
typename TData,
int dim>
113 m_vLinDefectFunc[i] = NULL;
117template <
typename TData,
int dim>
121 m_spUserData = spData;
124 this->m_spICplUserData = spData;
127 m_spDependentUserData = m_spUserData.template cast_dynamic<DependentUserData<TData, dim> >();
130template <
typename TData,
int dim>
134 m_vValue = m_spUserData->values(m_seriesID);
137 m_numIP = m_spUserData->num_ip(m_seriesID);
140template <
typename TData,
int dim>
146 if(!data_given())
return;
151 m_seriesID = m_spUserData->template
152 register_local_ip_series<ldim>(vPos,numIP,timePointSpec,bMayChange);
161 resize_defect_array();
164 UG_ASSERT(m_numIP == numIP,
"Different number of ips than requested.");
169 UG_THROW(
"DataImport: Setting different local ips to non-changable ip series.");
172 m_spUserData->template set_local_ips<ldim>(m_seriesID,vPos,numIP);
173 m_spUserData->set_time_point(m_seriesID,timePointSpec);
181 resize_defect_array();
185 UG_ASSERT(m_numIP == numIP,
"Different number of ips than requested.");
189template <
typename TData,
int dim>
193 set_local_ips<dim>(vPos, numIP, timePointSpec, bMayChange);
196template <
typename TData,
int dim>
201 set_local_ips<ldim>(vPos, numIP, -1, bMayChange);
204template <
typename TData,
int dim>
208 set_local_ips<dim>(vPos, numIP, -1, bMayChange);
211template <
typename TData,
int dim>
214 m_spUserData->set_time_point(m_seriesID,timePointSpec);
217template <
typename TData,
int dim>
221 if(!data_given())
return;
224 UG_ASSERT(m_seriesID >= 0,
"Wrong series id.");
225 m_spUserData->set_global_ips(m_seriesID,vPos,numIP);
228template <
typename TData,
int dim>
231 if(data_given()) m_spUserData->unregister_storage_callback(
this);
235 m_vvvLinDefect.resize(num_ip());
238template <
typename TData,
int dim>
241 UG_ASSERT(m_spDependentUserData.valid(),
"No Export set.");
244 if (! m_spUserData->at_current_time (m_seriesID))
251 for(
size_t ip = 0; ip < num_ip(); ++ip)
254 for(
size_t fct1 = 0; fct1 < this->num_fct(); ++fct1)
255 for(
size_t fct2 = 0; fct2 < m_spDependentUserData->num_fct(); ++fct2)
258 const TData* LinDef = lin_defect(ip, fct1);
259 const TData* Deriv = m_spDependentUserData->deriv(m_seriesID, ip, fct2);
262 for(
size_t sh1 = 0; sh1 < num_sh(fct1); ++sh1)
263 for(
size_t sh2 = 0; sh2 < m_spDependentUserData->num_sh(fct2); ++sh2)
265 J(fct1, sh1, fct2, sh2) += scale*(LinDef[sh1]*Deriv[sh2]);
271template <
typename TData,
int dim>
280 for(
size_t fct = 0; fct < m_vvNumDoFPerFct.size(); ++fct)
281 m_vvNumDoFPerFct[fct] = ind.
num_dof(map[fct]);
283 m_vvvLinDefect.clear();
284 resize_defect_array();
287template <
typename TData,
int dim>
292 const size_t oldSize = m_vvvLinDefect.size();
295 m_vvvLinDefect.resize(num_ip());
298 for(
size_t ip = oldSize; ip < num_ip(); ++ip)
301 m_vvvLinDefect[ip].resize(m_vvNumDoFPerFct.size());
304 for(
size_t fct = 0; fct < m_vvNumDoFPerFct.size(); ++fct)
305 m_vvvLinDefect[ip][fct].
resize(m_vvNumDoFPerFct[fct]);
309template <
typename TData,
int dim>
313 UG_ASSERT(ip < m_vvvLinDefect.size(),
"Invalid index.");
314 UG_ASSERT(fct < m_vvvLinDefect[ip].size(),
"Invalid index.");
317template <
typename TData,
int dim>
320 check_ip_fct(ip, fct);
321 UG_ASSERT(sh < m_vvvLinDefect[ip][fct].size(),
"Invalid index.");
324template <
typename TData,
int dim>
327 UG_ASSERT(ip < m_numIP,
"Invalid index.");
330template <
typename TData,
int dim>
333 UG_ASSERT(m_vValue != NULL,
"Data Value field not set.");
Definition smart_pointer.h:107
Type based UserData.
Definition user_data.h:502
Data import.
Definition data_import.h:180
void add_jacobian(LocalMatrix &J, const number scale)
compute jacobian for derivative w.r.t. non-system owned unknowns
Definition data_import_impl.h:239
virtual void clear_ips()
removes the positions
Definition data_import_impl.h:229
void check_ip(size_t ip) const
checks in debug mode the correct index
Definition data_import_impl.h:325
virtual void update_dof_sizes(const LocalIndices &ind)
resize lin defect arrays
Definition data_import_impl.h:272
void clear_fct()
clear all evaluation functions
Definition data_import_impl.h:110
virtual void set_roid(ReferenceObjectID id)
sets the geometric object type
Definition data_import_impl.h:51
void set_data(SmartPtr< CplUserData< TData, dim > > spData)
set the user data
Definition data_import_impl.h:118
~DataImport()
Destructor.
Definition data_import_impl.h:45
LinDefectFunc m_vLinDefectFunc[NUM_REFERENCE_OBJECTS]
function pointers for all elem types
Definition data_import.h:381
void set_global_ips(const MathVector< dim > *vPos, size_t numIP)
sets the global positions
Definition data_import_impl.h:218
void cache_data_access()
caches data access
Definition data_import_impl.h:131
void resize_defect_array()
resizes the lin defect arrays for current number of ips.
Definition data_import_impl.h:288
void check_ip_fct_sh(size_t ip, size_t fct, size_t sh) const
checks in debug mode the correct index
Definition data_import_impl.h:318
void set_fct(ReferenceObjectID id, TClass *obj, void(TClass::*func)(const LocalVector &u, std::vector< std::vector< TData > > vvvLinDefect[], const size_t nip))
register evaluation of linear defect for a element
Definition data_import_impl.h:83
virtual void check_setup()
checks if ready for evaluation
Definition data_import_impl.h:60
void set_local_ips(const MathVector< ldim > *vPos, size_t numIP, int timePointSpec, bool bMayChange=true)
set the local integration points
Definition data_import_impl.h:142
void check_values() const
checks in debug mode the correct index
Definition data_import_impl.h:331
void check_ip_fct(size_t ip, size_t fct) const
checks in debug mode the correct index
Definition data_import_impl.h:310
void set_time_point(int timePointSpec)
set the time point specification
Definition data_import_impl.h:212
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
Definition local_algebra.h:50
size_t num_dof(size_t fct) const
number of dofs for accessible function
Definition local_algebra.h:117
Definition local_algebra.h:422
void access_by_map(const FunctionIndexMapping &funcMap)
access only part of the functions using mapping (restrict functions)
Definition local_algebra.h:538
Definition local_algebra.h:198
a mathematical Vector with N entries.
Definition math_vector.h:97
#define UG_ASSERT(expr, msg)
Definition assert.h:70
#define UG_THROW(msg)
Definition error.h:57
double number
Definition types.h:124
Definition smart_pointer.h:817
ReferenceObjectID
these ids are used to identify the shape of a geometric object.
Definition grid_base_objects.h:74
@ NUM_REFERENCE_OBJECTS
Definition grid_base_objects.h:85
@ ROID_UNKNOWN
Definition grid_base_objects.h:75
function func(x, y, z, t, si)
bool resize(size_t newRows, size_t newCols)