Plugins
Loading...
Searching...
No Matches
subset_user_data.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2025 Gesellschaft fuer Anlagen- und Reaktorsicherheit gGmbH
3 * SPDX-License-Identifier: EUPL-1.2
4 * SPDX-FileContributor: Julian Hilbert
5 * SPDX-FileContributor: Goethe Universität Frankfurt
6 * SPDX-FileType: SOURCE
7 *
8 * This file is part of d3f++.
9 * d3f++ is an extension for UG4. Licensing information and citation requirements of UG4 are provided in LICENSES/UG4-LGPL_2.1
10 */
11
12
13#ifndef SUBSET_USER_DATA_H
14#define SUBSET_USER_DATA_H
17
18namespace ug{
19
20
21template <typename TData, typename TDomain, typename TRet = TData>
22class SubsetUserData: public StdDataLinker<SubsetUserData<TData, TDomain, TRet>, TRet, TDomain::dim> {
23 public:
24 static const int dim = TDomain::dim;
28
29
31 m_sp_domain = domain;
32 }
33 void insert(SmartPtr<TUserData> data, size_t index ){
34
35
36
37 m_sp_data.push_back(data);
40
41
42 base_type::set_input(m_index_map[index], data, data);
43
44 }
45
46
47
48 inline void evaluate (TData& value,
49 const MathVector<dim>& globIP,
50 number time, int si) const
51 {
52
53 (*m_sp_data[m_index_map.at(si)])(value, globIP, time, si);
54
55
56 }
57
58 template <int refDim>
59 inline void evaluate(TData vValue[],
60 const MathVector<dim> vGlobIP[],
61 number time, int si,
62 GridObject* elem,
63 const MathVector<dim> vCornerCoords[],
64 const MathVector<refDim> vLocIP[],
65 const size_t nip,
66 LocalVector* u,
67 const MathMatrix<refDim, dim>* vJT = NULL) const {
68
69 int elem_si = m_sp_domain->subset_handler()->get_subset_index(elem);
70
71
72 (*m_sp_data[m_index_map.at(elem_si)])(vValue, vGlobIP, time, si,
73 elem, vCornerCoords,
74 vLocIP, nip, u,vJT);
75
76 }
77 template <int refDim>
78 void eval_and_deriv(TData vValue[],
79 const MathVector<dim> vGlobIP[],
80 number time, int si,
81 GridObject* elem,
82 const MathVector<dim> vCornerCoords[],
83 const MathVector<refDim> vLocIP[],
84 const size_t nip,
85 LocalVector* u,
86 bool bDeriv,
87 int s,
88 std::vector<std::vector<TData> > vvvDeriv[],
89 const MathMatrix<refDim, dim>* vJT = NULL) const
90 {
91 int elem_si = m_sp_domain->subset_handler()->get_subset_index(elem);
92 (*m_sp_data[m_index_map.at(elem_si)])(vValue, vGlobIP, time, si,
93 elem, vCornerCoords,
94 vLocIP, nip, u,vJT);
95
96 this->set_zero(vvvDeriv, nip);
97
98 if(!m_sp_data[m_index_map.at(elem_si)]->zero_derivative())
99 {
100 for(size_t ip = 0; ip < nip; ++ip)
101 {
102 // loop functions
103 for(size_t fct = 0; fct < m_sp_data[m_index_map.at(elem_si)]->num_fct(); ++fct)
104 {
105 // get common fct id for this function
106 const size_t commonFct = this->input_common_fct(elem_si, fct);
107
108 // loop dofs
109 for(size_t sh = 0; sh < this->num_sh(fct); ++sh)
110 {
112 mult_add(vvvDeriv[ip][commonFct][sh],(m_sp_data[m_index_map.at(elem_si)].template cast_dynamic<DependentUserData<TData, dim>>())->deriv(this->series_id(si, s), ip, fct, sh), 1.0);
113
114 }
115 }
116 }
117 }
118 }
119 private:
120 std::map<int, int> m_index_map;
121 std::vector<SmartPtr<TUserData > > m_sp_data;
123};
124
125
126}
127#endif //SUBSET_USER_DATA_H
parameterString s
Definition Biogas.lua:2
TData & value(size_t s, size_t ip)
number time() const
const MathVector< dim > & ip(size_t s, size_t ip) const
void set_num_input(size_t num)
virtual size_t num_input() const
size_t input_common_fct(size_t i, size_t fct) const
virtual void set_input(size_t i, SmartPtr< ICplUserData< dim > > input, SmartPtr< UserDataInfo > info)
Definition subset_user_data.h:22
void evaluate(TData vValue[], const MathVector< dim > vGlobIP[], number time, int si, GridObject *elem, const MathVector< dim > vCornerCoords[], const MathVector< refDim > vLocIP[], const size_t nip, LocalVector *u, const MathMatrix< refDim, dim > *vJT=NULL) const
Definition subset_user_data.h:59
SmartPtr< TDomain > m_sp_domain
Definition subset_user_data.h:122
static const int dim
Definition subset_user_data.h:24
CplUserData< TData, dim > TUserData
Definition subset_user_data.h:25
std::map< int, int > m_index_map
Definition subset_user_data.h:120
void insert(SmartPtr< TUserData > data, size_t index)
Definition subset_user_data.h:33
void set_domain(SmartPtr< TDomain > domain)
Definition subset_user_data.h:30
StdDataLinker< SubsetUserData< TData, TDomain, TRet >, TRet, dim > base_type
Definition subset_user_data.h:26
void eval_and_deriv(TData vValue[], const MathVector< dim > vGlobIP[], number time, int si, GridObject *elem, const MathVector< dim > vCornerCoords[], const MathVector< refDim > vLocIP[], const size_t nip, LocalVector *u, bool bDeriv, int s, std::vector< std::vector< TData > > vvvDeriv[], const MathMatrix< refDim, dim > *vJT=NULL) const
Definition subset_user_data.h:78
void evaluate(TData &value, const MathVector< dim > &globIP, number time, int si) const
Definition subset_user_data.h:48
SubsetUserData()
Definition subset_user_data.h:27
std::vector< SmartPtr< TUserData > > m_sp_data
Definition subset_user_data.h:121
size_t num_fct() const
double number
static void mult_add(TData &out, const TData &in1, const TDataIn &s)