Skip to content

Commit 50b74b1

Browse files
Merge pull request arcaneframework#253 from arcaneframework/dev/mab-acoustics-update
add solver controls
2 parents 695a8b4 + 6c83c26 commit 50b74b1

File tree

5 files changed

+112
-48
lines changed

5 files changed

+112
-48
lines changed

modules/acoustics/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ enable_testing()
3232

3333
add_test(NAME [Acoustics]2D_submarine COMMAND Acoustics inputs/sub.arc)
3434

35+
if(FEMUTILS_HAS_SOLVER_BACKEND_PETSC)
36+
add_test(NAME [Acoustics]parse_and_exit COMMAND Acoustics
37+
-A,//fem/assemble-linear-system=false
38+
-A,//fem/solve-linear-system=false
39+
-A,//fem/cross-validation=false
40+
inputs/sub.arc)
41+
endif()
42+
3543
if(FEMUTILS_HAS_SOLVER_BACKEND_HYPRE)
3644
add_test(NAME [Acoustics]2D_submarine_hypre COMMAND Acoustics inputs/sub.hypre.arc)
3745
if(FEMUTILS_HAS_PARALLEL_SOLVER AND MPIEXEC_EXECUTABLE)

modules/acoustics/ElementMatrix.h

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2+
//-----------------------------------------------------------------------------
3+
// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4+
// See the top-level COPYRIGHT file for details.
5+
// SPDX-License-Identifier: Apache-2.0
6+
//-----------------------------------------------------------------------------
7+
/*---------------------------------------------------------------------------*/
8+
/* ElementMatrix.h (C) 2022-2025 */
9+
/* */
10+
/* Contains functions to compute the FEM element matrices for acoustic */
11+
/*---------------------------------------------------------------------------*/
12+
/*---------------------------------------------------------------------------*/
13+
14+
/*---------------------------------------------------------------------------*/
15+
/**
16+
* @brief Computes the element matrix for a triangular element (ℙ1 FE).
17+
*
18+
* This function calculates the integral of the expression:
19+
* a(𝑢,𝑣) = ∫∫ -(∂𝑢/∂𝑥 ∂𝑣/∂𝑥 + ∂𝑢/∂𝑦 ∂𝑣/∂𝑦)dΩ + ∫∫ 𝑘²𝑢𝑣 dΩ
20+
*
21+
* Steps involved:
22+
* 1. Calculate the area of the triangle.
23+
* 2. Compute the gradients of the shape functions.
24+
* 3. Return a(𝑢,𝑣);
25+
*/
26+
/*---------------------------------------------------------------------------*/
27+
28+
RealMatrix<3, 3> FemModule::
29+
_computeElementMatrixTria3(Cell cell)
30+
{
31+
Real area = ArcaneFemFunctions::MeshOperation::computeAreaTria3(cell, m_node_coord);
32+
33+
RealMatrix<1, 3> U = { 1, 1, 1 };
34+
35+
Real3 dxU = ArcaneFemFunctions::FeOperation2D::computeGradientXTria3(cell, m_node_coord);
36+
Real3 dyU = ArcaneFemFunctions::FeOperation2D::computeGradientYTria3(cell, m_node_coord);
37+
38+
return -area * (dxU ^ dxU) - area * (dyU ^ dyU) + m_kc2 * area * (1/ 12.) *massMatrix(U,U);
39+
}

modules/acoustics/Fem.axl

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,26 @@
3333
<description>k/c square of the material.</description>
3434
</simple>
3535

36+
<simple name="matrix-format" type="string" default="DOK" optional="true">
37+
<description>Which matrix format to use DOK|BSR|AF-BSR.</description>
38+
</simple>
39+
40+
<simple name="petsc-flags" type="string" default="" optional="true">
41+
<description>Flags for PETSc from commandline.</description>
42+
</simple>
43+
44+
<simple name="solve-linear-system" type="bool" default="true" optional="true">
45+
<description>Boolean to enable linear system solving.</description>
46+
</simple>
47+
48+
<simple name="assemble-linear-system" type="bool" default="true" optional="true">
49+
<description>Boolean to enable linear system assembly.</description>
50+
</simple>
51+
52+
<simple name="cross-validation" type="bool" default="true" optional="true">
53+
<description>Boolean to enable cross validation.</description>
54+
</simple>
55+
3656
<!-- Linear system service instance -->
3757
<service-instance name="linear-system" type="Arcane::FemUtils::IDoFLinearSystemFactory" default="AlephLinearSystem" />
3858

modules/acoustics/FemModule.cc

Lines changed: 37 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
/*---------------------------------------------------------------------------*/
1313

1414
#include "FemModule.h"
15+
#include "ElementMatrix.h"
1516

