Skip to content

Use CellDataTransfer in MechanicalPhysics#477

Open
masterleinad wants to merge 5 commits into
adamantine-sim:masterfrom
masterleinad:mechanical_physics_cell_data_transfer
Open

Use CellDataTransfer in MechanicalPhysics#477
masterleinad wants to merge 5 commits into
adamantine-sim:masterfrom
masterleinad:mechanical_physics_cell_data_transfer

Conversation

@masterleinad

@masterleinad masterleinad commented May 12, 2026

Copy link
Copy Markdown
Collaborator

We might want to add another test case.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request integrates mesh adaptation for cell data within the MechanicalPhysics class by utilizing the ClosestQuadPointAdaptation utility. Feedback highlights a critical logic error where the adaptation logic fails to account for multiple data components (e.g., stress and back stress) packed into the cell vectors, which could result in incorrect data transfer or crashes. Furthermore, suggestions were made to pass lambda parameters by constant reference to optimize performance during mesh refinement and coarsening.

Comment thread source/MechanicalPhysics.cc
Comment thread source/MechanicalPhysics.cc Outdated
Comment thread source/MechanicalPhysics.cc Outdated
@masterleinad masterleinad force-pushed the mechanical_physics_cell_data_transfer branch from 87a817c to 2150267 Compare May 12, 2026 17:29
@masterleinad masterleinad marked this pull request as ready for review May 13, 2026 12:08
* Object used for interpolating to and from the closest quadrature point in
* the cell data transfer object.
*/
adamantine::ClosestQuadPointAdaptation<dim, dim, std::vector<double>>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
adamantine::ClosestQuadPointAdaptation<dim, dim, std::vector<double>>
ClosestQuadPointAdaptation<dim, dim, std::vector<double>>

@Rombur

Rombur commented May 13, 2026

Copy link
Copy Markdown
Member

We might want to add another test case.

Is this the last thing missing to support AMR? If yes, then we need a test for it.

@masterleinad

Copy link
Copy Markdown
Collaborator Author

Is this the last thing missing to support AMR? If yes, then we need a test for it.

Any suggestions? We are already hitting this path in the thermoelastic integration test case but apparently the output hasn't changed.

@Rombur

Rombur commented May 13, 2026

Copy link
Copy Markdown
Member

The thermoelastic integration tests do not refine the mesh (n_refinement is set to zero). We want a test in test_mechanical_physics and one in test_integration_thermoelastic. For the integration test, just set n_refinement to 1 and look at that the result looks good.

@masterleinad masterleinad marked this pull request as draft May 22, 2026 18:44
@masterleinad

Copy link
Copy Markdown
Collaborator Author

Seeing

40: Test command: /usr/bin/mpiexec "-n" "1" "/app/adamantine_new/adamantine/build/bin/test_integration_thermoelastic"
40: Working Directory: /app/adamantine_new/adamantine/build/tests
40: Test timeout computed to be: 1500
40: Running 2 test cases...
40: Total DoFs: 1200 Local DoFs: 1200
40: Total DoFs: 2529 Local DoFs: 2529
40: Total DoFs: 2526 Local DoFs: 2526
40: Total DoFs: 2520 Local DoFs: 2520
40: Total DoFs: 2517 Local DoFs: 2517
40: Total DoFs: 2505 Local DoFs: 2505
40: Total DoFs: 2490 Local DoFs: 2490
40: Total DoFs: 2463 Local DoFs: 2463
40: Total DoFs: 2424 Local DoFs: 2424
40: Total DoFs: 2298 Local DoFs: 2298
40: Total DoFs: 2154 Local DoFs: 2154
40: Total DoFs: 1932 Local DoFs: 1932
40: Total DoFs: 1713 Local DoFs: 1713
40: Total DoFs: 1398 Local DoFs: 1398
40: Total DoFs: 1272 Local DoFs: 1272
40: Total DoFs: 1098 Local DoFs: 1098
40: Total DoFs: 1014 Local DoFs: 1014
40: Total DoFs: 960 Local DoFs: 960
40: Total DoFs: 936 Local DoFs: 936
40: Total DoFs: 876 Local DoFs: 876
40: Total DoFs: 864 Local DoFs: 864
40: Total DoFs: 828 Local DoFs: 828
40: Total DoFs: 780 Local DoFs: 780
40: Total DoFs: 756 Local DoFs: 756
40: Total DoFs: 744 Local DoFs: 744
40: Total DoFs: 696 Local DoFs: 696
40: Total DoFs: 660 Local DoFs: 660
40: Total DoFs: 624 Local DoFs: 624
40: Total DoFs: 600 Local DoFs: 600
40: Total DoFs: 576 Local DoFs: 576
40: Total DoFs: 528 Local DoFs: 528
40: Total DoFs: 504 Local DoFs: 504
40: Total DoFs: 480 Local DoFs: 480
40: Total DoFs: 432 Local DoFs: 432
40: Total DoFs: 420 Local DoFs: 420
40: Total DoFs: 360 Local DoFs: 360
40: Total DoFs: 336 Local DoFs: 336
40: Total DoFs: 288 Local DoFs: 288
40: Total DoFs: 240 Local DoFs: 240
40: Total DoFs: 192 Local DoFs: 192
40: Total DoFs: 168 Local DoFs: 168
40: Total DoFs: 144 Local DoFs: 144
40: Total DoFs: 96 Local DoFs: 96
40: Total DoFs: 72 Local DoFs: 72
40: Total DoFs: 0 Local DoFs: 0
40: 
40: --------------------------------------------------------
40: An error occurred in line <3076> of file </scratch/source/dealii/source/dofs/dof_tools_constraints.cc> in function
40:     void dealii::DoFTools::make_hanging_node_constraints(const dealii::DoFHandler<dim, spacedim>&, dealii::AffineConstraints<number>&) [with int dim = 3; int spacedim = 3; number = double]
40: The violated condition was: 
40:     dof_handler.has_active_dofs()
40: Additional information: 
40:     The given DoFHandler does not have any DoFs. Did you forget to call
40:     dof_handler.distribute_dofs()?

