KratosMultiphysics
KRATOS Multiphysics (Kratos) is a framework for building parallel, multi-disciplinary simulation software, aiming at modularity, extensibility, and high performance. Kratos is written in C++, and counts with an extensive Python interface.
nurbs_volume_refinement_utilities.h
Go to the documentation of this file.
1 // | / |
2 // ' / __| _` | __| _ \ __|
3 // . \ | ( | | ( |\__ `
4 // _|\_\_| \__,_|\__|\___/ ____/
5 // Multi-Physics
6 //
7 // License: BSD License
8 // Kratos default license: kratos/license.txt
9 //
10 // Main authors: Manuel Messmer
11 //
12 
13 #if !defined(KRATOS_NURBS_VOLUME_REFINEMENT_UTILITIES_H_INCLUDED )
14 #define KRATOS_NURBS_VOLUME_REFINEMENT_UTILITIES_H_INCLUDED
15 
16 // System includes
17 
18 // External includes
19 
20 // Project includes
22 #include "nurbs_utilities.h"
23 #include "includes/node.h"
24 
25 namespace Kratos {
26 
28 {
29 public:
32 
33  typedef std::size_t IndexType;
34  typedef std::size_t SizeType;
35  typedef Node NodeType;
36 
38  typedef typename NurbsVolumeGeometryType::Pointer NurbsVolumeGeometryPointerType;
39 
43 
54  static void KnotRefinementU(NurbsVolumeGeometryType& rGeometry, std::vector<double>& rKnotsUToInsert,
55  PointerVector<NodeType>& rPointsRefined, Vector& rKnotsURefined ){
56 
57  // Sort the knots which are to be inserted!
58  std::sort(rKnotsUToInsert.begin(),rKnotsUToInsert.end());
59  // Get current order
60  const SizeType polynomial_degree_u = rGeometry.PolynomialDegreeU();
61 
62  // Get current knot information
63  const Kratos::Vector& old_knots_u = rGeometry.KnotsU();
64 
65  const SizeType old_num_of_knots_u = rGeometry.NumberOfKnotsU();
66  // Get current cp's information
67  const SizeType old_num_of_cp_u = rGeometry.NumberOfControlPointsU();
68  const SizeType old_num_of_cp_v = rGeometry.NumberOfControlPointsV();
69  const SizeType old_num_of_cp_w = rGeometry.NumberOfControlPointsW();
70 
71  // Get current span's
72  SizeType a = NurbsUtilities::GetLowerSpan(polynomial_degree_u, old_knots_u, rKnotsUToInsert.front());
73  SizeType b = NurbsUtilities::GetLowerSpan(polynomial_degree_u, old_knots_u, rKnotsUToInsert.back()) + 1;
74 
75  SizeType r = rKnotsUToInsert.size();
76  // Initialize new containers
77  SizeType new_num_of_knots_u = old_num_of_knots_u + r;
78  rKnotsURefined.resize(new_num_of_knots_u);
79 
80  SizeType new_num_of_cp_u = old_num_of_cp_u + r;
81  rPointsRefined.resize(new_num_of_cp_u*old_num_of_cp_v*old_num_of_cp_w);
82 
83  r = r - 1;
84  // Create new ordered knot vector.
85  for( IndexType i = 0; i <= a; i++)
86  rKnotsURefined[i] = old_knots_u[i];
87  for( IndexType i = b+polynomial_degree_u; i < old_num_of_knots_u; ++i)
88  rKnotsURefined[i+r+1] = old_knots_u[i];
89 
90  // Copy unaltered cp's.
91  for( IndexType column=0; column < old_num_of_cp_v; ++column){
92  for( IndexType depth=0; depth < old_num_of_cp_w; ++depth){
93  // Copy unaltered control points.
94  // Note: The "+1" accounts for the fact that first and last knots only appear "p"-times (and not "p+1"-times).
95  for( IndexType i = 0; i <= a - polynomial_degree_u + 1; ++i){
97  new_num_of_cp_u, old_num_of_cp_v, old_num_of_cp_w, i, column, depth);
99  old_num_of_cp_u, old_num_of_cp_v, old_num_of_cp_w, i, column, depth);
100  rPointsRefined(cp_index_left) = Kratos::make_intrusive<NodeType>(0, rGeometry[cp_index_right]);
101  }
102  // Note: The "+1" accounts for the fact that first and last knots only appear "p"-times (and not "p+1"-times).
103  for( IndexType i = b; i < old_num_of_cp_u; ++i){
105  new_num_of_cp_u, old_num_of_cp_v, old_num_of_cp_w, i+r+1, column, depth);
107  old_num_of_cp_u, old_num_of_cp_v, old_num_of_cp_w, i, column, depth);
108  rPointsRefined(cp_index_left) = Kratos::make_intrusive<NodeType>(0, rGeometry[cp_index_right]);
109  }
110  }
111  }
112 
113  // Find new CP's
114  const SizeType p = polynomial_degree_u;
115  int i = b + p - 1;
116  int k = b + p + r;
117  for( int j = r; j >= 0; j--){
118  while( rKnotsUToInsert[j] <= old_knots_u[i] && i > static_cast<int>(a) ){
119  for( IndexType column=0; column < old_num_of_cp_v; ++column) {
120  for( IndexType depth=0; depth < old_num_of_cp_w; ++depth) {
121  // Note: The "+1" accounts for the fact that first and last knots only appear "p"-times (and not "p+1"-times).
122  // Also keep attention to the first argument. The left index is mapped to new_num_of_cp_u, but the right index is mapped
123  // to old_num_of_cp_u.
125  new_num_of_cp_u, old_num_of_cp_v, old_num_of_cp_w, k-p-1+1, column, depth);
127  old_num_of_cp_u, old_num_of_cp_v, old_num_of_cp_w, i-p-1+1, column, depth);
128  rPointsRefined(cp_index_left) = Kratos::make_intrusive<NodeType>(0, rGeometry[cp_index_right]);
129  }
130  }
131  rKnotsURefined[k] = old_knots_u[i];
132  k--;
133  i--;
134  }
135  for( IndexType column=0; column < old_num_of_cp_v; ++column) {
136  for( IndexType depth=0; depth < old_num_of_cp_w; ++depth) {
137  // Note: The "+1" accounts for the fact that first and last knots only appear "p"-times (and not "p+1"-times).
139  new_num_of_cp_u, old_num_of_cp_v, old_num_of_cp_w, k-p-1+1, column, depth);
141  new_num_of_cp_u, old_num_of_cp_v, old_num_of_cp_w, k-p+1, column, depth);
142  rPointsRefined(cp_index_left) = rPointsRefined(cp_index_right);
143  }
144  }
145  for( IndexType l=1; l <= p; ++l){
146  IndexType index = k - p + l;
147  double alpha = rKnotsURefined[k+l] - rKnotsUToInsert[j];
148  if( std::abs(alpha) < 1e-10){
149  for( IndexType column=0; column < old_num_of_cp_v; ++column) {
150  for( IndexType depth=0; depth < old_num_of_cp_w; ++depth) {
151  // Note: The "+1" accounts for the fact that first and last knots only appear "p"-times (and not "p+1"-times).
153  new_num_of_cp_u, old_num_of_cp_v, old_num_of_cp_w, index-1+1, column, depth);
155  new_num_of_cp_u, old_num_of_cp_v, old_num_of_cp_w, index+1, column, depth);
156  rPointsRefined(cp_index_left) = rPointsRefined(cp_index_right);
157  }
158  }
159  }
160  else {
161  alpha = alpha / ( rKnotsURefined[k+l] - old_knots_u[i-p+l]);
162  for( IndexType column=0; column < old_num_of_cp_v; ++column) {
163  for( IndexType depth=0; depth < old_num_of_cp_w; ++depth) {
164  // Note: The "+1" accounts for the fact that first and last knots only appear "p"-times (and not "p+1"-times).
166  new_num_of_cp_u, old_num_of_cp_v, old_num_of_cp_w, index-1+1, column, depth);
168  new_num_of_cp_u, old_num_of_cp_v, old_num_of_cp_w, index+1, column, depth);
169 
170  double x = alpha * rPointsRefined[cp_index_minus][0] + (1.0-alpha) * rPointsRefined[cp_index][0];
171  double y = alpha * rPointsRefined[cp_index_minus][1] + (1.0-alpha) * rPointsRefined[cp_index][1];
172  double z = alpha * rPointsRefined[cp_index_minus][2] + (1.0-alpha) * rPointsRefined[cp_index][2];
173 
174  rPointsRefined(cp_index_minus) = Kratos::make_intrusive<NodeType>(0, x, y, z);
175  }
176  }
177  }
178  }
179  rKnotsURefined[k] = rKnotsUToInsert[j];
180  k -= 1;
181  }
182  }
183 
194  static void KnotRefinementV(NurbsVolumeGeometryType& rGeometry, std::vector<double>& rKnotsVToInsert,
195  PointerVector<NodeType>& rPointsRefined, Vector& rKnotsVRefined ){
196 
197  // Sort the knots which are to be inserted!
198  std::sort(rKnotsVToInsert.begin(),rKnotsVToInsert.end());
199  // Get current order
200  const SizeType polynomial_degree_v = rGeometry.PolynomialDegreeV();
201  // Get current knot information
202  const Kratos::Vector& old_knots_v = rGeometry.KnotsV();
203 
204  const SizeType old_num_of_knots_v = rGeometry.NumberOfKnotsV();
205  // Get current cp's information
206  const SizeType old_num_of_cp_u = rGeometry.NumberOfControlPointsU();
207  const SizeType old_num_of_cp_v = rGeometry.NumberOfControlPointsV();
208  const SizeType old_num_of_cp_w = rGeometry.NumberOfControlPointsW();
209 
210  // Get current span's
211  SizeType a = NurbsUtilities::GetLowerSpan(polynomial_degree_v, old_knots_v, rKnotsVToInsert.front());
212  SizeType b = NurbsUtilities::GetLowerSpan(polynomial_degree_v, old_knots_v, rKnotsVToInsert.back()) + 1;
213 
214  SizeType r = rKnotsVToInsert.size();
215  // Initialize new containers
216  SizeType new_num_of_knots_v = old_num_of_knots_v + r;
217  rKnotsVRefined.resize(new_num_of_knots_v);
218 
219  SizeType new_num_of_cp_v = old_num_of_cp_v + r;
220  rPointsRefined.resize(old_num_of_cp_u*new_num_of_cp_v*old_num_of_cp_w);
221 
222  r = r - 1;
223  // Create new ordered knot vector.
224  for( IndexType i = 0; i <= a; i++)
225  rKnotsVRefined[i] = old_knots_v[i];
226  for( IndexType i = b+polynomial_degree_v; i < old_num_of_knots_v; ++i)
227  rKnotsVRefined[i+r+1] = old_knots_v[i];
228 
229  // Copy unaltered cp's.
230  for( IndexType row=0; row < old_num_of_cp_u; ++row){
231  for( IndexType depth=0; depth < old_num_of_cp_w; ++depth){
232  // Copy unaltered control points.
233  // Note: The "+1" accounts for the fact that first and last knots only appear "p"-times (and not "p+1"-times).
234  for( IndexType i = 0; i <= a - polynomial_degree_v + 1; ++i){
236  old_num_of_cp_u, new_num_of_cp_v, old_num_of_cp_w, row, i, depth);
238  old_num_of_cp_u, old_num_of_cp_v, old_num_of_cp_w, row, i, depth);
239  rPointsRefined(cp_index_left) = Kratos::make_intrusive<NodeType>(0, rGeometry[cp_index_right]);
240  }
241  // Note: The "+1" accounts for the fact that first and last knots only appear "p"-times (and not "p+1"-times).
242  for( IndexType i = b; i < old_num_of_cp_v; ++i){
244  old_num_of_cp_u, new_num_of_cp_v, old_num_of_cp_w, row, i+r+1, depth);
246  old_num_of_cp_u, old_num_of_cp_v, old_num_of_cp_w, row, i, depth);
247  rPointsRefined(cp_index_left) = Kratos::make_intrusive<NodeType>(0, rGeometry[cp_index_right]);
248  }
249  }
250  }
251 
252  // Find new CP's
253  const SizeType p = polynomial_degree_v;
254  int i = b + p - 1;
255  int k = b + p + r;
256  for( int j = r; j >= 0; j--){
257  while( rKnotsVToInsert[j] <= old_knots_v[i] && i > static_cast<int>(a)){
258  for( IndexType row=0; row < old_num_of_cp_u; ++row) {
259  for( IndexType depth=0; depth < old_num_of_cp_w; ++depth) {
260  // Note: The "+1" accounts for the fact that first and last knots only appear "p"-times (and not "p+1"-times).
261  // Also keep attention to the second argument. The left index is mapped to new_num_of_cp_v, but the right index is mapped
262  // to old_num_of_cp_v.
264  old_num_of_cp_u, new_num_of_cp_v, old_num_of_cp_w, row, k-p-1+1, depth);
266  old_num_of_cp_u, old_num_of_cp_v, old_num_of_cp_w, row, i-p-1+1, depth);
267  rPointsRefined(cp_index_left) = Kratos::make_intrusive<NodeType>(0, rGeometry[cp_index_right]);
268  }
269  }
270  rKnotsVRefined[k] = old_knots_v[i];
271  k--;
272  i--;
273  }
274  for( IndexType row=0; row < old_num_of_cp_u; ++row) {
275  for( IndexType depth=0; depth < old_num_of_cp_w; ++depth) {
276  // Note: The "+1" accounts for the fact that first and last knots only appear "p"-times (and not "p+1"-times).
278  old_num_of_cp_u, new_num_of_cp_v, old_num_of_cp_w, row, k-p-1+1, depth);
280  old_num_of_cp_u, new_num_of_cp_v, old_num_of_cp_w, row, k-p+1, depth);
281  rPointsRefined(cp_index_left) = rPointsRefined(cp_index_right);
282  }
283  }
284  for( IndexType l=1; l <= p; ++l){
285  IndexType index = k - p + l;
286  double alpha = rKnotsVRefined[k+l] - rKnotsVToInsert[j];
287  if( std::abs(alpha) < 1e-10){
288  for( IndexType row=0; row < old_num_of_cp_u; ++row) {
289  for( IndexType depth=0; depth < old_num_of_cp_w; ++depth) {
290  // Note: The "+1" accounts for the fact that first and last knots only appear "p"-times (and not "p+1"-times).
292  old_num_of_cp_u, new_num_of_cp_v, old_num_of_cp_w, row, index-1+1, depth);
294  old_num_of_cp_u, new_num_of_cp_v, old_num_of_cp_w, row, index+1, depth);
295  rPointsRefined(cp_index_left) = rPointsRefined(cp_index_right);
296  }
297  }
298  }
299  else {
300  alpha = alpha / ( rKnotsVRefined[k+l] - old_knots_v[i-p+l]);
301  for( IndexType row=0; row < old_num_of_cp_u; ++row) {
302  for( IndexType depth=0; depth < old_num_of_cp_w; ++depth) {
303  // Note: The "+1" accounts for the fact that first and last knots only appear "p"-times (and not "p+1"-times).
305  old_num_of_cp_u, new_num_of_cp_v, old_num_of_cp_w, row, index-1+1, depth);
307  old_num_of_cp_u, new_num_of_cp_v, old_num_of_cp_w, row, index+1, depth);
308 
309  double x = alpha * rPointsRefined[cp_index_minus][0] + (1.0-alpha) * rPointsRefined[cp_index][0];
310  double y = alpha * rPointsRefined[cp_index_minus][1] + (1.0-alpha) * rPointsRefined[cp_index][1];
311  double z = alpha * rPointsRefined[cp_index_minus][2] + (1.0-alpha) * rPointsRefined[cp_index][2];
312 
313  rPointsRefined(cp_index_minus) = Kratos::make_intrusive<NodeType>(0, x, y, z);
314  }
315  }
316  }
317 
318  }
319  rKnotsVRefined[k] = rKnotsVToInsert[j];
320  k -= 1;
321  }
322  }
323 
334  static void KnotRefinementW(NurbsVolumeGeometryType& rGeometry, std::vector<double>& rKnotsWToInsert,
335  PointerVector<NodeType>& rPointsRefined, Vector& rKnotsWRefined ){
336 
337  // Sort the knots which are to be inserted!
338  std::sort(rKnotsWToInsert.begin(),rKnotsWToInsert.end());
339  // Get current order
340  const SizeType polynomial_degree_w = rGeometry.PolynomialDegreeW();
341  // Get current knot information
342  const Kratos::Vector& old_knots_w = rGeometry.KnotsW();
343 
344  const SizeType old_num_of_knots_w = rGeometry.NumberOfKnotsW();
345  // Get current cp's information
346  const SizeType old_num_of_cp_u = rGeometry.NumberOfControlPointsU();
347  const SizeType old_num_of_cp_v = rGeometry.NumberOfControlPointsV();
348  const SizeType old_num_of_cp_w = rGeometry.NumberOfControlPointsW();
349 
350  // Get current span's
351  SizeType a = NurbsUtilities::GetLowerSpan(polynomial_degree_w, old_knots_w, rKnotsWToInsert.front());
352  SizeType b = NurbsUtilities::GetLowerSpan(polynomial_degree_w, old_knots_w, rKnotsWToInsert.back()) + 1;
353 
354  SizeType r = rKnotsWToInsert.size();
355  // Initialize new containers
356  SizeType new_num_of_knots_w = old_num_of_knots_w + r;
357  rKnotsWRefined.resize(new_num_of_knots_w);
358 
359  SizeType new_num_of_cp_w = old_num_of_cp_w + r;
360  rPointsRefined.resize(old_num_of_cp_u*old_num_of_cp_v*new_num_of_cp_w);
361 
362  r = r - 1;
363  // Create new ordered knot vector.
364  for( IndexType i = 0; i <= a; i++)
365  rKnotsWRefined[i] = old_knots_w[i];
366  for( IndexType i = b+polynomial_degree_w; i < old_num_of_knots_w; ++i)
367  rKnotsWRefined[i+r+1] = old_knots_w[i];
368 
369  // Copy unaltered cp's.
370  for( IndexType row=0; row < old_num_of_cp_u; ++row){
371  for( IndexType column=0; column < old_num_of_cp_v; ++column){
372  // Copy unaltered control points.
373  // Note: The "+1" accounts for the fact that first and last knots only appear "p"-times (and not "p+1"-times).
374  for( IndexType i = 0; i <= a - polynomial_degree_w + 1; ++i){
376  old_num_of_cp_u, old_num_of_cp_v, new_num_of_cp_w, row, column, i);
378  old_num_of_cp_u, old_num_of_cp_v, old_num_of_cp_w, row, column, i);
379  rPointsRefined(cp_index_left) = Kratos::make_intrusive<NodeType>(0, rGeometry[cp_index_right]);
380  }
381  // Note: The "+1" accounts for the fact that first and last knots only appear "p"-times (and not "p+1"-times).
382  for( IndexType i = b; i < old_num_of_cp_w; ++i){
384  old_num_of_cp_u, old_num_of_cp_v, new_num_of_cp_w, row, column, i+r+1);
386  old_num_of_cp_u, old_num_of_cp_v, old_num_of_cp_w, row, column, i);
387  rPointsRefined(cp_index_left) = Kratos::make_intrusive<NodeType>(0, rGeometry[cp_index_right]);
388  }
389  }
390  }
391 
392  // Find new CP's
393  const SizeType p = polynomial_degree_w;
394  int i = b + p - 1;
395  int k = b + p + r;
396  for( int j = r; j >= 0; j--){
397  while( rKnotsWToInsert[j] <= old_knots_w[i] && i > static_cast<int>(a)){
398  for( IndexType row=0; row < old_num_of_cp_u; ++row) {
399  for( IndexType column=0; column < old_num_of_cp_v; ++column) {
400  // Note: The "+1" accounts for the fact that first and last knots only appear "p"-times (and not "p+1"-times).
401  // Also keep attention to the second argument. The left index is mapped to new_num_of_cp_w, but the right index is mapped
402  // to old_num_of_cp_w.
404  old_num_of_cp_u, old_num_of_cp_v, new_num_of_cp_w, row, column, k-p-1+1);
406  old_num_of_cp_u, old_num_of_cp_v, old_num_of_cp_w, row, column, i-p-1+1);
407  rPointsRefined(cp_index_left) = Kratos::make_intrusive<NodeType>(0, rGeometry[cp_index_right]);
408  }
409  }
410  rKnotsWRefined[k] = old_knots_w[i];
411  k--;
412  i--;
413  }
414  for( IndexType row=0; row < old_num_of_cp_u; ++row) {
415  for( IndexType column=0; column < old_num_of_cp_v; ++column) {
416  // Note: The "+1" accounts for the fact that first and last knots only appear "p"-times (and not "p+1"-times).
418  old_num_of_cp_u, old_num_of_cp_v, new_num_of_cp_w, row, column, k-p-1+1);
420  old_num_of_cp_u, old_num_of_cp_v, new_num_of_cp_w, row, column, k-p+1);
421  rPointsRefined(cp_index_left) = rPointsRefined(cp_index_right);
422  }
423  }
424  for( IndexType l=1; l <= p; ++l){
425  IndexType index = k - p + l;
426  double alpha = rKnotsWRefined[k+l] - rKnotsWToInsert[j];
427  if( std::abs(alpha) < 1e-10){
428  for( IndexType row=0; row < old_num_of_cp_u; ++row) {
429  for( IndexType column=0; column < old_num_of_cp_v; ++column) {
430  // Note: The "+1" accounts for the fact that first and last knots only appear "p"-times (and not "p+1"-times).
432  old_num_of_cp_u, old_num_of_cp_v, new_num_of_cp_w, row, column, index-1+1);
434  old_num_of_cp_u, old_num_of_cp_v, new_num_of_cp_w, row, column, index+1);
435  rPointsRefined(cp_index_left) = rPointsRefined(cp_index_right);
436  }
437  }
438  }
439  else {
440  alpha = alpha / ( rKnotsWRefined[k+l] - old_knots_w[i-p+l]);
441  for( IndexType row=0; row < old_num_of_cp_u; ++row) {
442  for( IndexType column=0; column < old_num_of_cp_v; ++column) {
443  // Note: The "+1" accounts for the fact that first and last knots only appear "p"-times (and not "p+1"-times).
445  old_num_of_cp_u, old_num_of_cp_v, new_num_of_cp_w, row, column, index-1+1);
447  old_num_of_cp_u, old_num_of_cp_v, new_num_of_cp_w, row, column, index+1);
448 
449  double x = alpha * rPointsRefined[cp_index_minus][0] + (1.0-alpha) * rPointsRefined[cp_index][0];
450  double y = alpha * rPointsRefined[cp_index_minus][1] + (1.0-alpha) * rPointsRefined[cp_index][1];
451  double z = alpha * rPointsRefined[cp_index_minus][2] + (1.0-alpha) * rPointsRefined[cp_index][2];
452 
453  rPointsRefined(cp_index_minus) = Kratos::make_intrusive<NodeType>(0, x, y, z);
454  }
455  }
456  }
457 
458  }
459  rKnotsWRefined[k] = rKnotsWToInsert[j];
460  k -= 1;
461  }
462  }
464 };
465 
466 } // End namespace kratos
467 
468 #endif // KRATOS_NURBS_VOLUME_REFINEMENT_UTILITIES_H_INCLUDED
void resize(std::size_t NewSize1, std::size_t NewSize2, bool preserve=0)
Definition: amatrix_interface.h:224
This class defines the node.
Definition: node.h:65
A volume geometry based on a full 3-dimensional BSpline tensor product.
Definition: nurbs_volume_geometry.h:46
const Vector & KnotsV() const
Get Knot vector in v-direction.
Definition: nurbs_volume_geometry.h:305
SizeType PolynomialDegreeV() const
Definition: nurbs_volume_geometry.h:277
SizeType NumberOfControlPointsW() const
Definition: nurbs_volume_geometry.h:381
SizeType NumberOfControlPointsV() const
Definition: nurbs_volume_geometry.h:373
const Vector & KnotsU() const
Get Knot vector in u-direction.
Definition: nurbs_volume_geometry.h:295
SizeType NumberOfControlPointsU() const
Attention weights are not yet implemented.
Definition: nurbs_volume_geometry.h:365
SizeType PolynomialDegreeW() const
Definition: nurbs_volume_geometry.h:285
SizeType NumberOfKnotsV() const
Definition: nurbs_volume_geometry.h:331
SizeType PolynomialDegreeU() const
Definition: nurbs_volume_geometry.h:269
SizeType NumberOfKnotsU() const
Definition: nurbs_volume_geometry.h:323
const Vector & KnotsW() const
Get Knot vector in w-direction.
Definition: nurbs_volume_geometry.h:315
SizeType NumberOfKnotsW() const
Definition: nurbs_volume_geometry.h:339
Definition: nurbs_volume_refinement_utilities.h:28
static void KnotRefinementW(NurbsVolumeGeometryType &rGeometry, std::vector< double > &rKnotsWToInsert, PointerVector< NodeType > &rPointsRefined, Vector &rKnotsWRefined)
Refines the w-knotvector of a NurbsVolumeGeometry.
Definition: nurbs_volume_refinement_utilities.h:334
std::size_t IndexType
Definition: nurbs_volume_refinement_utilities.h:33
NurbsVolumeGeometryType::Pointer NurbsVolumeGeometryPointerType
Definition: nurbs_volume_refinement_utilities.h:38
static void KnotRefinementV(NurbsVolumeGeometryType &rGeometry, std::vector< double > &rKnotsVToInsert, PointerVector< NodeType > &rPointsRefined, Vector &rKnotsVRefined)
Refines the v-knotvector of a NurbsVolumeGeometry.
Definition: nurbs_volume_refinement_utilities.h:194
static void KnotRefinementU(NurbsVolumeGeometryType &rGeometry, std::vector< double > &rKnotsUToInsert, PointerVector< NodeType > &rPointsRefined, Vector &rKnotsURefined)
Refines the u-knotvector of a NurbsVolumeGeometry.
Definition: nurbs_volume_refinement_utilities.h:54
std::size_t SizeType
Definition: nurbs_volume_refinement_utilities.h:34
Node NodeType
Definition: nurbs_volume_refinement_utilities.h:35
NurbsVolumeGeometry< PointerVector< NodeType > > NurbsVolumeGeometryType
Definition: nurbs_volume_refinement_utilities.h:37
PointerVector is a container like stl vector but using a vector to store pointers to its data.
Definition: pointer_vector.h:72
void resize(size_type dim)
Definition: pointer_vector.h:314
z
Definition: GenerateWind.py:163
IndexType GetLowerSpan(const SizeType PolynomialDegree, const Vector &rKnots, const double ParameterT)
Definition: nurbs_utilities.h:64
static constexpr IndexType GetVectorIndexFromMatrixIndices(const SizeType NumberPerRow, const SizeType NumberPerColumn, const IndexType RowIndex, const IndexType ColumnIndex) noexcept
Definition: nurbs_utilities.h:133
REF: G. R. Cowper, GAUSSIAN QUADRATURE FORMULAS FOR TRIANGLES.
Definition: mesh_condition.cpp:21
AMatrix::MatrixRow< const TExpressionType > row(AMatrix::MatrixExpression< TExpressionType, TCategory > const &TheExpression, std::size_t RowIndex)
Definition: amatrix_interface.h:649
AMatrix::MatrixColumn< const TExpressionType > column(AMatrix::MatrixExpression< TExpressionType, TCategory > const &TheExpression, std::size_t ColumnIndex)
Definition: amatrix_interface.h:637
y
Other simbols definition.
Definition: generate_axisymmetric_navier_stokes_element.py:54
alpha
Definition: generate_convection_diffusion_explicit_element.py:113
a
Definition: generate_stokes_twofluid_element.py:77
b
Definition: generate_total_lagrangian_mixed_volumetric_strain_element.py:31
int k
Definition: quadrature.py:595
int j
Definition: quadrature.py:648
p
Definition: sensitivityMatrix.py:52
x
Definition: sensitivityMatrix.py:49
integer i
Definition: TensorModule.f:17
integer l
Definition: TensorModule.f:17
e
Definition: run_cpp_mpi_tests.py:31