From 35f4f9dbd67afbb7b12aba8cf056b196383fc31a Mon Sep 17 00:00:00 2001 From: Gary Hu Date: Thu, 2 Oct 2025 16:40:09 -0500 Subject: [PATCH 1/3] Allow specifying element range in project_vector --- include/systems/system.h | 22 ++++++---- src/systems/system_projection.C | 73 +++++++++++++++++++++------------ 2 files changed, 61 insertions(+), 34 deletions(-) diff --git a/include/systems/system.h b/include/systems/system.h index f2208f12693..af9bc76e202 100644 --- a/include/systems/system.h +++ b/include/systems/system.h @@ -40,6 +40,7 @@ #include #include #include +#include // This define may be useful in --disable-optional builds when it is // possible that libmesh will not have any solvers available. @@ -561,7 +562,8 @@ class System : public ReferenceCountedObject, void project_vector (NumericVector & new_vector, FunctionBase * f, FunctionBase * g = nullptr, - int is_adjoint = -1) const; + int is_adjoint = -1, + std::optional active_local_range = std::nullopt) const; /** * Projects arbitrary functions onto a vector of degree of freedom @@ -577,7 +579,8 @@ class System : public ReferenceCountedObject, void project_vector (NumericVector & new_vector, FEMFunctionBase * f, FEMFunctionBase * g = nullptr, - int is_adjoint = -1) const; + int is_adjoint = -1, + std::optional active_local_range = std::nullopt) const; /** * Projects arbitrary functions onto a vector of degree of freedom @@ -594,7 +597,8 @@ class System : public ReferenceCountedObject, GradientFunctionPointer gptr, const Parameters & parameters, NumericVector & new_vector, - int is_adjoint = -1) const; + int is_adjoint = -1, + std::optional active_local_range = std::nullopt) const; /** * Projects arbitrary boundary functions onto a vector of degree of @@ -651,7 +655,8 @@ class System : public ReferenceCountedObject, NumericVector & new_vector, FunctionBase * f, FunctionBase * g = nullptr, - int is_adjoint = -1) const; + int is_adjoint = -1, + std::optional active_local_range = std::nullopt) const; /** * Projects arbitrary boundary functions onto a vector of degree of @@ -674,7 +679,8 @@ class System : public ReferenceCountedObject, GradientFunctionPointer gptr, const Parameters & parameters, NumericVector & new_vector, - int is_adjoint = -1) const; + int is_adjoint = -1, + std::optional active_local_range = std::nullopt) const; /** * \returns The system number. @@ -1984,7 +1990,8 @@ class System : public ReferenceCountedObject, * primal constraints if is_adjoint is non-negative. */ void project_vector (NumericVector &, - int is_adjoint = -1) const; + int is_adjoint = -1, + std::optional active_local_range = std::nullopt) const; /** * Projects the vector defined on the old mesh onto the @@ -1996,7 +2003,8 @@ class System : public ReferenceCountedObject, */ void project_vector (const NumericVector &, NumericVector &, - int is_adjoint = -1) const; + int is_adjoint = -1, + std::optional active_local_range = std::nullopt) const; /** * Whether this object should condense out constrained degrees of freedom diff --git a/src/systems/system_projection.C b/src/systems/system_projection.C index 3970fd4a446..9b13503741f 100644 --- a/src/systems/system_projection.C +++ b/src/systems/system_projection.C @@ -245,7 +245,8 @@ public: // ------------------------------------------------------------ // System implementation void System::project_vector (NumericVector & vector, - int is_adjoint) const + int is_adjoint, + std::optional active_local_range) const { // Create a copy of the vector, which currently // contains the old data. @@ -253,7 +254,7 @@ void System::project_vector (NumericVector & vector, old_vector (vector.clone()); // Project the old vector to the new vector - this->project_vector (*old_vector, vector, is_adjoint); + this->project_vector (*old_vector, vector, is_adjoint, active_local_range); } @@ -264,7 +265,8 @@ void System::project_vector (NumericVector & vector, */ void System::project_vector (const NumericVector & old_v, NumericVector & new_v, - int is_adjoint) const + int is_adjoint, + std::optional active_local_range) const { LOG_SCOPE ("project_vector(old,new)", "System"); @@ -285,9 +287,12 @@ void System::project_vector (const NumericVector & old_v, std::unique_ptr> local_old_vector_built; const NumericVector * old_vector_ptr = nullptr; - ConstElemRange active_local_elem_range - (this->get_mesh().active_local_elements_begin(), - this->get_mesh().active_local_elements_end()); + if (!active_local_range) + { + active_local_range.emplace + (this->get_mesh().active_local_elements_begin(), + this->get_mesh().active_local_elements_end()); + } // If the old vector was uniprocessor, make the new // vector uniprocessor @@ -304,7 +309,7 @@ void System::project_vector (const NumericVector & old_v, { // Build a send list for efficient localization BuildProjectionList projection_list(*this); - Threads::parallel_reduce (active_local_elem_range, + Threads::parallel_reduce (active_local_range.value(), projection_list); // Create a sorted, unique send_list @@ -328,7 +333,7 @@ void System::project_vector (const NumericVector & old_v, { // Build a send list for efficient localization BuildProjectionList projection_list(*this); - Threads::parallel_reduce (active_local_elem_range, + Threads::parallel_reduce (active_local_range.value(), projection_list); // Create a sorted, unique send_list @@ -389,7 +394,7 @@ void System::project_vector (const NumericVector & old_v, g(*this, old_vector, ®ular_vars); FEMProjector projector(*this, f, &g, setter, regular_vars); - projector.project(active_local_elem_range); + projector.project(active_local_range.value()); } if (!vector_vars.empty()) @@ -403,7 +408,7 @@ void System::project_vector (const NumericVector & old_v, OldSolutionValue g_vector(*this, old_vector, &vector_vars); FEMVectorProjector vector_projector(*this, f_vector, &g_vector, setter, vector_vars); - vector_projector.project(active_local_elem_range); + vector_projector.project(active_local_range.value()); } // Copy the SCALAR dofs from old_vector to new_vector @@ -1068,11 +1073,12 @@ void System::project_vector (ValueFunctionPointer fptr, GradientFunctionPointer gptr, const Parameters & function_parameters, NumericVector & new_vector, - int is_adjoint) const + int is_adjoint, + std::optional active_local_range) const { WrappedFunction f(*this, fptr, &function_parameters); WrappedFunction g(*this, gptr, &function_parameters); - this->project_vector(new_vector, &f, &g, is_adjoint); + this->project_vector(new_vector, &f, &g, is_adjoint, active_local_range); } /** @@ -1082,7 +1088,8 @@ void System::project_vector (ValueFunctionPointer fptr, void System::project_vector (NumericVector & new_vector, FunctionBase * f, FunctionBase * g, - int is_adjoint) const + int is_adjoint, + std::optional active_local_range) const { LOG_SCOPE ("project_vector(FunctionBase)", "System"); @@ -1094,10 +1101,10 @@ void System::project_vector (NumericVector & new_vector, { WrappedFunctor g_fem(*g); - this->project_vector(new_vector, &f_fem, &g_fem, is_adjoint); + this->project_vector(new_vector, &f_fem, &g_fem, is_adjoint, active_local_range); } else - this->project_vector(new_vector, &f_fem, nullptr, is_adjoint); + this->project_vector(new_vector, &f_fem, nullptr, is_adjoint, active_local_range); } @@ -1108,15 +1115,19 @@ void System::project_vector (NumericVector & new_vector, void System::project_vector (NumericVector & new_vector, FEMFunctionBase * f, FEMFunctionBase * g, - int is_adjoint) const + int is_adjoint, + std::optional active_local_range) const { LOG_SCOPE ("project_fem_vector()", "System"); libmesh_assert (f); - ConstElemRange active_local_range - (this->get_mesh().active_local_elements_begin(), - this->get_mesh().active_local_elements_end() ); + if (!active_local_range) + { + active_local_range.emplace + (this->get_mesh().active_local_elements_begin(), + this->get_mesh().active_local_elements_end()); + } VectorSetAction setter(new_vector); @@ -1137,12 +1148,12 @@ void System::project_vector (NumericVector & new_vector, FEMFunctionWrapper gw(*g); FEMProjector projector(*this, fw, &gw, setter, vars); - projector.project(active_local_range); + projector.project(active_local_range.value()); } else { FEMProjector projector(*this, fw, nullptr, setter, vars); - projector.project(active_local_range); + projector.project(active_local_range.value()); } // Also, load values into the SCALAR dofs @@ -1197,7 +1208,7 @@ void System::project_vector (NumericVector & new_vector, { // Look for a spline node: a NodeElem with a rational variable // on it. - for (auto & elem : active_local_range) + for (auto & elem : active_local_range.value()) if (elem->type() == NODEELEM) for (auto rational_var : rational_vars) if (rational_var->active_on_subdomain(elem->subdomain_id())) @@ -1274,12 +1285,13 @@ void System::boundary_project_vector (const std::set & b, GradientFunctionPointer gptr, const Parameters & function_parameters, NumericVector & new_vector, - int is_adjoint) const + int is_adjoint, + std::optional active_local_range) const { WrappedFunction f(*this, fptr, &function_parameters); WrappedFunction g(*this, gptr, &function_parameters); this->boundary_project_vector(b, variables, new_vector, &f, &g, - is_adjoint); + is_adjoint, active_local_range); } /** @@ -1291,13 +1303,20 @@ void System::boundary_project_vector (const std::set & b, NumericVector & new_vector, FunctionBase * f, FunctionBase * g, - int is_adjoint) const + int is_adjoint, + std::optional active_local_range) const { LOG_SCOPE ("boundary_project_vector()", "System"); + if (!active_local_range) + { + active_local_range.emplace + (this->get_mesh().active_local_elements_begin(), + this->get_mesh().active_local_elements_end()); + } + Threads::parallel_for - (ConstElemRange (this->get_mesh().active_local_elements_begin(), - this->get_mesh().active_local_elements_end() ), + (active_local_range.value(), BoundaryProjectSolution(b, variables, *this, f, g, this->get_equation_systems().parameters, new_vector) From 5ca5890a4e3c0a3e3bde7c8f63a50cc77fcff318 Mon Sep 17 00:00:00 2001 From: Cheng-Hau Yang Date: Wed, 14 Jan 2026 12:00:33 -0600 Subject: [PATCH 2/3] (a) specifying element range in project_solution as well (b) add a test to project solution onto specific elements --- include/systems/system.h | 33 ++++++-- src/systems/system_projection.C | 26 +++--- tests/Makefile.am | 1 + tests/Makefile.in | 123 +++++++++++++++++++++++++-- tests/mesh/project_solution_test.C | 128 +++++++++++++++++++++++++++++ 5 files changed, 290 insertions(+), 21 deletions(-) create mode 100644 tests/mesh/project_solution_test.C diff --git a/include/systems/system.h b/include/systems/system.h index af9bc76e202..44179763696 100644 --- a/include/systems/system.h +++ b/include/systems/system.h @@ -515,9 +515,12 @@ class System : public ReferenceCountedObject, * user-provided cloneable functors. * A gradient \p g is only required/used for projecting onto finite * element spaces with continuous derivatives. + * elem_range \p active_local_range, if provided, indicates the range of elements + * over which to perform the projection. */ void project_solution (FunctionBase * f, - FunctionBase * g = nullptr) const; + FunctionBase * g = nullptr, + std::optional active_local_range = std::nullopt) const; /** * Projects arbitrary functions onto the current solution. @@ -525,9 +528,12 @@ class System : public ReferenceCountedObject, * user-provided cloneable functors. * A gradient \p g is only required/used for projecting onto finite * element spaces with continuous derivatives. + * elem_range \p active_local_range, if provided, indicates the range of elements + * over which to perform the projection. */ void project_solution (FEMFunctionBase * f, - FEMFunctionBase * g = nullptr) const; + FEMFunctionBase * g = nullptr, + std::optional active_local_range = std::nullopt) const; /** * Projects arbitrary functions onto the current solution. @@ -546,7 +552,8 @@ class System : public ReferenceCountedObject, const std::string & unknown_name); void project_solution (ValueFunctionPointer fptr, GradientFunctionPointer gptr, - const Parameters & parameters) const; + const Parameters & parameters, + std::optional active_local_range = std::nullopt) const; /** * Projects arbitrary functions onto a vector of degree of freedom @@ -555,6 +562,8 @@ class System : public ReferenceCountedObject, * user-provided cloneable functors. * A gradient \p g is only required/used for projecting onto finite * element spaces with continuous derivatives. + * elem_range \p active_local_range, if provided, indicates the range of elements + * over which to perform the projection. * * Constrain the new vector using the requested adjoint rather than * primal constraints if is_adjoint is non-negative. @@ -572,6 +581,8 @@ class System : public ReferenceCountedObject, * user-provided cloneable functors. * A gradient \p g is only required/used for projecting onto finite * element spaces with continuous derivatives. + * elem_range \p active_local_range, if provided, indicates the range of elements + * over which to perform the projection. * * Constrain the new vector using the requested adjoint rather than * primal constraints if is_adjoint is non-negative. @@ -589,6 +600,8 @@ class System : public ReferenceCountedObject, * represented by function pointers. * A gradient \p gptr is only required/used for projecting onto * finite element spaces with continuous derivatives. + * elem_range \p active_local_range, if provided, indicates the range of elements + * over which to perform the projection. * * Constrain the new vector using the requested adjoint rather than * primal constraints if is_adjoint is non-negative. @@ -611,11 +624,14 @@ class System : public ReferenceCountedObject, * user-provided cloneable functors. * A gradient \p g is only required/used for projecting onto finite * element spaces with continuous derivatives. + * elem_range \p active_local_range, if provided, indicates the range of elements + * over which to perform the projection. */ void boundary_project_solution (const std::set & b, const std::vector & variables, FunctionBase * f, - FunctionBase * g = nullptr); + FunctionBase * g = nullptr, + std::optional active_local_range = std::nullopt); /** * Projects arbitrary boundary functions onto a vector of degree of @@ -628,12 +644,15 @@ class System : public ReferenceCountedObject, * represented by function pointers. * A gradient \p gptr is only required/used for projecting onto * finite element spaces with continuous derivatives. + * elem_range \p active_local_range, if provided, indicates the range of elements + * over which to perform the projection. */ void boundary_project_solution (const std::set & b, const std::vector & variables, ValueFunctionPointer fptr, GradientFunctionPointer gptr, - const Parameters & parameters); + const Parameters & parameters, + std::optional active_local_range = std::nullopt); /** * Projects arbitrary boundary functions onto a vector of degree of @@ -646,6 +665,8 @@ class System : public ReferenceCountedObject, * user-provided cloneable functors. * A gradient \p g is only required/used for projecting onto finite * element spaces with continuous derivatives. + * elem_range \p active_local_range, if provided, indicates the range of elements + * over which to perform the projection. * * Constrain the new vector using the requested adjoint rather than * primal constraints if is_adjoint is non-negative. @@ -669,6 +690,8 @@ class System : public ReferenceCountedObject, * represented by function pointers. * A gradient \p gptr is only required/used for projecting onto * finite element spaces with continuous derivatives. + * elem_range \p active_local_range, if provided, indicates the range of elements + * over which to perform the projection. * * Constrain the new vector using the requested adjoint rather than * primal constraints if is_adjoint is non-negative. diff --git a/src/systems/system_projection.C b/src/systems/system_projection.C index 9b13503741f..727d9d9e87d 100644 --- a/src/systems/system_projection.C +++ b/src/systems/system_projection.C @@ -1031,11 +1031,12 @@ void System::projection_matrix (SparseMatrix & proj_mat) const */ void System::project_solution (ValueFunctionPointer fptr, GradientFunctionPointer gptr, - const Parameters & function_parameters) const + const Parameters & function_parameters, + std::optional active_local_range) const { WrappedFunction f(*this, fptr, &function_parameters); WrappedFunction g(*this, gptr, &function_parameters); - this->project_solution(&f, &g); + this->project_solution(&f, &g, active_local_range); } @@ -1044,9 +1045,10 @@ void System::project_solution (ValueFunctionPointer fptr, * projections and nodal interpolations on each element. */ void System::project_solution (FunctionBase * f, - FunctionBase * g) const + FunctionBase * g, + std::optional active_local_range) const { - this->project_vector(*solution, f, g); + this->project_vector(*solution, f, g, /*is_adjoint=*/-1, active_local_range); solution->localize(*current_local_solution, _dof_map->get_send_list()); } @@ -1057,9 +1059,10 @@ void System::project_solution (FunctionBase * f, * projections and nodal interpolations on each element. */ void System::project_solution (FEMFunctionBase * f, - FEMFunctionBase * g) const + FEMFunctionBase * g, + std::optional active_local_range) const { - this->project_vector(*solution, f, g); + this->project_vector(*solution, f, g, /*is_adjoint=*/-1, active_local_range); solution->localize(*current_local_solution, _dof_map->get_send_list()); } @@ -1248,11 +1251,13 @@ void System::boundary_project_solution (const std::set & b, const std::vector & variables, ValueFunctionPointer fptr, GradientFunctionPointer gptr, - const Parameters & function_parameters) + const Parameters & function_parameters, + std::optional active_local_range) + { WrappedFunction f(*this, fptr, &function_parameters); WrappedFunction g(*this, gptr, &function_parameters); - this->boundary_project_solution(b, variables, &f, &g); + this->boundary_project_solution(b, variables, &f, &g, active_local_range); } @@ -1264,9 +1269,10 @@ void System::boundary_project_solution (const std::set & b, void System::boundary_project_solution (const std::set & b, const std::vector & variables, FunctionBase * f, - FunctionBase * g) + FunctionBase * g, + std::optional active_local_range) { - this->boundary_project_vector(b, variables, *solution, f, g); + this->boundary_project_vector(b, variables, *solution, f, g, -1 /*is_adjoint*/, active_local_range); solution->localize(*current_local_solution); } diff --git a/tests/Makefile.am b/tests/Makefile.am index 6f27e83ae14..0c4a85fea3c 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -94,6 +94,7 @@ unit_tests_sources = \ mesh/write_nodeset_data.C \ mesh/write_edgeset_data.C \ mesh/write_vec_and_scalar.C \ + mesh/project_solution_test.C \ numerics/composite_function_test.C \ numerics/coupling_matrix_test.C \ numerics/distributed_vector_test.C \ diff --git a/tests/Makefile.in b/tests/Makefile.in index 741fc6a7fc0..72024a3bdc6 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -224,7 +224,8 @@ am__unit_tests_dbg_SOURCES_DIST = driver.C libmesh_cppunit.h \ mesh/mapped_subdomain_partitioner_test.C \ mesh/write_elemset_data.C mesh/write_sideset_data.C \ mesh/write_nodeset_data.C mesh/write_edgeset_data.C \ - mesh/write_vec_and_scalar.C numerics/composite_function_test.C \ + mesh/write_vec_and_scalar.C mesh/project_solution_test.C \ + numerics/composite_function_test.C \ numerics/coupling_matrix_test.C \ numerics/distributed_vector_test.C \ numerics/eigen_sparse_vector_test.C \ @@ -333,6 +334,7 @@ am__objects_2 = unit_tests_dbg-driver.$(OBJEXT) \ mesh/unit_tests_dbg-write_nodeset_data.$(OBJEXT) \ mesh/unit_tests_dbg-write_edgeset_data.$(OBJEXT) \ mesh/unit_tests_dbg-write_vec_and_scalar.$(OBJEXT) \ + mesh/unit_tests_dbg-project_solution_test.$(OBJEXT) \ numerics/unit_tests_dbg-composite_function_test.$(OBJEXT) \ numerics/unit_tests_dbg-coupling_matrix_test.$(OBJEXT) \ numerics/unit_tests_dbg-distributed_vector_test.$(OBJEXT) \ @@ -427,7 +429,8 @@ am__unit_tests_devel_SOURCES_DIST = driver.C libmesh_cppunit.h \ mesh/mapped_subdomain_partitioner_test.C \ mesh/write_elemset_data.C mesh/write_sideset_data.C \ mesh/write_nodeset_data.C mesh/write_edgeset_data.C \ - mesh/write_vec_and_scalar.C numerics/composite_function_test.C \ + mesh/write_vec_and_scalar.C mesh/project_solution_test.C \ + numerics/composite_function_test.C \ numerics/coupling_matrix_test.C \ numerics/distributed_vector_test.C \ numerics/eigen_sparse_vector_test.C \ @@ -535,6 +538,7 @@ am__objects_4 = unit_tests_devel-driver.$(OBJEXT) \ mesh/unit_tests_devel-write_nodeset_data.$(OBJEXT) \ mesh/unit_tests_devel-write_edgeset_data.$(OBJEXT) \ mesh/unit_tests_devel-write_vec_and_scalar.$(OBJEXT) \ + mesh/unit_tests_devel-project_solution_test.$(OBJEXT) \ numerics/unit_tests_devel-composite_function_test.$(OBJEXT) \ numerics/unit_tests_devel-coupling_matrix_test.$(OBJEXT) \ numerics/unit_tests_devel-distributed_vector_test.$(OBJEXT) \ @@ -625,7 +629,8 @@ am__unit_tests_oprof_SOURCES_DIST = driver.C libmesh_cppunit.h \ mesh/mapped_subdomain_partitioner_test.C \ mesh/write_elemset_data.C mesh/write_sideset_data.C \ mesh/write_nodeset_data.C mesh/write_edgeset_data.C \ - mesh/write_vec_and_scalar.C numerics/composite_function_test.C \ + mesh/write_vec_and_scalar.C mesh/project_solution_test.C \ + numerics/composite_function_test.C \ numerics/coupling_matrix_test.C \ numerics/distributed_vector_test.C \ numerics/eigen_sparse_vector_test.C \ @@ -733,6 +738,7 @@ am__objects_6 = unit_tests_oprof-driver.$(OBJEXT) \ mesh/unit_tests_oprof-write_nodeset_data.$(OBJEXT) \ mesh/unit_tests_oprof-write_edgeset_data.$(OBJEXT) \ mesh/unit_tests_oprof-write_vec_and_scalar.$(OBJEXT) \ + mesh/unit_tests_oprof-project_solution_test.$(OBJEXT) \ numerics/unit_tests_oprof-composite_function_test.$(OBJEXT) \ numerics/unit_tests_oprof-coupling_matrix_test.$(OBJEXT) \ numerics/unit_tests_oprof-distributed_vector_test.$(OBJEXT) \ @@ -823,7 +829,8 @@ am__unit_tests_opt_SOURCES_DIST = driver.C libmesh_cppunit.h \ mesh/mapped_subdomain_partitioner_test.C \ mesh/write_elemset_data.C mesh/write_sideset_data.C \ mesh/write_nodeset_data.C mesh/write_edgeset_data.C \ - mesh/write_vec_and_scalar.C numerics/composite_function_test.C \ + mesh/write_vec_and_scalar.C mesh/project_solution_test.C \ + numerics/composite_function_test.C \ numerics/coupling_matrix_test.C \ numerics/distributed_vector_test.C \ numerics/eigen_sparse_vector_test.C \ @@ -931,6 +938,7 @@ am__objects_8 = unit_tests_opt-driver.$(OBJEXT) \ mesh/unit_tests_opt-write_nodeset_data.$(OBJEXT) \ mesh/unit_tests_opt-write_edgeset_data.$(OBJEXT) \ mesh/unit_tests_opt-write_vec_and_scalar.$(OBJEXT) \ + mesh/unit_tests_opt-project_solution_test.$(OBJEXT) \ numerics/unit_tests_opt-composite_function_test.$(OBJEXT) \ numerics/unit_tests_opt-coupling_matrix_test.$(OBJEXT) \ numerics/unit_tests_opt-distributed_vector_test.$(OBJEXT) \ @@ -1021,7 +1029,8 @@ am__unit_tests_prof_SOURCES_DIST = driver.C libmesh_cppunit.h \ mesh/mapped_subdomain_partitioner_test.C \ mesh/write_elemset_data.C mesh/write_sideset_data.C \ mesh/write_nodeset_data.C mesh/write_edgeset_data.C \ - mesh/write_vec_and_scalar.C numerics/composite_function_test.C \ + mesh/write_vec_and_scalar.C mesh/project_solution_test.C \ + numerics/composite_function_test.C \ numerics/coupling_matrix_test.C \ numerics/distributed_vector_test.C \ numerics/eigen_sparse_vector_test.C \ @@ -1129,6 +1138,7 @@ am__objects_10 = unit_tests_prof-driver.$(OBJEXT) \ mesh/unit_tests_prof-write_nodeset_data.$(OBJEXT) \ mesh/unit_tests_prof-write_edgeset_data.$(OBJEXT) \ mesh/unit_tests_prof-write_vec_and_scalar.$(OBJEXT) \ + mesh/unit_tests_prof-project_solution_test.$(OBJEXT) \ numerics/unit_tests_prof-composite_function_test.$(OBJEXT) \ numerics/unit_tests_prof-coupling_matrix_test.$(OBJEXT) \ numerics/unit_tests_prof-distributed_vector_test.$(OBJEXT) \ @@ -1394,6 +1404,7 @@ am__depfiles_remade = ./$(DEPDIR)/unit_tests_dbg-driver.Po \ mesh/$(DEPDIR)/unit_tests_dbg-mixed_dim_mesh_test.Po \ mesh/$(DEPDIR)/unit_tests_dbg-mixed_order_test.Po \ mesh/$(DEPDIR)/unit_tests_dbg-nodal_neighbors.Po \ + mesh/$(DEPDIR)/unit_tests_dbg-project_solution_test.Po \ mesh/$(DEPDIR)/unit_tests_dbg-simplex_refinement_test.Po \ mesh/$(DEPDIR)/unit_tests_dbg-slit_mesh_test.Po \ mesh/$(DEPDIR)/unit_tests_dbg-spatial_dimension_test.Po \ @@ -1433,6 +1444,7 @@ am__depfiles_remade = ./$(DEPDIR)/unit_tests_dbg-driver.Po \ mesh/$(DEPDIR)/unit_tests_devel-mixed_dim_mesh_test.Po \ mesh/$(DEPDIR)/unit_tests_devel-mixed_order_test.Po \ mesh/$(DEPDIR)/unit_tests_devel-nodal_neighbors.Po \ + mesh/$(DEPDIR)/unit_tests_devel-project_solution_test.Po \ mesh/$(DEPDIR)/unit_tests_devel-simplex_refinement_test.Po \ mesh/$(DEPDIR)/unit_tests_devel-slit_mesh_test.Po \ mesh/$(DEPDIR)/unit_tests_devel-spatial_dimension_test.Po \ @@ -1472,6 +1484,7 @@ am__depfiles_remade = ./$(DEPDIR)/unit_tests_dbg-driver.Po \ mesh/$(DEPDIR)/unit_tests_oprof-mixed_dim_mesh_test.Po \ mesh/$(DEPDIR)/unit_tests_oprof-mixed_order_test.Po \ mesh/$(DEPDIR)/unit_tests_oprof-nodal_neighbors.Po \ + mesh/$(DEPDIR)/unit_tests_oprof-project_solution_test.Po \ mesh/$(DEPDIR)/unit_tests_oprof-simplex_refinement_test.Po \ mesh/$(DEPDIR)/unit_tests_oprof-slit_mesh_test.Po \ mesh/$(DEPDIR)/unit_tests_oprof-spatial_dimension_test.Po \ @@ -1511,6 +1524,7 @@ am__depfiles_remade = ./$(DEPDIR)/unit_tests_dbg-driver.Po \ mesh/$(DEPDIR)/unit_tests_opt-mixed_dim_mesh_test.Po \ mesh/$(DEPDIR)/unit_tests_opt-mixed_order_test.Po \ mesh/$(DEPDIR)/unit_tests_opt-nodal_neighbors.Po \ + mesh/$(DEPDIR)/unit_tests_opt-project_solution_test.Po \ mesh/$(DEPDIR)/unit_tests_opt-simplex_refinement_test.Po \ mesh/$(DEPDIR)/unit_tests_opt-slit_mesh_test.Po \ mesh/$(DEPDIR)/unit_tests_opt-spatial_dimension_test.Po \ @@ -1550,6 +1564,7 @@ am__depfiles_remade = ./$(DEPDIR)/unit_tests_dbg-driver.Po \ mesh/$(DEPDIR)/unit_tests_prof-mixed_dim_mesh_test.Po \ mesh/$(DEPDIR)/unit_tests_prof-mixed_order_test.Po \ mesh/$(DEPDIR)/unit_tests_prof-nodal_neighbors.Po \ + mesh/$(DEPDIR)/unit_tests_prof-project_solution_test.Po \ mesh/$(DEPDIR)/unit_tests_prof-simplex_refinement_test.Po \ mesh/$(DEPDIR)/unit_tests_prof-slit_mesh_test.Po \ mesh/$(DEPDIR)/unit_tests_prof-spatial_dimension_test.Po \ @@ -2293,7 +2308,8 @@ unit_tests_sources = driver.C libmesh_cppunit.h stream_redirector.h \ mesh/mapped_subdomain_partitioner_test.C \ mesh/write_elemset_data.C mesh/write_sideset_data.C \ mesh/write_nodeset_data.C mesh/write_edgeset_data.C \ - mesh/write_vec_and_scalar.C numerics/composite_function_test.C \ + mesh/write_vec_and_scalar.C mesh/project_solution_test.C \ + numerics/composite_function_test.C \ numerics/coupling_matrix_test.C \ numerics/distributed_vector_test.C \ numerics/eigen_sparse_vector_test.C \ @@ -2690,6 +2706,8 @@ mesh/unit_tests_dbg-write_edgeset_data.$(OBJEXT): \ mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) mesh/unit_tests_dbg-write_vec_and_scalar.$(OBJEXT): \ mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) +mesh/unit_tests_dbg-project_solution_test.$(OBJEXT): \ + mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) numerics/$(am__dirstamp): @$(MKDIR_P) numerics @: >>numerics/$(am__dirstamp) @@ -2986,6 +3004,8 @@ mesh/unit_tests_devel-write_edgeset_data.$(OBJEXT): \ mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) mesh/unit_tests_devel-write_vec_and_scalar.$(OBJEXT): \ mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) +mesh/unit_tests_devel-project_solution_test.$(OBJEXT): \ + mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) numerics/unit_tests_devel-composite_function_test.$(OBJEXT): \ numerics/$(am__dirstamp) numerics/$(DEPDIR)/$(am__dirstamp) numerics/unit_tests_devel-coupling_matrix_test.$(OBJEXT): \ @@ -3234,6 +3254,8 @@ mesh/unit_tests_oprof-write_edgeset_data.$(OBJEXT): \ mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) mesh/unit_tests_oprof-write_vec_and_scalar.$(OBJEXT): \ mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) +mesh/unit_tests_oprof-project_solution_test.$(OBJEXT): \ + mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) numerics/unit_tests_oprof-composite_function_test.$(OBJEXT): \ numerics/$(am__dirstamp) numerics/$(DEPDIR)/$(am__dirstamp) numerics/unit_tests_oprof-coupling_matrix_test.$(OBJEXT): \ @@ -3482,6 +3504,8 @@ mesh/unit_tests_opt-write_edgeset_data.$(OBJEXT): \ mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) mesh/unit_tests_opt-write_vec_and_scalar.$(OBJEXT): \ mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) +mesh/unit_tests_opt-project_solution_test.$(OBJEXT): \ + mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) numerics/unit_tests_opt-composite_function_test.$(OBJEXT): \ numerics/$(am__dirstamp) numerics/$(DEPDIR)/$(am__dirstamp) numerics/unit_tests_opt-coupling_matrix_test.$(OBJEXT): \ @@ -3730,6 +3754,8 @@ mesh/unit_tests_prof-write_edgeset_data.$(OBJEXT): \ mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) mesh/unit_tests_prof-write_vec_and_scalar.$(OBJEXT): \ mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) +mesh/unit_tests_prof-project_solution_test.$(OBJEXT): \ + mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) numerics/unit_tests_prof-composite_function_test.$(OBJEXT): \ numerics/$(am__dirstamp) numerics/$(DEPDIR)/$(am__dirstamp) numerics/unit_tests_prof-coupling_matrix_test.$(OBJEXT): \ @@ -4053,6 +4079,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_dbg-mixed_dim_mesh_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_dbg-mixed_order_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_dbg-nodal_neighbors.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_dbg-project_solution_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_dbg-simplex_refinement_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_dbg-slit_mesh_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_dbg-spatial_dimension_test.Po@am__quote@ # am--include-marker @@ -4092,6 +4119,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_devel-mixed_dim_mesh_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_devel-mixed_order_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_devel-nodal_neighbors.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_devel-project_solution_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_devel-simplex_refinement_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_devel-slit_mesh_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_devel-spatial_dimension_test.Po@am__quote@ # am--include-marker @@ -4131,6 +4159,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_oprof-mixed_dim_mesh_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_oprof-mixed_order_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_oprof-nodal_neighbors.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_oprof-project_solution_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_oprof-simplex_refinement_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_oprof-slit_mesh_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_oprof-spatial_dimension_test.Po@am__quote@ # am--include-marker @@ -4170,6 +4199,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_opt-mixed_dim_mesh_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_opt-mixed_order_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_opt-nodal_neighbors.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_opt-project_solution_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_opt-simplex_refinement_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_opt-slit_mesh_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_opt-spatial_dimension_test.Po@am__quote@ # am--include-marker @@ -4209,6 +4239,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_prof-mixed_dim_mesh_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_prof-mixed_order_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_prof-nodal_neighbors.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_prof-project_solution_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_prof-simplex_refinement_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_prof-slit_mesh_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_prof-spatial_dimension_test.Po@am__quote@ # am--include-marker @@ -5477,6 +5508,20 @@ mesh/unit_tests_dbg-write_vec_and_scalar.obj: mesh/write_vec_and_scalar.C @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_dbg_CPPFLAGS) $(CPPFLAGS) $(unit_tests_dbg_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_dbg-write_vec_and_scalar.obj `if test -f 'mesh/write_vec_and_scalar.C'; then $(CYGPATH_W) 'mesh/write_vec_and_scalar.C'; else $(CYGPATH_W) '$(srcdir)/mesh/write_vec_and_scalar.C'; fi` +mesh/unit_tests_dbg-project_solution_test.o: mesh/project_solution_test.C +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_dbg_CPPFLAGS) $(CPPFLAGS) $(unit_tests_dbg_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_dbg-project_solution_test.o -MD -MP -MF mesh/$(DEPDIR)/unit_tests_dbg-project_solution_test.Tpo -c -o mesh/unit_tests_dbg-project_solution_test.o `test -f 'mesh/project_solution_test.C' || echo '$(srcdir)/'`mesh/project_solution_test.C +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_dbg-project_solution_test.Tpo mesh/$(DEPDIR)/unit_tests_dbg-project_solution_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mesh/project_solution_test.C' object='mesh/unit_tests_dbg-project_solution_test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_dbg_CPPFLAGS) $(CPPFLAGS) $(unit_tests_dbg_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_dbg-project_solution_test.o `test -f 'mesh/project_solution_test.C' || echo '$(srcdir)/'`mesh/project_solution_test.C + +mesh/unit_tests_dbg-project_solution_test.obj: mesh/project_solution_test.C +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_dbg_CPPFLAGS) $(CPPFLAGS) $(unit_tests_dbg_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_dbg-project_solution_test.obj -MD -MP -MF mesh/$(DEPDIR)/unit_tests_dbg-project_solution_test.Tpo -c -o mesh/unit_tests_dbg-project_solution_test.obj `if test -f 'mesh/project_solution_test.C'; then $(CYGPATH_W) 'mesh/project_solution_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/project_solution_test.C'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_dbg-project_solution_test.Tpo mesh/$(DEPDIR)/unit_tests_dbg-project_solution_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mesh/project_solution_test.C' object='mesh/unit_tests_dbg-project_solution_test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_dbg_CPPFLAGS) $(CPPFLAGS) $(unit_tests_dbg_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_dbg-project_solution_test.obj `if test -f 'mesh/project_solution_test.C'; then $(CYGPATH_W) 'mesh/project_solution_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/project_solution_test.C'; fi` + numerics/unit_tests_dbg-composite_function_test.o: numerics/composite_function_test.C @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_dbg_CPPFLAGS) $(CPPFLAGS) $(unit_tests_dbg_CXXFLAGS) $(CXXFLAGS) -MT numerics/unit_tests_dbg-composite_function_test.o -MD -MP -MF numerics/$(DEPDIR)/unit_tests_dbg-composite_function_test.Tpo -c -o numerics/unit_tests_dbg-composite_function_test.o `test -f 'numerics/composite_function_test.C' || echo '$(srcdir)/'`numerics/composite_function_test.C @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) numerics/$(DEPDIR)/unit_tests_dbg-composite_function_test.Tpo numerics/$(DEPDIR)/unit_tests_dbg-composite_function_test.Po @@ -7143,6 +7188,20 @@ mesh/unit_tests_devel-write_vec_and_scalar.obj: mesh/write_vec_and_scalar.C @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_devel_CPPFLAGS) $(CPPFLAGS) $(unit_tests_devel_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_devel-write_vec_and_scalar.obj `if test -f 'mesh/write_vec_and_scalar.C'; then $(CYGPATH_W) 'mesh/write_vec_and_scalar.C'; else $(CYGPATH_W) '$(srcdir)/mesh/write_vec_and_scalar.C'; fi` +mesh/unit_tests_devel-project_solution_test.o: mesh/project_solution_test.C +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_devel_CPPFLAGS) $(CPPFLAGS) $(unit_tests_devel_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_devel-project_solution_test.o -MD -MP -MF mesh/$(DEPDIR)/unit_tests_devel-project_solution_test.Tpo -c -o mesh/unit_tests_devel-project_solution_test.o `test -f 'mesh/project_solution_test.C' || echo '$(srcdir)/'`mesh/project_solution_test.C +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_devel-project_solution_test.Tpo mesh/$(DEPDIR)/unit_tests_devel-project_solution_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mesh/project_solution_test.C' object='mesh/unit_tests_devel-project_solution_test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_devel_CPPFLAGS) $(CPPFLAGS) $(unit_tests_devel_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_devel-project_solution_test.o `test -f 'mesh/project_solution_test.C' || echo '$(srcdir)/'`mesh/project_solution_test.C + +mesh/unit_tests_devel-project_solution_test.obj: mesh/project_solution_test.C +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_devel_CPPFLAGS) $(CPPFLAGS) $(unit_tests_devel_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_devel-project_solution_test.obj -MD -MP -MF mesh/$(DEPDIR)/unit_tests_devel-project_solution_test.Tpo -c -o mesh/unit_tests_devel-project_solution_test.obj `if test -f 'mesh/project_solution_test.C'; then $(CYGPATH_W) 'mesh/project_solution_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/project_solution_test.C'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_devel-project_solution_test.Tpo mesh/$(DEPDIR)/unit_tests_devel-project_solution_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mesh/project_solution_test.C' object='mesh/unit_tests_devel-project_solution_test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_devel_CPPFLAGS) $(CPPFLAGS) $(unit_tests_devel_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_devel-project_solution_test.obj `if test -f 'mesh/project_solution_test.C'; then $(CYGPATH_W) 'mesh/project_solution_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/project_solution_test.C'; fi` + numerics/unit_tests_devel-composite_function_test.o: numerics/composite_function_test.C @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_devel_CPPFLAGS) $(CPPFLAGS) $(unit_tests_devel_CXXFLAGS) $(CXXFLAGS) -MT numerics/unit_tests_devel-composite_function_test.o -MD -MP -MF numerics/$(DEPDIR)/unit_tests_devel-composite_function_test.Tpo -c -o numerics/unit_tests_devel-composite_function_test.o `test -f 'numerics/composite_function_test.C' || echo '$(srcdir)/'`numerics/composite_function_test.C @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) numerics/$(DEPDIR)/unit_tests_devel-composite_function_test.Tpo numerics/$(DEPDIR)/unit_tests_devel-composite_function_test.Po @@ -8809,6 +8868,20 @@ mesh/unit_tests_oprof-write_vec_and_scalar.obj: mesh/write_vec_and_scalar.C @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_oprof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_oprof_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_oprof-write_vec_and_scalar.obj `if test -f 'mesh/write_vec_and_scalar.C'; then $(CYGPATH_W) 'mesh/write_vec_and_scalar.C'; else $(CYGPATH_W) '$(srcdir)/mesh/write_vec_and_scalar.C'; fi` +mesh/unit_tests_oprof-project_solution_test.o: mesh/project_solution_test.C +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_oprof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_oprof_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_oprof-project_solution_test.o -MD -MP -MF mesh/$(DEPDIR)/unit_tests_oprof-project_solution_test.Tpo -c -o mesh/unit_tests_oprof-project_solution_test.o `test -f 'mesh/project_solution_test.C' || echo '$(srcdir)/'`mesh/project_solution_test.C +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_oprof-project_solution_test.Tpo mesh/$(DEPDIR)/unit_tests_oprof-project_solution_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mesh/project_solution_test.C' object='mesh/unit_tests_oprof-project_solution_test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_oprof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_oprof_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_oprof-project_solution_test.o `test -f 'mesh/project_solution_test.C' || echo '$(srcdir)/'`mesh/project_solution_test.C + +mesh/unit_tests_oprof-project_solution_test.obj: mesh/project_solution_test.C +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_oprof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_oprof_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_oprof-project_solution_test.obj -MD -MP -MF mesh/$(DEPDIR)/unit_tests_oprof-project_solution_test.Tpo -c -o mesh/unit_tests_oprof-project_solution_test.obj `if test -f 'mesh/project_solution_test.C'; then $(CYGPATH_W) 'mesh/project_solution_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/project_solution_test.C'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_oprof-project_solution_test.Tpo mesh/$(DEPDIR)/unit_tests_oprof-project_solution_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mesh/project_solution_test.C' object='mesh/unit_tests_oprof-project_solution_test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_oprof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_oprof_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_oprof-project_solution_test.obj `if test -f 'mesh/project_solution_test.C'; then $(CYGPATH_W) 'mesh/project_solution_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/project_solution_test.C'; fi` + numerics/unit_tests_oprof-composite_function_test.o: numerics/composite_function_test.C @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_oprof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_oprof_CXXFLAGS) $(CXXFLAGS) -MT numerics/unit_tests_oprof-composite_function_test.o -MD -MP -MF numerics/$(DEPDIR)/unit_tests_oprof-composite_function_test.Tpo -c -o numerics/unit_tests_oprof-composite_function_test.o `test -f 'numerics/composite_function_test.C' || echo '$(srcdir)/'`numerics/composite_function_test.C @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) numerics/$(DEPDIR)/unit_tests_oprof-composite_function_test.Tpo numerics/$(DEPDIR)/unit_tests_oprof-composite_function_test.Po @@ -10475,6 +10548,20 @@ mesh/unit_tests_opt-write_vec_and_scalar.obj: mesh/write_vec_and_scalar.C @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_opt_CPPFLAGS) $(CPPFLAGS) $(unit_tests_opt_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_opt-write_vec_and_scalar.obj `if test -f 'mesh/write_vec_and_scalar.C'; then $(CYGPATH_W) 'mesh/write_vec_and_scalar.C'; else $(CYGPATH_W) '$(srcdir)/mesh/write_vec_and_scalar.C'; fi` +mesh/unit_tests_opt-project_solution_test.o: mesh/project_solution_test.C +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_opt_CPPFLAGS) $(CPPFLAGS) $(unit_tests_opt_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_opt-project_solution_test.o -MD -MP -MF mesh/$(DEPDIR)/unit_tests_opt-project_solution_test.Tpo -c -o mesh/unit_tests_opt-project_solution_test.o `test -f 'mesh/project_solution_test.C' || echo '$(srcdir)/'`mesh/project_solution_test.C +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_opt-project_solution_test.Tpo mesh/$(DEPDIR)/unit_tests_opt-project_solution_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mesh/project_solution_test.C' object='mesh/unit_tests_opt-project_solution_test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_opt_CPPFLAGS) $(CPPFLAGS) $(unit_tests_opt_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_opt-project_solution_test.o `test -f 'mesh/project_solution_test.C' || echo '$(srcdir)/'`mesh/project_solution_test.C + +mesh/unit_tests_opt-project_solution_test.obj: mesh/project_solution_test.C +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_opt_CPPFLAGS) $(CPPFLAGS) $(unit_tests_opt_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_opt-project_solution_test.obj -MD -MP -MF mesh/$(DEPDIR)/unit_tests_opt-project_solution_test.Tpo -c -o mesh/unit_tests_opt-project_solution_test.obj `if test -f 'mesh/project_solution_test.C'; then $(CYGPATH_W) 'mesh/project_solution_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/project_solution_test.C'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_opt-project_solution_test.Tpo mesh/$(DEPDIR)/unit_tests_opt-project_solution_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mesh/project_solution_test.C' object='mesh/unit_tests_opt-project_solution_test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_opt_CPPFLAGS) $(CPPFLAGS) $(unit_tests_opt_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_opt-project_solution_test.obj `if test -f 'mesh/project_solution_test.C'; then $(CYGPATH_W) 'mesh/project_solution_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/project_solution_test.C'; fi` + numerics/unit_tests_opt-composite_function_test.o: numerics/composite_function_test.C @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_opt_CPPFLAGS) $(CPPFLAGS) $(unit_tests_opt_CXXFLAGS) $(CXXFLAGS) -MT numerics/unit_tests_opt-composite_function_test.o -MD -MP -MF numerics/$(DEPDIR)/unit_tests_opt-composite_function_test.Tpo -c -o numerics/unit_tests_opt-composite_function_test.o `test -f 'numerics/composite_function_test.C' || echo '$(srcdir)/'`numerics/composite_function_test.C @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) numerics/$(DEPDIR)/unit_tests_opt-composite_function_test.Tpo numerics/$(DEPDIR)/unit_tests_opt-composite_function_test.Po @@ -12141,6 +12228,20 @@ mesh/unit_tests_prof-write_vec_and_scalar.obj: mesh/write_vec_and_scalar.C @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_prof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_prof_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_prof-write_vec_and_scalar.obj `if test -f 'mesh/write_vec_and_scalar.C'; then $(CYGPATH_W) 'mesh/write_vec_and_scalar.C'; else $(CYGPATH_W) '$(srcdir)/mesh/write_vec_and_scalar.C'; fi` +mesh/unit_tests_prof-project_solution_test.o: mesh/project_solution_test.C +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_prof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_prof_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_prof-project_solution_test.o -MD -MP -MF mesh/$(DEPDIR)/unit_tests_prof-project_solution_test.Tpo -c -o mesh/unit_tests_prof-project_solution_test.o `test -f 'mesh/project_solution_test.C' || echo '$(srcdir)/'`mesh/project_solution_test.C +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_prof-project_solution_test.Tpo mesh/$(DEPDIR)/unit_tests_prof-project_solution_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mesh/project_solution_test.C' object='mesh/unit_tests_prof-project_solution_test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_prof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_prof_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_prof-project_solution_test.o `test -f 'mesh/project_solution_test.C' || echo '$(srcdir)/'`mesh/project_solution_test.C + +mesh/unit_tests_prof-project_solution_test.obj: mesh/project_solution_test.C +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_prof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_prof_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_prof-project_solution_test.obj -MD -MP -MF mesh/$(DEPDIR)/unit_tests_prof-project_solution_test.Tpo -c -o mesh/unit_tests_prof-project_solution_test.obj `if test -f 'mesh/project_solution_test.C'; then $(CYGPATH_W) 'mesh/project_solution_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/project_solution_test.C'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_prof-project_solution_test.Tpo mesh/$(DEPDIR)/unit_tests_prof-project_solution_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mesh/project_solution_test.C' object='mesh/unit_tests_prof-project_solution_test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_prof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_prof_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_prof-project_solution_test.obj `if test -f 'mesh/project_solution_test.C'; then $(CYGPATH_W) 'mesh/project_solution_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/project_solution_test.C'; fi` + numerics/unit_tests_prof-composite_function_test.o: numerics/composite_function_test.C @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_prof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_prof_CXXFLAGS) $(CXXFLAGS) -MT numerics/unit_tests_prof-composite_function_test.o -MD -MP -MF numerics/$(DEPDIR)/unit_tests_prof-composite_function_test.Tpo -c -o numerics/unit_tests_prof-composite_function_test.o `test -f 'numerics/composite_function_test.C' || echo '$(srcdir)/'`numerics/composite_function_test.C @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) numerics/$(DEPDIR)/unit_tests_prof-composite_function_test.Tpo numerics/$(DEPDIR)/unit_tests_prof-composite_function_test.Po @@ -13372,6 +13473,7 @@ distclean: distclean-am -rm -f mesh/$(DEPDIR)/unit_tests_dbg-mixed_dim_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_dbg-mixed_order_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_dbg-nodal_neighbors.Po + -rm -f mesh/$(DEPDIR)/unit_tests_dbg-project_solution_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_dbg-simplex_refinement_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_dbg-slit_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_dbg-spatial_dimension_test.Po @@ -13411,6 +13513,7 @@ distclean: distclean-am -rm -f mesh/$(DEPDIR)/unit_tests_devel-mixed_dim_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_devel-mixed_order_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_devel-nodal_neighbors.Po + -rm -f mesh/$(DEPDIR)/unit_tests_devel-project_solution_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_devel-simplex_refinement_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_devel-slit_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_devel-spatial_dimension_test.Po @@ -13450,6 +13553,7 @@ distclean: distclean-am -rm -f mesh/$(DEPDIR)/unit_tests_oprof-mixed_dim_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_oprof-mixed_order_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_oprof-nodal_neighbors.Po + -rm -f mesh/$(DEPDIR)/unit_tests_oprof-project_solution_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_oprof-simplex_refinement_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_oprof-slit_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_oprof-spatial_dimension_test.Po @@ -13489,6 +13593,7 @@ distclean: distclean-am -rm -f mesh/$(DEPDIR)/unit_tests_opt-mixed_dim_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_opt-mixed_order_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_opt-nodal_neighbors.Po + -rm -f mesh/$(DEPDIR)/unit_tests_opt-project_solution_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_opt-simplex_refinement_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_opt-slit_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_opt-spatial_dimension_test.Po @@ -13528,6 +13633,7 @@ distclean: distclean-am -rm -f mesh/$(DEPDIR)/unit_tests_prof-mixed_dim_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_prof-mixed_order_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_prof-nodal_neighbors.Po + -rm -f mesh/$(DEPDIR)/unit_tests_prof-project_solution_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_prof-simplex_refinement_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_prof-slit_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_prof-spatial_dimension_test.Po @@ -14014,6 +14120,7 @@ maintainer-clean: maintainer-clean-am -rm -f mesh/$(DEPDIR)/unit_tests_dbg-mixed_dim_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_dbg-mixed_order_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_dbg-nodal_neighbors.Po + -rm -f mesh/$(DEPDIR)/unit_tests_dbg-project_solution_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_dbg-simplex_refinement_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_dbg-slit_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_dbg-spatial_dimension_test.Po @@ -14053,6 +14160,7 @@ maintainer-clean: maintainer-clean-am -rm -f mesh/$(DEPDIR)/unit_tests_devel-mixed_dim_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_devel-mixed_order_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_devel-nodal_neighbors.Po + -rm -f mesh/$(DEPDIR)/unit_tests_devel-project_solution_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_devel-simplex_refinement_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_devel-slit_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_devel-spatial_dimension_test.Po @@ -14092,6 +14200,7 @@ maintainer-clean: maintainer-clean-am -rm -f mesh/$(DEPDIR)/unit_tests_oprof-mixed_dim_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_oprof-mixed_order_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_oprof-nodal_neighbors.Po + -rm -f mesh/$(DEPDIR)/unit_tests_oprof-project_solution_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_oprof-simplex_refinement_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_oprof-slit_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_oprof-spatial_dimension_test.Po @@ -14131,6 +14240,7 @@ maintainer-clean: maintainer-clean-am -rm -f mesh/$(DEPDIR)/unit_tests_opt-mixed_dim_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_opt-mixed_order_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_opt-nodal_neighbors.Po + -rm -f mesh/$(DEPDIR)/unit_tests_opt-project_solution_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_opt-simplex_refinement_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_opt-slit_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_opt-spatial_dimension_test.Po @@ -14170,6 +14280,7 @@ maintainer-clean: maintainer-clean-am -rm -f mesh/$(DEPDIR)/unit_tests_prof-mixed_dim_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_prof-mixed_order_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_prof-nodal_neighbors.Po + -rm -f mesh/$(DEPDIR)/unit_tests_prof-project_solution_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_prof-simplex_refinement_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_prof-slit_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_prof-spatial_dimension_test.Po diff --git a/tests/mesh/project_solution_test.C b/tests/mesh/project_solution_test.C new file mode 100644 index 00000000000..a0be80dfd78 --- /dev/null +++ b/tests/mesh/project_solution_test.C @@ -0,0 +1,128 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "test_comm.h" +#include "libmesh_cppunit.h" + +#include +#include + +#include + +using namespace libMesh; + +namespace +{ + +Number baseline_linear_function(const Point & p, + const Parameters &, + const std::string &, + const std::string &) +{ + return 0.5 * p(0) + 0.25 * p(1); +} + +Number circle_projection_function(const Point & p, + const Parameters &, + const std::string &, + const std::string &) +{ + return std::cos(0.5 * libMesh::pi * p(0)) * + std::sin(0.5 * libMesh::pi * p(1)) * + std::cos(0.5 * libMesh::pi * p(2)); +} + +} + + +class ProjectSolutionTest : public CppUnit::TestCase +{ +public: + LIBMESH_CPPUNIT_TEST_SUITE(ProjectSolutionTest); + CPPUNIT_TEST(test_partial_project_solution); + CPPUNIT_TEST_SUITE_END(); + +private: + void test_partial_project_solution() + { + LOG_UNIT_TEST; + +#if LIBMESH_DIM < 2 + return; +#else + ReplicatedMesh mesh(*TestCommWorld, /*dim=*/2); + + MeshTools::Generation::build_square(mesh, + /*nx=*/5, /*ny=*/5, + /*xmin=*/-1., /*xmax=*/ 1., + /*ymin=*/-1., /*ymax=*/ 1., + QUAD4); + + EquationSystems es(mesh); + System & sys = es.add_system("ProjSys"); + + // one dof per element + const unsigned int u_var = sys.add_variable("u", CONSTANT, MONOMIAL); + std::vector dof_indices; + + es.init(); + + // baseline + sys.project_solution(baseline_linear_function, /*gptr=*/nullptr, es.parameters); + // ExodusII_IO(mesh).write_equation_systems("before_project.e", es); + + const DofMap & dof_map = sys.get_dof_map(); + + // collect elements whose vertex_average lies inside the circle + const Real r2 = 0.5 * 0.5; + + std::vector selected_elems; + for (const auto & e : mesh.active_local_element_ptr_range()) + { + const Point c = e->vertex_average(); + if (c(0)*c(0) + c(1)*c(1) <= r2) + selected_elems.push_back(e); + } + + // ConstElemRange expects mesh element iterators OR a vec_type* + // Here we use the vector-backed constructor. + ConstElemRange circle_range(&selected_elems); + + + // project only on selected elements + sys.project_solution(circle_projection_function, /*gptr=*/nullptr, es.parameters, circle_range); + // ExodusII_IO(mesh).write_equation_systems("after_project.e", es); + + // Check that restricted projection only overwrites elements inside the circle. + // Outside elements must keep the baseline projection. + const Real tol = 1e-3; + + for (const auto & e : mesh.active_local_element_ptr_range()) + { + const Point c = e->vertex_average(); + const bool inside = (c(0)*c(0) + c(1)*c(1) <= r2); + + dof_map.dof_indices(e, dof_indices, u_var); + + const Real v = (*sys.solution)(dof_indices[0]); + const Real v_baseline = baseline_linear_function(c, es.parameters, "", ""); + const Real v_projected = circle_projection_function(c, es.parameters, "", ""); + + if (inside) + // Inside the circle, values should be equal to the projected value. + LIBMESH_ASSERT_FP_EQUAL(v, v_projected, tol); + else + // Outside the circle, values must remain unchanged. + LIBMESH_ASSERT_FP_EQUAL(v, v_baseline, tol); + } +#endif + } +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(ProjectSolutionTest); + From d915c9e2a31bd43aac7ce782942eff7862fc1cc9 Mon Sep 17 00:00:00 2001 From: Cheng-Hau Yang Date: Fri, 16 Jan 2026 10:45:01 -0600 Subject: [PATCH 3/3] Specify the target variable numbers in `project_vector` and `project_solution`, and add corresponding test --- include/numerics/wrapped_functor.h | 28 ++++++++--- include/systems/system.h | 34 ++++++++++--- src/systems/system_projection.C | 78 ++++++++++++++++++++++-------- tests/mesh/project_solution_test.C | 72 ++++++++++++++------------- 4 files changed, 142 insertions(+), 70 deletions(-) diff --git a/include/numerics/wrapped_functor.h b/include/numerics/wrapped_functor.h index dba9b902850..f2a6490a11c 100644 --- a/include/numerics/wrapped_functor.h +++ b/include/numerics/wrapped_functor.h @@ -123,14 +123,28 @@ class WrappedFunctor : public FEMFunctionBase template void WrappedFunctor::init_context (const FEMContext & c) { - for (auto dim : c.elem_dimensions()) + // If the context was constructed with an active var subset (e.g. projector + // projecting only selected variables), then only those FE objects are + // guaranteed to exist. + const std::vector * active = c.active_vars(); + + auto check_and_init = [&c](unsigned int v, unsigned short dim) + { + FEAbstract * fe = nullptr; + c.get_element_fe(v, fe, dim); + libmesh_assert_msg(fe, "FEAbstract pointer is null for variable " + << v << " in dimension " << dim); + fe->get_nothing(); + }; + + for (const auto dim : c.elem_dimensions()) { - for (auto v : make_range(c.n_vars())) - { - FEAbstract * fe; - c.get_element_fe(v, fe, dim); - fe->get_nothing(); - } + if (active) + for (const auto v : *active) + check_and_init(v, dim); + else + for (const auto v : make_range(c.n_vars())) + check_and_init(v, dim); } } diff --git a/include/systems/system.h b/include/systems/system.h index 44179763696..d4b9c50aaab 100644 --- a/include/systems/system.h +++ b/include/systems/system.h @@ -517,10 +517,13 @@ class System : public ReferenceCountedObject, * element spaces with continuous derivatives. * elem_range \p active_local_range, if provided, indicates the range of elements * over which to perform the projection. + * variable_numbers \p variable_numbers, if provided, indicates the variable numbers + * onto which to project. */ void project_solution (FunctionBase * f, FunctionBase * g = nullptr, - std::optional active_local_range = std::nullopt) const; + std::optional active_local_range = std::nullopt, + std::optional> variable_numbers = std::nullopt) const; /** * Projects arbitrary functions onto the current solution. @@ -530,10 +533,13 @@ class System : public ReferenceCountedObject, * element spaces with continuous derivatives. * elem_range \p active_local_range, if provided, indicates the range of elements * over which to perform the projection. + * variable_numbers \p variable_numbers, if provided, indicates the variable numbers + * onto which to project. */ void project_solution (FEMFunctionBase * f, FEMFunctionBase * g = nullptr, - std::optional active_local_range = std::nullopt) const; + std::optional active_local_range = std::nullopt, + std::optional> variable_numbers = std::nullopt) const; /** * Projects arbitrary functions onto the current solution. @@ -553,7 +559,8 @@ class System : public ReferenceCountedObject, void project_solution (ValueFunctionPointer fptr, GradientFunctionPointer gptr, const Parameters & parameters, - std::optional active_local_range = std::nullopt) const; + std::optional active_local_range = std::nullopt, + std::optional> variable_numbers = std::nullopt) const; /** * Projects arbitrary functions onto a vector of degree of freedom @@ -564,6 +571,8 @@ class System : public ReferenceCountedObject, * element spaces with continuous derivatives. * elem_range \p active_local_range, if provided, indicates the range of elements * over which to perform the projection. + * variable_numbers \p variable_numbers, if provided, indicates the variable numbers + * onto which to project. * * Constrain the new vector using the requested adjoint rather than * primal constraints if is_adjoint is non-negative. @@ -572,7 +581,8 @@ class System : public ReferenceCountedObject, FunctionBase * f, FunctionBase * g = nullptr, int is_adjoint = -1, - std::optional active_local_range = std::nullopt) const; + std::optional active_local_range = std::nullopt, + std::optional> variable_numbers = std::nullopt) const; /** * Projects arbitrary functions onto a vector of degree of freedom @@ -583,6 +593,8 @@ class System : public ReferenceCountedObject, * element spaces with continuous derivatives. * elem_range \p active_local_range, if provided, indicates the range of elements * over which to perform the projection. + * variable_numbers \p variable_numbers, if provided, indicates the variable numbers + * onto which to project. * * Constrain the new vector using the requested adjoint rather than * primal constraints if is_adjoint is non-negative. @@ -591,7 +603,8 @@ class System : public ReferenceCountedObject, FEMFunctionBase * f, FEMFunctionBase * g = nullptr, int is_adjoint = -1, - std::optional active_local_range = std::nullopt) const; + std::optional active_local_range = std::nullopt, + std::optional> variable_numbers = std::nullopt) const; /** * Projects arbitrary functions onto a vector of degree of freedom @@ -602,6 +615,8 @@ class System : public ReferenceCountedObject, * finite element spaces with continuous derivatives. * elem_range \p active_local_range, if provided, indicates the range of elements * over which to perform the projection. + * variable_numbers \p variable_numbers, if provided, indicates the variable numbers + * onto which to project. * * Constrain the new vector using the requested adjoint rather than * primal constraints if is_adjoint is non-negative. @@ -611,7 +626,8 @@ class System : public ReferenceCountedObject, const Parameters & parameters, NumericVector & new_vector, int is_adjoint = -1, - std::optional active_local_range = std::nullopt) const; + std::optional active_local_range = std::nullopt, + std::optional> variable_numbers = std::nullopt) const; /** * Projects arbitrary boundary functions onto a vector of degree of @@ -2014,7 +2030,8 @@ class System : public ReferenceCountedObject, */ void project_vector (NumericVector &, int is_adjoint = -1, - std::optional active_local_range = std::nullopt) const; + std::optional active_local_range = std::nullopt, + std::optional> variable_numbers = std::nullopt) const; /** * Projects the vector defined on the old mesh onto the @@ -2027,7 +2044,8 @@ class System : public ReferenceCountedObject, void project_vector (const NumericVector &, NumericVector &, int is_adjoint = -1, - std::optional active_local_range = std::nullopt) const; + std::optional active_local_range = std::nullopt, + std::optional> variable_numbers = std::nullopt) const; /** * Whether this object should condense out constrained degrees of freedom diff --git a/src/systems/system_projection.C b/src/systems/system_projection.C index 727d9d9e87d..06290fe0cf2 100644 --- a/src/systems/system_projection.C +++ b/src/systems/system_projection.C @@ -246,7 +246,8 @@ public: // System implementation void System::project_vector (NumericVector & vector, int is_adjoint, - std::optional active_local_range) const + std::optional active_local_range, + std::optional> variable_numbers) const { // Create a copy of the vector, which currently // contains the old data. @@ -254,7 +255,7 @@ void System::project_vector (NumericVector & vector, old_vector (vector.clone()); // Project the old vector to the new vector - this->project_vector (*old_vector, vector, is_adjoint, active_local_range); + this->project_vector (*old_vector, vector, is_adjoint, active_local_range, variable_numbers); } @@ -266,7 +267,8 @@ void System::project_vector (NumericVector & vector, void System::project_vector (const NumericVector & old_v, NumericVector & new_v, int is_adjoint, - std::optional active_local_range) const + std::optional active_local_range, + std::optional> variable_numbers) const { LOG_SCOPE ("project_vector(old,new)", "System"); @@ -367,8 +369,22 @@ void System::project_vector (const NumericVector & old_v, if (n_variables) { - std::vector vars(n_variables); - std::iota(vars.begin(), vars.end(), 0); + std::vector vars; + if (variable_numbers) + { + vars = *variable_numbers; + for (auto v : vars) + if (v >= n_variables) + libmesh_error_msg("ERROR: variable number " << v << + " out of range for system with " << + n_variables << " variables."); + } + else + { + vars.resize(n_variables); + std::iota(vars.begin(), vars.end(), 0); + } + std::vector regular_vars, vector_vars; for (auto var : vars) { @@ -417,7 +433,7 @@ void System::project_vector (const NumericVector & old_v, if (this->processor_id() == (this->n_processors()-1)) { const DofMap & dof_map = this->get_dof_map(); - for (auto var : make_range(this->n_vars())) + for (auto var : vars) if (this->variable(var).type().family == SCALAR) { // We can just map SCALAR dofs directly across @@ -1032,11 +1048,12 @@ void System::projection_matrix (SparseMatrix & proj_mat) const void System::project_solution (ValueFunctionPointer fptr, GradientFunctionPointer gptr, const Parameters & function_parameters, - std::optional active_local_range) const + std::optional active_local_range, + std::optional> variable_numbers) const { WrappedFunction f(*this, fptr, &function_parameters); WrappedFunction g(*this, gptr, &function_parameters); - this->project_solution(&f, &g, active_local_range); + this->project_solution(&f, &g, active_local_range, variable_numbers); } @@ -1046,9 +1063,10 @@ void System::project_solution (ValueFunctionPointer fptr, */ void System::project_solution (FunctionBase * f, FunctionBase * g, - std::optional active_local_range) const + std::optional active_local_range, + std::optional> variable_numbers) const { - this->project_vector(*solution, f, g, /*is_adjoint=*/-1, active_local_range); + this->project_vector(*solution, f, g, /*is_adjoint=*/-1, active_local_range, variable_numbers); solution->localize(*current_local_solution, _dof_map->get_send_list()); } @@ -1060,9 +1078,10 @@ void System::project_solution (FunctionBase * f, */ void System::project_solution (FEMFunctionBase * f, FEMFunctionBase * g, - std::optional active_local_range) const + std::optional active_local_range, + std::optional> variable_numbers) const { - this->project_vector(*solution, f, g, /*is_adjoint=*/-1, active_local_range); + this->project_vector(*solution, f, g, /*is_adjoint=*/-1, active_local_range, variable_numbers); solution->localize(*current_local_solution, _dof_map->get_send_list()); } @@ -1077,11 +1096,12 @@ void System::project_vector (ValueFunctionPointer fptr, const Parameters & function_parameters, NumericVector & new_vector, int is_adjoint, - std::optional active_local_range) const + std::optional active_local_range, + std::optional> variable_numbers) const { WrappedFunction f(*this, fptr, &function_parameters); WrappedFunction g(*this, gptr, &function_parameters); - this->project_vector(new_vector, &f, &g, is_adjoint, active_local_range); + this->project_vector(new_vector, &f, &g, is_adjoint, active_local_range, variable_numbers); } /** @@ -1092,7 +1112,8 @@ void System::project_vector (NumericVector & new_vector, FunctionBase * f, FunctionBase * g, int is_adjoint, - std::optional active_local_range) const + std::optional active_local_range, + std::optional> variable_numbers) const { LOG_SCOPE ("project_vector(FunctionBase)", "System"); @@ -1104,10 +1125,10 @@ void System::project_vector (NumericVector & new_vector, { WrappedFunctor g_fem(*g); - this->project_vector(new_vector, &f_fem, &g_fem, is_adjoint, active_local_range); + this->project_vector(new_vector, &f_fem, &g_fem, is_adjoint, active_local_range, variable_numbers); } else - this->project_vector(new_vector, &f_fem, nullptr, is_adjoint, active_local_range); + this->project_vector(new_vector, &f_fem, nullptr, is_adjoint, active_local_range, variable_numbers); } @@ -1119,7 +1140,8 @@ void System::project_vector (NumericVector & new_vector, FEMFunctionBase * f, FEMFunctionBase * g, int is_adjoint, - std::optional active_local_range) const + std::optional active_local_range, + std::optional> variable_numbers) const { LOG_SCOPE ("project_fem_vector()", "System"); @@ -1136,8 +1158,22 @@ void System::project_vector (NumericVector & new_vector, const unsigned int n_variables = this->n_vars(); - std::vector vars(n_variables); - std::iota(vars.begin(), vars.end(), 0); + std::vector vars; + if (variable_numbers) + { + vars = *variable_numbers; + for (auto v : vars) + if (v >= n_variables) + libmesh_error_msg("ERROR: variable number " << v << + " out of range for system with " << + n_variables << " variables."); + } + else + { + vars.resize(n_variables); + std::iota(vars.begin(), vars.end(), 0); + } + // Use a typedef to make the calling sequence for parallel_for() a bit more readable typedef @@ -1168,7 +1204,7 @@ void System::project_vector (NumericVector & new_vector, FEMContext context( *this ); const DofMap & dof_map = this->get_dof_map(); - for (auto var : make_range(this->n_vars())) + for (auto var : vars) if (this->variable(var).type().family == SCALAR) { // FIXME: We reinit with an arbitrary element in case the user diff --git a/tests/mesh/project_solution_test.C b/tests/mesh/project_solution_test.C index a0be80dfd78..b549302e80e 100644 --- a/tests/mesh/project_solution_test.C +++ b/tests/mesh/project_solution_test.C @@ -19,27 +19,26 @@ using namespace libMesh; namespace { -Number baseline_linear_function(const Point & p, - const Parameters &, - const std::string &, - const std::string &) -{ - return 0.5 * p(0) + 0.25 * p(1); -} - -Number circle_projection_function(const Point & p, + Number baseline_linear_function(const Point &p, const Parameters &, const std::string &, const std::string &) -{ - return std::cos(0.5 * libMesh::pi * p(0)) * - std::sin(0.5 * libMesh::pi * p(1)) * - std::cos(0.5 * libMesh::pi * p(2)); -} + { + return 0.5 * p(0) + 0.25 * p(1); + } + + Number circle_projection_function(const Point &p, + const Parameters &, + const std::string &, + const std::string &) + { + return std::cos(0.5 * libMesh::pi * p(0)) * + std::sin(0.5 * libMesh::pi * p(1)) * + std::cos(0.5 * libMesh::pi * p(2)); + } } - class ProjectSolutionTest : public CppUnit::TestCase { public: @@ -59,16 +58,16 @@ private: MeshTools::Generation::build_square(mesh, /*nx=*/5, /*ny=*/5, - /*xmin=*/-1., /*xmax=*/ 1., - /*ymin=*/-1., /*ymax=*/ 1., + /*xmin=*/-1., /*xmax=*/1., + /*ymin=*/-1., /*ymax=*/1., QUAD4); EquationSystems es(mesh); - System & sys = es.add_system("ProjSys"); + System &sys = es.add_system("ProjSys"); // one dof per element const unsigned int u_var = sys.add_variable("u", CONSTANT, MONOMIAL); - std::vector dof_indices; + const unsigned int v_var = sys.add_variable("v", CONSTANT, MONOMIAL); es.init(); @@ -76,16 +75,16 @@ private: sys.project_solution(baseline_linear_function, /*gptr=*/nullptr, es.parameters); // ExodusII_IO(mesh).write_equation_systems("before_project.e", es); - const DofMap & dof_map = sys.get_dof_map(); + const DofMap &dof_map = sys.get_dof_map(); // collect elements whose vertex_average lies inside the circle const Real r2 = 0.5 * 0.5; std::vector selected_elems; - for (const auto & e : mesh.active_local_element_ptr_range()) + for (const auto &e : mesh.active_local_element_ptr_range()) { const Point c = e->vertex_average(); - if (c(0)*c(0) + c(1)*c(1) <= r2) + if (c(0) * c(0) + c(1) * c(1) <= r2) selected_elems.push_back(e); } @@ -93,36 +92,41 @@ private: // Here we use the vector-backed constructor. ConstElemRange circle_range(&selected_elems); - - // project only on selected elements - sys.project_solution(circle_projection_function, /*gptr=*/nullptr, es.parameters, circle_range); + // project only on selected elements and only on u variable + std::vector vars_to_project = {u_var}; + sys.project_solution(circle_projection_function, /*gptr=*/nullptr, es.parameters, circle_range, vars_to_project); // ExodusII_IO(mesh).write_equation_systems("after_project.e", es); // Check that restricted projection only overwrites elements inside the circle. // Outside elements must keep the baseline projection. const Real tol = 1e-3; - for (const auto & e : mesh.active_local_element_ptr_range()) + for (const auto &e : mesh.active_local_element_ptr_range()) { const Point c = e->vertex_average(); - const bool inside = (c(0)*c(0) + c(1)*c(1) <= r2); + const bool inside = (c(0) * c(0) + c(1) * c(1) <= r2); - dof_map.dof_indices(e, dof_indices, u_var); + std::vector u_indices, v_indices; + dof_map.dof_indices(e, u_indices, u_var); + dof_map.dof_indices(e, v_indices, v_var); - const Real v = (*sys.solution)(dof_indices[0]); - const Real v_baseline = baseline_linear_function(c, es.parameters, "", ""); - const Real v_projected = circle_projection_function(c, es.parameters, "", ""); + const Real u_val = (*sys.solution)(u_indices[0]); + const Real v_val = (*sys.solution)(v_indices[0]); + const Real val_baseline = baseline_linear_function(c, es.parameters, "", ""); + const Real val_projected = circle_projection_function(c, es.parameters, "", ""); if (inside) // Inside the circle, values should be equal to the projected value. - LIBMESH_ASSERT_FP_EQUAL(v, v_projected, tol); + LIBMESH_ASSERT_FP_EQUAL(u_val, val_projected, tol); else // Outside the circle, values must remain unchanged. - LIBMESH_ASSERT_FP_EQUAL(v, v_baseline, tol); + LIBMESH_ASSERT_FP_EQUAL(u_val, val_baseline, tol); + + // v variable was never projected, should always equal baseline + LIBMESH_ASSERT_FP_EQUAL(v_val, val_baseline, tol); } #endif } }; CPPUNIT_TEST_SUITE_REGISTRATION(ProjectSolutionTest); -