For some reason we are losing degrees of freedoms when enabling more refinements until none after left.

@Rombur

Rombur commented May 22, 2026

Copy link
Copy Markdown
Member

There is an option to coarsen the mesh: coarsen_after_beam but it should be false by default.

@masterleinad

Copy link
Copy Markdown
Collaborator Author

The issue isn't that we are coarsening but that fewer and fewer cells are enabled for the mechanical part. Printing the cells on refinement and the number of DoFs for distribute_dofs:

40: Running 2 test cases...
40: Thermal Total DoFs: 7300 Local DoFs: 7300
40: Total DoFs: 1200 Local DoFs: 1200
40: n_cells: 576
40: Thermal Total DoFs: 17059 Local DoFs: 17059
40: n_cells: 576
40: Thermal Total DoFs: 17059 Local DoFs: 17059
40: Total DoFs: 2529 Local DoFs: 2529
40: Total DoFs: 2526 Local DoFs: 2526
40: Total DoFs: 2520 Local DoFs: 2520
40: Total DoFs: 2517 Local DoFs: 2517
40: Total DoFs: 2505 Local DoFs: 2505
40: Total DoFs: 2490 Local DoFs: 2490
40: Total DoFs: 2463 Local DoFs: 2463
40: Total DoFs: 2424 Local DoFs: 2424
40: Total DoFs: 2298 Local DoFs: 2298
40: Total DoFs: 2154 Local DoFs: 2154
40: Total DoFs: 1932 Local DoFs: 1932
40: Total DoFs: 1713 Local DoFs: 1713
40: Total DoFs: 1398 Local DoFs: 1398
40: Total DoFs: 1272 Local DoFs: 1272
40: Total DoFs: 1098 Local DoFs: 1098
40: Total DoFs: 1014 Local DoFs: 1014
40: Total DoFs: 960 Local DoFs: 960
40: Total DoFs: 936 Local DoFs: 936
40: Total DoFs: 876 Local DoFs: 876
40: Total DoFs: 864 Local DoFs: 864
40: Total DoFs: 828 Local DoFs: 828
40: Total DoFs: 780 Local DoFs: 780
40: Total DoFs: 756 Local DoFs: 756
40: Total DoFs: 744 Local DoFs: 744
40: Total DoFs: 696 Local DoFs: 696
40: Total DoFs: 660 Local DoFs: 660
40: Total DoFs: 624 Local DoFs: 624
40: Total DoFs: 600 Local DoFs: 600
40: Total DoFs: 576 Local DoFs: 576
40: Total DoFs: 528 Local DoFs: 528
40: Total DoFs: 504 Local DoFs: 504
40: Total DoFs: 480 Local DoFs: 480
40: Total DoFs: 432 Local DoFs: 432
40: Total DoFs: 420 Local DoFs: 420
40: Total DoFs: 360 Local DoFs: 360
40: Total DoFs: 336 Local DoFs: 336
40: Total DoFs: 288 Local DoFs: 288
40: Total DoFs: 240 Local DoFs: 240
40: Total DoFs: 192 Local DoFs: 192
40: Total DoFs: 168 Local DoFs: 168
40: Total DoFs: 144 Local DoFs: 144
40: Total DoFs: 96 Local DoFs: 96
40: Total DoFs: 72 Local DoFs: 72
40: Total DoFs: 0 Local DoFs: 0