1617
/*---------------------------------------------------------------------------*/
1718
/**
@@ -30,8 +31,14 @@ startInit()
3031
m_dofs_on_nodes.initialize(mesh(), 1);
3132
m_dof_family = m_dofs_on_nodes.dofFamily();
3233

34+
m_matrix_format = options()->matrixFormat();
35+
m_assemble_linear_system = options()->assembleLinearSystem();
36+
m_solve_linear_system = options()->solveLinearSystem();
37+
m_cross_validation = options()->crossValidation();
38+
m_petsc_flags = options()->petscFlags();
39+
3340
elapsedTime = platform::getRealTime() - elapsedTime;
34-
ArcaneFemFunctions::GeneralFunctions::printArcaneFemTime(traceMng(),"initialize", elapsedTime);
41+
ArcaneFemFunctions::GeneralFunctions::printArcaneFemTime(traceMng(), "initialize", elapsedTime);
3542
}
3643

3744
/*---------------------------------------------------------------------------*/
@@ -58,6 +65,11 @@ compute()
5865
m_linear_system.setLinearSystemFactory(options()->linearSystem());
5966
m_linear_system.initialize(subDomain(), m_dofs_on_nodes.dofFamily(), "Solver");
6067

68+
if (m_petsc_flags != NULL) {
69+
CommandLineArguments args = ArcaneFemFunctions::GeneralFunctions::getPetscFlagsFromCommandline(m_petsc_flags);
70+
m_linear_system.setSolverCommandLineArguments(args);
71+
}
72+
6173
_doStationarySolve();
6274

6375
elapsedTime = platform::getRealTime() - elapsedTime;
@@ -70,10 +82,10 @@ compute()
7082
*
7183
* This method follows a sequence of steps to solve FEM system:
7284
* 1. _getMaterialParameters() Retrieves material parameters via
73-
* 2. _assembleBilinearOperator() Assembles the FEM matrix A
74-
* 3. _assembleLinearOperator() Assembles the FEM RHS vector b
75-
* 4. _solve() Solves for solution vector u = A^-1*b
76-
* 5. _updateVariables() Updates FEM variables u = x
85+
* 2. _assembleBilinearOperator() Assembles the FEM matrix 𝑨
86+
* 3. _assembleLinearOperator() Assembles the FEM RHS vector 𝒃
87+
* 4. _solve() Solves for solution vector 𝒖 = 𝑨⁻¹𝒃
88+
* 5. _updateVariables() Updates FEM variables 𝒖 = 𝒙
7789
* 6. _validateResults() Regression test
7890
*/
7991
/*---------------------------------------------------------------------------*/
@@ -82,11 +94,18 @@ void FemModule::
8294
_doStationarySolve()
8395
{
8496
_getMaterialParameters();
85-
_assembleBilinearOperatorTria3();
86-
_assembleLinearOperator();
87-
_solve();
88-
_updateVariables();
89-
_validateResults();
97+
98+
if (m_assemble_linear_system) {
99+
_assembleBilinearOperator();
100+
_assembleLinearOperator();
101+
}
102+
if (m_solve_linear_system) {
103+
_solve();
104+
_updateVariables();
105+
}
106+
if (m_cross_validation) {
107+
_validateResults();
108+
}
90109
}
91110

92111
/*---------------------------------------------------------------------------*/
@@ -101,7 +120,7 @@ _getMaterialParameters()
101120
m_kc2 = options()->kc2();
102121

103122
elapsedTime = platform::getRealTime() - elapsedTime;
104-
ArcaneFemFunctions::GeneralFunctions::printArcaneFemTime(traceMng(),"get-material-parms", elapsedTime);
123+
ArcaneFemFunctions::GeneralFunctions::printArcaneFemTime(traceMng(), "get-material-parms", elapsedTime);
105124
}
106125

107126
/*---------------------------------------------------------------------------*/
@@ -133,35 +152,7 @@ _assembleLinearOperator()
133152
}
134153

135154
elapsedTime = platform::getRealTime() - elapsedTime;
136-
ArcaneFemFunctions::GeneralFunctions::printArcaneFemTime(traceMng(),"rhs-vector-assembly", elapsedTime);
137-
}
138-
139-
/*---------------------------------------------------------------------------*/
140-
/**
141-
* @brief Computes the element matrix for a triangular element (P1 FE).
142-
*
143-
* This function calculates the integral of the expression:
144-
* -(u.dx * v.dx + u.dy * v.dy) + kc2 * u * v
145-
*
146-
* Steps involved:
147-
* 1. Calculate the area of the triangle.
148-
* 2. Compute the integral U*V term.
149-
* 3. Compute the gradients of the shape functions.
150-
* 4. Return -(u.dx * v.dx + u.dy * v.dy) + kc2 * u * v ;
151-
*/
152-
/*---------------------------------------------------------------------------*/
153-
154-
RealMatrix<3, 3> FemModule::
155-
_computeElementMatrixTria3(Cell cell)
156-
{
157-
Real area = ArcaneFemFunctions::MeshOperation::computeAreaTria3(cell, m_node_coord);
158-
159-
RealMatrix<1, 3> U = { 1, 1, 1 };
160-
161-
Real3 dxU = ArcaneFemFunctions::FeOperation2D::computeGradientXTria3(cell, m_node_coord);
162-
Real3 dyU = ArcaneFemFunctions::FeOperation2D::computeGradientYTria3(cell, m_node_coord);
163-
164-
return -area * (dxU ^ dxU) - area * (dyU ^ dyU) + m_kc2 * area * (1/ 12.) *massMatrix(U,U);
155+
ArcaneFemFunctions::GeneralFunctions::printArcaneFemTime(traceMng(), "rhs-vector-assembly", elapsedTime);
165156
}
166157

