Skip to content

Commit 601a4fb

Browse files
authored
Merge pull request #13912 from KratosMultiphysics/PR_corrections_laplacian_and_fluids
[IgaApplication] small corrections and typos in Fluid and Laplacian workflow of IgaApplication
2 parents 10977d3 + 40a8699 commit 601a4fb

File tree

10 files changed

+142
-133
lines changed

10 files changed

+142
-133
lines changed

applications/IgaApplication/custom_conditions/sbm_fluid_condition_dirichlet.cpp

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ void SbmFluidConditionDirichlet::CalculateAll(
3939
KRATOS_TRY
4040

4141
const auto& r_geometry = GetGeometry();
42-
const SizeType number_of_nodes = r_geometry.size();
42+
const std::size_t number_of_nodes = r_geometry.size();
4343

44-
const SizeType mat_size = number_of_nodes * (mDim+1);
44+
const std::size_t mat_size = number_of_nodes * (mDim+1);
4545
//resizing as needed the LHS
4646
if(rLeftHandSideMatrix.size1() != mat_size)
4747
rLeftHandSideMatrix.resize(mat_size,mat_size,false);
@@ -113,16 +113,25 @@ void SbmFluidConditionDirichlet::CalculateAll(
113113
stress_old(1, 0) = r_stress_vector[2]; stress_old(1, 1) = r_stress_vector[1];
114114
Vector traction_old_iteration = prod(stress_old, n_tensor); // This results in a 2x1 vector.
115115

116+
Matrix DB_contribution_w = ZeroMatrix(2, 2);
117+
Matrix DB_contribution = ZeroMatrix(2, 2);
118+
116119
for (IndexType i = 0; i < number_of_nodes; i++) {
117-
for (IndexType j = 0; j < number_of_nodes; j++) {
118-
for (IndexType idim = 0; idim < 2; idim++) {
120+
for (IndexType idim = 0; idim < 2; idim++) {
121+
DB_contribution_w(0, 0) = DB_voigt(0, 2*i+idim);
122+
DB_contribution_w(0, 1) = DB_voigt(2, 2*i+idim);
123+
DB_contribution_w(1, 0) = DB_voigt(2, 2*i+idim);
124+
DB_contribution_w(1, 1) = DB_voigt(1, 2*i+idim);
125+
126+
for (IndexType j = 0; j < number_of_nodes; j++) {
127+
// Compute the traction vector: sigma * n.
128+
Vector traction_nitsche_w = prod(DB_contribution_w, n_tensor);
119129

120130
// Penalty term
121131
rLeftHandSideMatrix(3*i+idim, 3*j+idim) += mHsum(0,i)*mHsum(0,j)* penalty_integration;
122132

123133
for (IndexType jdim = 0; jdim < 2; jdim++) {
124134
// Extract the 2x2 block for the control point i from the sigma matrix.
125-
Matrix DB_contribution = ZeroMatrix(2, 2);
126135
DB_contribution(0, 0) = DB_voigt(0, 2*j+jdim);
127136
DB_contribution(0, 1) = DB_voigt(2, 2*j+jdim);
128137
DB_contribution(1, 0) = DB_voigt(2, 2*j+jdim);
@@ -134,12 +143,16 @@ void SbmFluidConditionDirichlet::CalculateAll(
134143
rLeftHandSideMatrix(3*i+idim, 3*j+jdim) -= H(0, i) * traction(idim) * integration_weight;
135144

136145
// skew-symmetric Nitsche term
137-
rLeftHandSideMatrix(3*j+jdim, 3*i+idim) += mHsum(0, i) * traction(idim) * integration_weight;
146+
rLeftHandSideMatrix(3*i+idim, 3*j+jdim) += mHsum(0, j) * traction_nitsche_w(jdim) * integration_weight;
138147
}
139148

140149
// integration by parts PRESSURE
141150
rLeftHandSideMatrix(3*i+idim, 3*j+2) += H(0,j)* ( H(0,i) * mNormalParameterSpace[idim] )
142151
* integration_weight;
152+
153+
// Nitsche term --> q term
154+
rLeftHandSideMatrix(3*j+mDim, 3*i+idim) -= H(0,j)* ( mHsum(0,i) * mNormalParameterSpace[idim] )
155+
* integration_weight;
143156
}
144157
}
145158

@@ -153,14 +166,18 @@ void SbmFluidConditionDirichlet::CalculateAll(
153166
rRightHandSideVector(3*i+idim) -= pressure_old_iteration * ( H(0,i) * mNormalParameterSpace[idim] ) * integration_weight;
154167

155168
// skew-symmetric Nitsche term
156-
Matrix DB_contribution = ZeroMatrix(2, 2); // Extract the 2x2 block for the control point i from the DB_voigt.
157169
DB_contribution(0, 0) = DB_voigt(0, 2*i+idim);
158170
DB_contribution(0, 1) = DB_voigt(2, 2*i+idim);
159171
DB_contribution(1, 0) = DB_voigt(2, 2*i+idim);
160172
DB_contribution(1, 1) = DB_voigt(1, 2*i+idim);
161173
// Compute the traction vector: sigma * n.
162174
Vector traction = prod(DB_contribution, n_tensor);
163-
rRightHandSideVector(3*i+idim) -= velocity_old_iteration[idim] * traction(idim) * integration_weight;
175+
for (IndexType jdim = 0; jdim < mDim; jdim++) {
176+
rRightHandSideVector(3*i+idim) -= velocity_old_iteration[jdim] * traction(jdim) * integration_weight;
177+
}
178+
// Nitsche term --> q term
179+
rRightHandSideVector(3*i+mDim) += velocity_old_iteration[idim] * ( H(0,i) * mNormalParameterSpace[idim] )
180+
* integration_weight;
164181
}
165182
}
166183

@@ -184,7 +201,11 @@ void SbmFluidConditionDirichlet::CalculateAll(
184201
// Compute the traction vector: sigma * n.
185202
Vector traction = prod(sigma_block, n_tensor);
186203
// skew-symmetric Nitsche term
187-
rRightHandSideVector[3*i+idim] += u_D[idim] * traction(idim) * integration_weight;
204+
for (IndexType jdim = 0; jdim < mDim; jdim++) {
205+
rRightHandSideVector[3*i+idim] += u_D[jdim] * traction(jdim) * integration_weight;
206+
}
207+
// Nitsche term --> q term
208+
rRightHandSideVector[3*i+mDim] -= u_D[idim] * H(0,i)*mNormalParameterSpace[idim] * integration_weight;
188209

189210
}
190211
}
@@ -230,7 +251,7 @@ void SbmFluidConditionDirichlet::InitializeMemberVariables()
230251
void SbmFluidConditionDirichlet::InitializeSbmMemberVariables()
231252
{
232253
const auto& r_geometry = this->GetGeometry();
233-
const SizeType number_of_nodes = r_geometry.size();
254+
const std::size_t number_of_nodes = r_geometry.size();
234255

235256
// Retrieve projection
236257
Condition candidate_closest_skin_segment_1 = this->GetValue(NEIGHBOUR_CONDITIONS)[0] ;
@@ -285,8 +306,8 @@ void SbmFluidConditionDirichlet::CalculateB(
285306
Matrix& rB,
286307
const ShapeDerivativesType& r_DN_DX) const
287308
{
288-
const SizeType number_of_control_points = GetGeometry().size();
289-
const SizeType mat_size = number_of_control_points * 2; // Only 2 DOFs per node in 2D
309+
const std::size_t number_of_control_points = GetGeometry().size();
310+
const std::size_t mat_size = number_of_control_points * 2; // Only 2 DOFs per node in 2D
290311

291312
// Resize B matrix to 3 rows (strain vector size) and appropriate number of columns
292313
if (rB.size1() != 3 || rB.size2() != mat_size)
@@ -311,7 +332,7 @@ void SbmFluidConditionDirichlet::ApplyConstitutiveLaw(
311332
ConstitutiveLaw::Parameters& rValues,
312333
ConstitutiveVariables& rConstitutiveVariables) const
313334
{
314-
const SizeType number_of_nodes = GetGeometry().size();
335+
const std::size_t number_of_nodes = GetGeometry().size();
315336

316337
// Set constitutive law flags:
317338
Flags& ConstitutiveLawOptions=rValues.GetOptions();
@@ -355,7 +376,7 @@ int SbmFluidConditionDirichlet::Check(const ProcessInfo& rCurrentProcessInfo) co
355376
void SbmFluidConditionDirichlet::EquationIdVector(EquationIdVectorType &rResult, const ProcessInfo &rCurrentProcessInfo) const
356377
{
357378
const GeometryType& rGeom = this->GetGeometry();
358-
const SizeType number_of_control_points = GetGeometry().size();
379+
const std::size_t number_of_control_points = GetGeometry().size();
359380
const unsigned int LocalSize = (mDim + 1) * number_of_control_points;
360381

361382
if (rResult.size() != LocalSize)
@@ -379,7 +400,7 @@ void SbmFluidConditionDirichlet::GetDofList(
379400
{
380401
KRATOS_TRY;
381402

382-
const SizeType number_of_control_points = GetGeometry().size();
403+
const std::size_t number_of_control_points = GetGeometry().size();
383404

384405
rElementalDofList.resize(0);
385406
rElementalDofList.reserve((mDim + 1) * number_of_control_points);
@@ -397,8 +418,8 @@ void SbmFluidConditionDirichlet::GetDofList(
397418
void SbmFluidConditionDirichlet::GetSolutionCoefficientVector(
398419
Vector& rValues) const
399420
{
400-
const SizeType number_of_control_points = GetGeometry().size();
401-
const SizeType mat_size = number_of_control_points * mDim;
421+
const std::size_t number_of_control_points = GetGeometry().size();
422+
const std::size_t mat_size = number_of_control_points * mDim;
402423

403424
if (rValues.size() != mat_size)
404425
rValues.resize(mat_size, false);

applications/IgaApplication/custom_conditions/sbm_fluid_condition_dirichlet.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ namespace Kratos
3535
KRATOS_CLASS_INTRUSIVE_POINTER_DEFINITION(SbmFluidConditionDirichlet);
3636

3737
/// Size types
38-
typedef std::size_t SizeType;
3938
typedef std::size_t IndexType;
4039

4140
/// Type for shape function derivatives container

applications/IgaApplication/custom_conditions/sbm_laplacian_condition_neumann.cpp

Lines changed: 28 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -39,71 +39,20 @@ void SbmLaplacianConditionNeumann::CalculateLocalSystem(
3939
{
4040
KRATOS_TRY
4141

42-
ConvectionDiffusionSettings::Pointer p_settings = rCurrentProcessInfo[CONVECTION_DIFFUSION_SETTINGS];
43-
const auto& r_unknown_var = p_settings->GetUnknownVariable();
42+
const std::size_t mat_size = GetGeometry().size() * 1;
4443

45-
const auto& r_geometry = this->GetGeometry();
46-
const SizeType number_of_nodes = r_geometry.PointsNumber();
47-
if (rRightHandSideVector.size() != number_of_nodes) {
48-
rRightHandSideVector.resize(number_of_nodes, false);
49-
}
50-
if (rLeftHandSideMatrix.size1() != number_of_nodes || rLeftHandSideMatrix.size2() != number_of_nodes) {
51-
rLeftHandSideMatrix.resize(number_of_nodes, number_of_nodes, false);
52-
}
53-
54-
noalias(rRightHandSideVector) = ZeroVector(number_of_nodes);
55-
noalias(rLeftHandSideMatrix) = ZeroMatrix(number_of_nodes, number_of_nodes);
56-
57-
// Integration
58-
const auto& r_integration_points = r_geometry.IntegrationPoints();
59-
const auto& r_DN_De = r_geometry.ShapeFunctionsLocalGradients(r_geometry.GetDefaultIntegrationMethod());
60-
61-
// Initialize DN_DX
62-
Matrix DN_DX(number_of_nodes,mDim);
44+
if (rRightHandSideVector.size() != mat_size)
45+
rRightHandSideVector.resize(mat_size);
46+
noalias(rRightHandSideVector) = ZeroVector(mat_size);
6347

64-
// Calculating the PHYSICAL SPACE derivatives (it is avoided storing them to minimize storage)
65-
noalias(DN_DX) = r_DN_De[0]; // prod(r_DN_De[0],InvJ0);
66-
67-
const Matrix& H = r_geometry.ShapeFunctionsValues();
48+
if (rLeftHandSideMatrix.size1() != mat_size)
49+
rLeftHandSideMatrix.resize(mat_size, mat_size);
50+
noalias(rLeftHandSideMatrix) = ZeroMatrix(mat_size, mat_size);
6851

69-
// compute gradient Taylor expansion contribution: grad_H_sum
70-
Matrix grad_H_sum = ZeroMatrix(3, number_of_nodes);
71-
ComputeGradientTaylorExpansionContribution(grad_H_sum);
72-
73-
// dot product grad cdot n
74-
Matrix H_grad_N_dot_n = ZeroMatrix(1, number_of_nodes);
75-
noalias(row(H_grad_N_dot_n, 0)) = row(grad_H_sum, 0) * mTrueNormal[0] + row(grad_H_sum, 1) * mTrueNormal[1] + row(grad_H_sum, 2) * mTrueNormal[2];
52+
CalculateLeftHandSide(rLeftHandSideMatrix,rCurrentProcessInfo);
7653

77-
Matrix DN_dot_n_tilde = ZeroMatrix(1, number_of_nodes);
78-
for (IndexType i = 0; i < number_of_nodes; ++i)
79-
{
80-
// grad N cdot n_tilde
81-
for (IndexType idim = 0; idim < mDim; idim++) {
82-
DN_dot_n_tilde(0, i) += DN_DX(i, idim) * mNormalParameterSpace[idim];
83-
}
84-
}
85-
86-
// Assembly
87-
// compute Neumann contributions
88-
noalias(rLeftHandSideMatrix) += prod(trans(H), H_grad_N_dot_n) * mTrueDotSurrogateNormal * r_integration_points[0].Weight(); // * std::abs(determinant_jacobian_vector[point_number]) ;
89-
noalias(rLeftHandSideMatrix) -= prod(trans(H), DN_dot_n_tilde) * r_integration_points[0].Weight() ; // * std::abs(DetJ0) ;
54+
CalculateRightHandSide(rRightHandSideVector,rCurrentProcessInfo);
9055

91-
Vector t_N(number_of_nodes);
92-
for (IndexType i = 0; i < number_of_nodes; ++i)
93-
{
94-
t_N[i] = mpProjectionNode->GetValue(HEAT_FLUX);
95-
}
96-
// Neumann Contributions
97-
noalias(rRightHandSideVector) += prod(prod(trans(H), H), t_N) * mTrueDotSurrogateNormal * r_integration_points[0].Weight(); // * std::abs(determinant_jacobian_vector[point_number]);
98-
99-
Vector temp(number_of_nodes);
100-
// RHS = ExtForces - K*temp;
101-
for (IndexType i = 0; i < number_of_nodes; i++) {
102-
temp[i] = r_geometry[i].GetSolutionStepValue(r_unknown_var);
103-
}
104-
// RHS -= K*temp
105-
noalias(rRightHandSideVector) -= prod(rLeftHandSideMatrix,temp);
106-
10756
KRATOS_CATCH("")
10857

10958
}
@@ -198,7 +147,7 @@ void SbmLaplacianConditionNeumann::CalculateLeftHandSide(
198147
{
199148
ConvectionDiffusionSettings::Pointer p_settings = rCurrentProcessInfo[CONVECTION_DIFFUSION_SETTINGS];
200149
const auto& r_geometry = this->GetGeometry();
201-
const SizeType number_of_nodes = r_geometry.PointsNumber();
150+
const std::size_t number_of_nodes = r_geometry.PointsNumber();
202151

203152
if (rLeftHandSideMatrix.size1() != number_of_nodes || rLeftHandSideMatrix.size2() != number_of_nodes) {
204153
rLeftHandSideMatrix.resize(number_of_nodes, number_of_nodes, false);
@@ -246,7 +195,9 @@ void SbmLaplacianConditionNeumann::CalculateRightHandSide(
246195
const ProcessInfo& rCurrentProcessInfo)
247196
{
248197
const auto& r_geometry = this->GetGeometry();
249-
const SizeType number_of_nodes = r_geometry.PointsNumber();
198+
ConvectionDiffusionSettings::Pointer p_settings = rCurrentProcessInfo[CONVECTION_DIFFUSION_SETTINGS];
199+
const auto& r_unknown_var = p_settings->GetUnknownVariable();
200+
const std::size_t number_of_nodes = r_geometry.PointsNumber();
250201
if (rRightHandSideVector.size() != number_of_nodes) {
251202
rRightHandSideVector.resize(number_of_nodes, false);
252203
}
@@ -265,12 +216,24 @@ void SbmLaplacianConditionNeumann::CalculateRightHandSide(
265216
}
266217
// Neumann Contributions
267218
noalias(rRightHandSideVector) += prod(prod(trans(H), H), t_N) * mTrueDotSurrogateNormal * r_integration_points[0].Weight(); // * std::abs(determinant_jacobian_vector[point_number]);
219+
220+
// --- Corresponding RHS ---
221+
Matrix left_hand_side = ZeroMatrix(number_of_nodes);
222+
CalculateLeftHandSide(left_hand_side,rCurrentProcessInfo);
223+
Vector temp(number_of_nodes);
224+
// RHS = ExtForces - K*temp;
225+
for (IndexType i = 0; i < number_of_nodes; i++) {
226+
temp[i] = r_geometry[i].GetSolutionStepValue(r_unknown_var);
227+
}
228+
// RHS -= K*temp
229+
noalias(rRightHandSideVector) -= prod(left_hand_side,temp);
230+
268231
}
269232

270233
void SbmLaplacianConditionNeumann::ComputeGradientTaylorExpansionContribution(Matrix& grad_H_sum)
271234
{
272235
const auto& r_geometry = this->GetGeometry();
273-
const SizeType number_of_nodes = r_geometry.PointsNumber();
236+
const std::size_t number_of_nodes = r_geometry.PointsNumber();
274237
const auto& r_DN_De = r_geometry.ShapeFunctionsLocalGradients(r_geometry.GetDefaultIntegrationMethod());
275238

276239
// Compute all the derivatives of the basis functions involved
@@ -384,7 +347,7 @@ void SbmLaplacianConditionNeumann::EquationIdVector(
384347
const auto& r_unknown_var = p_settings->GetUnknownVariable();
385348

386349
const auto& r_geometry = GetGeometry();
387-
const SizeType number_of_nodes = r_geometry.size();
350+
const std::size_t number_of_nodes = r_geometry.size();
388351

389352
if (rResult.size() != number_of_nodes)
390353
rResult.resize(number_of_nodes, false);
@@ -403,7 +366,7 @@ void SbmLaplacianConditionNeumann::GetDofList(
403366
const auto& r_unknown_var = p_settings->GetUnknownVariable();
404367

405368
const auto& r_geometry = GetGeometry();
406-
const SizeType number_of_nodes = r_geometry.size();
369+
const std::size_t number_of_nodes = r_geometry.size();
407370

408371
rElementalDofList.resize(0);
409372
rElementalDofList.reserve(number_of_nodes);

0 commit comments

Comments
 (0)