@masterleinad

Copy link
Copy Markdown
Collaborator Author

With

diff --git a/application/adamantine.hh b/application/adamantine.hh
index 75782b0..d09cb8c 100644
--- a/application/adamantine.hh
+++ b/application/adamantine.hh
@@ -437,6 +437,7 @@ void refine_and_transfer(
 #endif
   // Execute the refinement
   triangulation.execute_coarsening_and_refinement();
+  std::cout << "n_cells: " << triangulation.n_cells() << std::endl;
 #ifdef ADAMANTINE_WITH_CALIPER
   CALI_MARK_END("refine triangulation");
 #endif
@@ -1186,6 +1187,7 @@ run(MPI_Comm const &communicator, boost::property_tree::ptree const &database,
                   const_cast<dealii::Triangulation<dim> &>(
                       thermal_physics->get_dof_handler().get_triangulation()));
           triangulation.execute_coarsening_and_refinement();
+          std::cout << "n_cells: " << triangulation.n_cells() << std::endl;
 #ifdef ADAMANTINE_WITH_CALIPER
           CALI_MARK_END("refine triangulation");
 #endif
@@ -2102,6 +2104,7 @@ run_ensemble(MPI_Comm const &global_communicator,
                       dof_handler.get_triangulation()));
 
           triangulation.execute_coarsening_and_refinement();
+          std::cout << "n_cells: " << triangulation.n_cells() << std::endl;
 #ifdef ADAMANTINE_WITH_CALIPER
           CALI_MARK_END("refine triangulation");
 #endif
diff --git a/source/MechanicalPhysics.cc b/source/MechanicalPhysics.cc
index 88c9943..bee7ffa 100644
--- a/source/MechanicalPhysics.cc
+++ b/source/MechanicalPhysics.cc
@@ -66,6 +66,8 @@ MechanicalPhysics<dim, n_materials, p_order, MaterialStates, MemorySpaceType>::
   // material.
   unsigned int n_active_cells =
       _dof_handler.get_triangulation().n_active_cells();
+  unsigned int solid_cells = 0;
+  unsigned int liquid_cells = 0;
   for (auto const &cell :
        dealii::filter_iterators(_dof_handler.active_cell_iterators(),
                                 dealii::IteratorFilters::LocallyOwnedCell()))
@@ -74,12 +76,15 @@ MechanicalPhysics<dim, n_materials, p_order, MaterialStates, MemorySpaceType>::
             cell, MaterialStates::State::solid) > 0.99)
     {
       cell->set_active_fe_index(0);
+      ++solid_cells;
     }
     else
     {
       cell->set_active_fe_index(1);
+      ++liquid_cells;
     }
   }
+  std::cout << "active_cells: " << n_active_cells << " solid: " << solid_cells << " liquid: " << liquid_cells << std::endl;
 
   // Create the mechanical operator
   _mechanical_operator =
@@ -121,6 +126,7 @@ void MechanicalPhysics<dim, n_materials, p_order, MaterialStates,
   _dof_handler.distribute_dofs(_fe_collection);
   dealii::IndexSet locally_relevant_dofs =
       dealii::DoFTools::extract_locally_relevant_dofs(_dof_handler);
+  std::cout << "Total DoFs: " << locally_relevant_dofs.size() << " Local DoFs: " << locally_relevant_dofs.n_elements() << std::endl;
   dealii::IndexSet locally_owned_dofs = _dof_handler.locally_owned_dofs();
   _affine_constraints.reinit(locally_owned_dofs, locally_relevant_dofs);
   dealii::DoFTools::make_hanging_node_constraints(_dof_handler,
@@ -350,6 +356,11 @@ void MechanicalPhysics<dim, n_materials, p_order, MaterialStates,
     }
   }
 