167158
/*---------------------------------------------------------------------------*/
@@ -175,7 +166,7 @@ _computeElementMatrixTria3(Cell cell)
175166
/*---------------------------------------------------------------------------*/
176167

177168
void FemModule::
178-
_assembleBilinearOperatorTria3()
169+
_assembleBilinearOperator()
179170
{
180171
info() << "[ArcaneFem-Info] Started module _assembleBilinearOperator()";
181172
Real elapsedTime = platform::getRealTime();
@@ -201,7 +192,7 @@ _assembleBilinearOperatorTria3()
201192
}
202193

203194
elapsedTime = platform::getRealTime() - elapsedTime;
204-
ArcaneFemFunctions::GeneralFunctions::printArcaneFemTime(traceMng(),"lhs-matrix-assembly", elapsedTime);
195+
ArcaneFemFunctions::GeneralFunctions::printArcaneFemTime(traceMng(), "lhs-matrix-assembly", elapsedTime);
205196
}
206197

207198
/*---------------------------------------------------------------------------*/
@@ -224,7 +215,7 @@ _solve()
224215
m_linear_system.solve();
225216

226217
elapsedTime = platform::getRealTime() - elapsedTime;
227-
ArcaneFemFunctions::GeneralFunctions::printArcaneFemTime(traceMng(),"solve-linear-system", elapsedTime);
218+
ArcaneFemFunctions::GeneralFunctions::printArcaneFemTime(traceMng(), "solve-linear-system", elapsedTime);
228219
}
229220

230221
/*---------------------------------------------------------------------------*/
@@ -256,7 +247,7 @@ _updateVariables()
256247
m_u.synchronize();
257248

258249
elapsedTime = platform::getRealTime() - elapsedTime;
259-
ArcaneFemFunctions::GeneralFunctions::printArcaneFemTime(traceMng(),"update-variables", elapsedTime);
250+
ArcaneFemFunctions::GeneralFunctions::printArcaneFemTime(traceMng(), "update-variables", elapsedTime);
260251
}
261252

262253
/*---------------------------------------------------------------------------*/
@@ -278,12 +269,11 @@ _validateResults()
278269
info() << "[ArcaneFem-Info] Started module _validateResults()";
279270
Real elapsedTime = platform::getRealTime();
280271

281-
if (allNodes().size() < 200) {
272+
if (allNodes().size() < 200)
282273
ENUMERATE_ (Node, inode, allNodes()) {
283274
Node node = *inode;
284275
info() << "u[" << node.localId() << "][" << node.uniqueId() << "] = " << m_u[node];
285276
}
286-
}
287277

288278
String filename = options()->resultFile();
289279
const double epsilon = 1.0e-4;
@@ -295,7 +285,7 @@ _validateResults()
295285
checkNodeResultFile(traceMng(), filename, m_u, epsilon, min_value_to_test);
296286

297287
elapsedTime = platform::getRealTime() - elapsedTime;
298-
ArcaneFemFunctions::GeneralFunctions::printArcaneFemTime(traceMng(),"result-validation", elapsedTime);
288+
ArcaneFemFunctions::GeneralFunctions::printArcaneFemTime(traceMng(), "result-validation", elapsedTime);
299289
}
300290

301291
/*---------------------------------------------------------------------------*/

modules/acoustics/FemModule.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,16 @@ class FemModule
7676
IItemFamily* m_dof_family = nullptr;
7777
FemDoFsOnNodes m_dofs_on_nodes;
7878

79+
String m_petsc_flags;
80+
String m_matrix_format = "DOK";
81+
82+
bool m_assemble_linear_system = true;
83+
bool m_solve_linear_system = true;
84+
bool m_cross_validation = true;
85+
7986
void _doStationarySolve();
8087
void _getMaterialParameters();
81-
void _assembleBilinearOperatorTria3();
88+
void _assembleBilinearOperator();
8289
void _solve();
8390
void _assembleLinearOperator();
8491
void _updateVariables();

0 commit comments

Comments
 (0)