waves
Basic FE playground
MaterialsList.h
Go to the documentation of this file.
1 #ifndef KATOPTRON_MATERIALSLIST_H
2 #define KATOPTRON_MATERIALSLIST_H
3 
4 #include "Stokhos_Sacado_Kokkos_MP_Vector.hpp"
5 
6 #include "katoptron.h"
7 
8 #include "Map.h"
9 #include "wProblem.h"
10 #include "wTag.h"
11 #include "wMshData.h"
12 #include "wElement.h"
13 #include "wNode.h"
14 #include "wMedium.h"
15 
16 #include "Material.h"
17 
18 #include <Kokkos_Core.hpp>
19 //#include "Sacado.hpp"
20 
21 #include <Tpetra_Map.hpp>
22 #include <Tpetra_Vector.hpp>
23 #include <Teuchos_RCP.hpp>
24 #include <Kokkos_ViewFactory.hpp>
25 #include <vector>
26 
27 #include "EnsembleTraits.h"
28 
29 namespace katoptron
30 {
31 
35 template <typename scalar>
37 {
38 private:
39  Kokkos::View<scalar ***, Kokkos::LayoutRight> materials;
40 
42 
43 public:
49 
50  MaterialsList(Problem &pbl, Teuchos::RCP<Map> map);
51 
52  Material<scalar> getMaterial(int current_material, int i_thread);
53 };
54 
66 template <typename scalar>
67 MaterialsList<scalar>::MaterialsList(Problem &pbl, Teuchos::RCP<Map> map)
68 {
69  materials_number = pbl.media.size();
70 
71  materials_T = 0;
72  materials_E = 1;
73  materials_nu = 2;
74  materials_k = 3;
75  materials_beta = 4;
76 
77  typedef EnsembleTraits<scalar> ET;
78  const int ensemble_size = ET::size;
79 
80  materials = Kokkos::View<scalar ***, Kokkos::LayoutRight>("R", materials_number, 1, 5);
81  for (auto i = 0; i < materials_number; ++i)
82  {
83  materials(i, 0, materials_T) = (scalar)0; // !!! needed to be changed latter on !!!
84  for (int j = 0; j < ensemble_size; ++j)
85  {
86  ET::coeff(materials(i, 0, materials_E), j) = (double)pbl.media[i]->E_vector[j];
87  ET::coeff(materials(i, 0, materials_nu), j) = (double)pbl.media[i]->nu_vector[j];
88  ET::coeff(materials(i, 0, materials_k), j) = (double)pbl.media[i]->k_vector[j];
89  ET::coeff(materials(i, 0, materials_beta), j) = (double)pbl.media[i]->beta_vector[j];
90  }
91  materials(i, 0, materials_k) = (scalar)pbl.media[i]->k;
92  materials(i, 0, materials_beta) = (scalar)pbl.media[i]->beta;
93  }
94 }
95 
105 template <typename scalar>
106 Material<scalar> MaterialsList<scalar>::getMaterial(int current_material, int i_thread)
107 {
108  scalar E;
109  scalar nu;
110  scalar k;
111  scalar beta;
112 
113  size_t materials_T = 0;
114 
115  typedef EnsembleTraits<scalar> ET;
116  const int ensemble_size = ET::size;
117 
118  for (int j = 0; j < ensemble_size; ++j)
119  {
120  typename ET::value_type Tj = 0.;
121 
122  size_t index_0 = 0;
123  size_t index_1 = materials.extent(1) - 1;
124 
125  if (Tj <= ET::coeff(materials(current_material, index_0, materials_T), j))
126  {
127  ET::coeff(E, j) = ET::coeff(materials(current_material, index_0, 1), j);
128  ET::coeff(nu, j) = ET::coeff(materials(current_material, index_0, 2), j);
129  ET::coeff(k, j) = ET::coeff(materials(current_material, index_0, 3), j);
130  ET::coeff(beta, j) = ET::coeff(materials(current_material, index_0, 4), j);
131  }
132  else if (Tj > ET::coeff(materials(current_material, index_1, materials_T), j))
133  {
134  ET::coeff(E, j) = ET::coeff(materials(current_material, index_1, 1), j);
135  ET::coeff(nu, j) = ET::coeff(materials(current_material, index_1, 2), j);
136  ET::coeff(k, j) = ET::coeff(materials(current_material, index_1, 3), j);
137  ET::coeff(beta, j) = ET::coeff(materials(current_material, index_1, 4), j);
138  }
139  else
140  {
141  while (index_1 != index_0 + 1)
142  {
143  size_t index_c = index_0 + (index_1 - index_0) / 2;
144 
145  if (Tj == ET::coeff(materials(current_material, index_c, materials_T), j))
146  {
147  index_1 = index_c;
148  index_0 = index_1 - 1;
149  }
150  else if (Tj < ET::coeff(materials(current_material, index_c, materials_T), j))
151  index_1 = index_c;
152  else
153  index_0 = index_c;
154  }
155 
156  double coeff = (Tj - ET::coeff(materials(current_material, index_0, materials_T), j)) / (ET::coeff(materials(current_material, index_1, materials_T), j) - ET::coeff(materials(current_material, index_0, materials_T), j));
157 
158  ET::coeff(E, j) = ET::coeff(materials(current_material, index_0, 1), j) + coeff * (ET::coeff(materials(current_material, index_1, 1), j) - ET::coeff(materials(current_material, index_0, 1), j));
159  ET::coeff(nu, j) = ET::coeff(materials(current_material, index_0, 2), j) + coeff * (ET::coeff(materials(current_material, index_1, 2), j) - ET::coeff(materials(current_material, index_0, 2), j));
160  ET::coeff(k, j) = ET::coeff(materials(current_material, index_0, 3), j) + coeff * (ET::coeff(materials(current_material, index_1, 3), j) - ET::coeff(materials(current_material, index_0, 3), j));
161  ET::coeff(beta, j) = ET::coeff(materials(current_material, index_0, 4), j) + coeff * (ET::coeff(materials(current_material, index_1, 4), j) - ET::coeff(materials(current_material, index_0, 4), j));
162  }
163  }
164 
165  Material<scalar> material(E, nu, k, beta);
166  return material;
167 }
168 }; // namespace katoptron
169 
170 #endif //KATOPTRON_MATERIALSLIST_H
wProblem.h
katoptron::Map::local_ordinal_type
int local_ordinal_type
Definition: Map.h:27
katoptron::Problem::media
std::vector< Medium * > media
Materials.
Definition: wProblem.h:26
katoptron::MaterialsList::materials_beta
Map::local_ordinal_type materials_beta
Definition: MaterialsList.h:48
katoptron::MaterialsList::materials_nu
Map::local_ordinal_type materials_nu
Definition: MaterialsList.h:46
wMedium.h
katoptron::Material
Class which includes all constitutive values of a given material.
Definition: Material.h:26
katoptron::MaterialsList::materials_k
Map::local_ordinal_type materials_k
Definition: MaterialsList.h:47
Material.h
katoptron::MaterialsList::materials
Kokkos::View< scalar ***, Kokkos::LayoutRight > materials
Definition: MaterialsList.h:39
katoptron::MaterialsList::getMaterial
Material< scalar > getMaterial(int current_material, int i_thread)
Return a Material.
Definition: MaterialsList.h:106
EnsembleTraits
Definition: EnsembleTraits.h:8
katoptron
katoptron namespace
Definition: Algebraic.h:18
katoptron::MaterialsList
Class which stores the list of the used materials.
Definition: MaterialsList.h:36
katoptron::MaterialsList::materials_E
Map::local_ordinal_type materials_E
Definition: MaterialsList.h:45
katoptron::MaterialsList::materials_T
Map::local_ordinal_type materials_T
Definition: MaterialsList.h:44
EnsembleTraits.h
katoptron::Problem
Class which is used to specify in Python the thermomechanical to solve.
Definition: wProblem.h:19
katoptron.h
katoptron::MaterialsList::materials_number
Map::local_ordinal_type materials_number
Definition: MaterialsList.h:41
katoptron::MaterialsList::MaterialsList
MaterialsList(Problem &pbl, Teuchos::RCP< Map > map)
MaterialsList constructor.
Definition: MaterialsList.h:67
Map.h