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
177168void 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/* ---------------------------------------------------------------------------*/
0 commit comments