+  unsigned int n_active_cells =
+        _dof_handler.get_triangulation().n_active_cells();
+   unsigned int solid_cells = 0;
+    unsigned int liquid_cells = 0;
+
   // Now we can update the fe indices and the plastic variables.
   for (auto const &cell : _dof_handler.active_cell_iterators())
   {
@@ -387,7 +398,11 @@ void MechanicalPhysics<dim, n_materials, p_order, MaterialStates,
               std::vector<dealii::SymmetricTensor<2, dim>>(n_quad_pts));
 
           cell->set_active_fe_index(updated_fe_index);
-          rebuild_matrix = true;
+          if (updated_fe_index == 0)
+		  ++solid_cells;
+	  else
+		  ++liquid_cells;
+	  rebuild_matrix = true;
         }
       }
       else
@@ -399,6 +414,7 @@ void MechanicalPhysics<dim, n_materials, p_order, MaterialStates,
 
         // The cell is liquid. We don't need to save the plastic variables.
         cell->set_active_fe_index(1);
+        ++liquid_cells;
         tmp_plastic_internal_variable.push_back(std::vector<double>(
             n_quad_pts, std::numeric_limits<double>::signaling_NaN()));
         tmp_stress.push_back(
@@ -419,6 +435,8 @@ void MechanicalPhysics<dim, n_materials, p_order, MaterialStates,
     ++cell_id;
   }
 
+  std::cout << "active_cells: " << n_active_cells << " solid: " << solid_cells << " liquid: " << liquid_cells << std::endl;
+
   // Check if we need to rebuild the matrix
   rebuild_matrix =
       dealii::Utilities::MPI::logical_or(rebuild_matrix,
diff --git a/source/ThermalPhysics.templates.hh b/source/ThermalPhysics.templates.hh
index ed64f85..9b5d8db 100644
--- a/source/ThermalPhysics.templates.hh
+++ b/source/ThermalPhysics.templates.hh
@@ -515,6 +515,7 @@ void ThermalPhysics<dim, n_materials, p_order, fe_degree, MaterialStates,
   dealii::IndexSet locally_relevant_dofs =
       dealii::DoFTools::extract_locally_relevant_dofs(_dof_handler);
   dealii::IndexSet locally_owned_dofs = _dof_handler.locally_owned_dofs();
+  std::cout << "Thermal Total DoFs: " << locally_relevant_dofs.size() << " Local DoFs: " << locally_relevant_dofs.n_elements() << std::endl;
   _affine_constraints.reinit(locally_owned_dofs, locally_relevant_dofs);
   dealii::DoFTools::make_hanging_node_constraints(_dof_handler,
                                                   _affine_constraints);

the output

40: Test command: /usr/bin/mpiexec "-n" "1" "/app/adamantine_new/adamantine/build/bin/test_integration_thermoelastic"
40: Working Directory: /app/adamantine_new/adamantine/build/tests
40: Test timeout computed to be: 1500
40: Running 2 test cases...
40: active_cells: 216 solid: 216 liquid: 0
40: Thermal Total DoFs: 7300 Local DoFs: 7300
40: active_cells: 216 solid: 0 liquid: 0
40: Total DoFs: 1200 Local DoFs: 1200
40: n_cells: 576
40: Thermal Total DoFs: 17059 Local DoFs: 17059
40: n_cells: 576
40: Thermal Total DoFs: 17059 Local DoFs: 17059
40: active_cells: 531 solid: 0 liquid: 0
40: Total DoFs: 2529 Local DoFs: 2529
40: active_cells: 531 solid: 0 liquid: 0
40: active_cells: 531 solid: 0 liquid: 0
40: active_cells: 531 solid: 0 liquid: 4
40: Total DoFs: 2526 Local DoFs: 2526
40: active_cells: 531 solid: 0 liquid: 10
40: Total DoFs: 2520 Local DoFs: 2520
40: active_cells: 531 solid: 0 liquid: 12
40: Total DoFs: 2517 Local DoFs: 2517
40: active_cells: 531 solid: 0 liquid: 12
40: active_cells: 531 solid: 0 liquid: 24
40: Total DoFs: 2505 Local DoFs: 2505
40: active_cells: 531 solid: 0 liquid: 30
40: Total DoFs: 2490 Local DoFs: 2490
40: active_cells: 531 solid: 0 liquid: 44
40: Total DoFs: 2463 Local DoFs: 2463
40: active_cells: 531 solid: 0 liquid: 60
40: Total DoFs: 2424 Local DoFs: 2424
40: active_cells: 531 solid: 0 liquid: 106
40: Total DoFs: 2298 Local DoFs: 2298
40: active_cells: 531 solid: 0 liquid: 148
40: Total DoFs: 2154 Local DoFs: 2154
40: active_cells: 531 solid: 0 liquid: 212
40: Total DoFs: 1932 Local DoFs: 1932
40: active_cells: 531 solid: 0 liquid: 256
40: Total DoFs: 1713 Local DoFs: 1713
40: active_cells: 531 solid: 0 liquid: 312
40: Total DoFs: 1398 Local DoFs: 1398
40: active_cells: 531 solid: 0 liquid: 332
40: Total DoFs: 1272 Local DoFs: 1272
40: active_cells: 531 solid: 0 liquid: 352
40: Total DoFs: 1098 Local DoFs: 1098
40: active_cells: 531 solid: 0 liquid: 367
40: Total DoFs: 1014 Local DoFs: 1014
40: active_cells: 531 solid: 0 liquid: 372
40: Total DoFs: 960 Local DoFs: 960
40: active_cells: 531 solid: 0 liquid: 375
40: Total DoFs: 936 Local DoFs: 936
40: active_cells: 531 solid: 0 liquid: 387
40: Total DoFs: 876 Local DoFs: 876
40: active_cells: 531 solid: 0 liquid: 390
40: Total DoFs: 864 Local DoFs: 864
40: active_cells: 531 solid: 0 liquid: 397
40: Total DoFs: 828 Local DoFs: 828
40: active_cells: 531 solid: 0 liquid: 405
40: Total DoFs: 780 Local DoFs: 780
40: active_cells: 531 solid: 0 liquid: 408
40: Total DoFs: 756 Local DoFs: 756
40: active_cells: 531 solid: 0 liquid: 411
40: Total DoFs: 744 Local DoFs: 744
40: active_cells: 531 solid: 0 liquid: 420
40: Total DoFs: 696 Local DoFs: 696
40: active_cells: 531 solid: 0 liquid: 426
40: Total DoFs: 660 Local DoFs: 660
40: active_cells: 531 solid: 0 liquid: 432
40: Total DoFs: 624 Local DoFs: 624
40: active_cells: 531 solid: 0 liquid: 438
40: Total DoFs: 600 Local DoFs: 600
40: active_cells: 531 solid: 0 liquid: 445
40: Total DoFs: 576 Local DoFs: 576
40: active_cells: 531 solid: 0 liquid: 450
40: Total DoFs: 528 Local DoFs: 528
40: active_cells: 531 solid: 0 liquid: 456
40: Total DoFs: 504 Local DoFs: 504
40: active_cells: 531 solid: 0 liquid: 459
40: Total DoFs: 480 Local DoFs: 480
40: active_cells: 531 solid: 0 liquid: 468
40: Total DoFs: 432 Local DoFs: 432
40: active_cells: 531 solid: 0 liquid: 471
40: Total DoFs: 420 Local DoFs: 420
40: active_cells: 531 solid: 0 liquid: 483
40: Total DoFs: 360 Local DoFs: 360
40: active_cells: 531 solid: 0 liquid: 486
40: Total DoFs: 336 Local DoFs: 336
40: active_cells: 531 solid: 0 liquid: 492
40: Total DoFs: 288 Local DoFs: 288
40: active_cells: 531 solid: 0 liquid: 496
40: Total DoFs: 240 Local DoFs: 240
40: active_cells: 531 solid: 0 liquid: 504
40: Total DoFs: 192 Local DoFs: 192
40: active_cells: 531 solid: 0 liquid: 504
40: active_cells: 531 solid: 0 liquid: 510
40: Total DoFs: 168 Local DoFs: 168
40: active_cells: 531 solid: 0 liquid: 513
40: Total DoFs: 144 Local DoFs: 144
40: active_cells: 531 solid: 0 liquid: 513
40: active_cells: 531 solid: 0 liquid: 513
40: active_cells: 531 solid: 0 liquid: 522
40: Total DoFs: 96 Local DoFs: 96
40: active_cells: 531 solid: 0 liquid: 522
40: active_cells: 531 solid: 0 liquid: 525
40: Total DoFs: 72 Local DoFs: 72
40: active_cells: 531 solid: 0 liquid: 531
40: Total DoFs: 0 Local DoFs: 0 

shows that more and more cells get liquified.

@masterleinad masterleinad force-pushed the mechanical_physics_cell_data_transfer branch from b681fc1 to 180c24e Compare May 28, 2026 16:45
@masterleinad masterleinad marked this pull request as ready for review June 1, 2026 18:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants