From 67b78d27604f3130dcba0f0cc063f7c6cd22cc21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHenrique?= Date: Fri, 9 Aug 2024 09:34:10 +0100 Subject: [PATCH 01/10] Add uniformRefinement method to MFEMMesh class --- include/mesh/MFEMMesh.h | 5 +++++ src/mesh/MFEMMesh.C | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/include/mesh/MFEMMesh.h b/include/mesh/MFEMMesh.h index 0638a25f..bfe31865 100644 --- a/include/mesh/MFEMMesh.h +++ b/include/mesh/MFEMMesh.h @@ -50,6 +50,11 @@ class MFEMMesh : public FileMesh */ void buildDummyMooseMesh(); + /** + * Performs a uniform refinement on the chosen mesh @nref times. + */ + void uniformRefinement(mfem::ParMesh * mesh, int nref); + /** * Smart pointers to mfem::ParMesh object. Do not access directly. * Use the accessors instead. diff --git a/src/mesh/MFEMMesh.C b/src/mesh/MFEMMesh.C index 922c096f..b2df6bcd 100644 --- a/src/mesh/MFEMMesh.C +++ b/src/mesh/MFEMMesh.C @@ -33,7 +33,14 @@ MFEMMesh::buildMesh() // Build the MFEM ParMesh from a serial MFEM mesh mfem::Mesh mfem_ser_mesh(getFileName()); + + // Perform serial refinements + uniformRefinement(&mfem_ser_mesh, getParam("serial_refinements")); + _mfem_par_mesh = std::make_shared(MPI_COMM_WORLD, mfem_ser_mesh); + + // Perform parallel refinements + uniformRefinement(mfem_par_mesh.get(), getParam("parallel_refinements")); } void @@ -58,6 +65,14 @@ MFEMMesh::buildDummyMooseMesh() getMesh().prepare_for_use(); } +void +MFEMMesh::uniformRefinement(mfem::ParMesh * mesh, int nref) +{ + + for (int i = 0; i < nref; ++i) + mesh->UniformRefinement(); +} + std::unique_ptr MFEMMesh::safeClone() const { From c2fb2cc82ecdcb3c433f03287a0fedeba11e85b5 Mon Sep 17 00:00:00 2001 From: "Henrique B. R" Date: Fri, 9 Aug 2024 14:33:53 +0100 Subject: [PATCH 02/10] Added serial and parallel refs to validParams() --- include/mesh/MFEMMesh.h | 2 +- src/mesh/MFEMMesh.C | 20 +++++++++++++++----- test/tests/kernels/diffusion.i | 4 +++- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/include/mesh/MFEMMesh.h b/include/mesh/MFEMMesh.h index bfe31865..28f80635 100644 --- a/include/mesh/MFEMMesh.h +++ b/include/mesh/MFEMMesh.h @@ -53,7 +53,7 @@ class MFEMMesh : public FileMesh /** * Performs a uniform refinement on the chosen mesh @nref times. */ - void uniformRefinement(mfem::ParMesh * mesh, int nref); + void uniformRefinement(mfem::Mesh & mesh, int nref); /** * Smart pointers to mfem::ParMesh object. Do not access directly. diff --git a/src/mesh/MFEMMesh.C b/src/mesh/MFEMMesh.C index b2df6bcd..c3faa5fb 100644 --- a/src/mesh/MFEMMesh.C +++ b/src/mesh/MFEMMesh.C @@ -15,7 +15,17 @@ InputParameters MFEMMesh::validParams() { InputParameters params = FileMesh::validParams(); + params.addParam( + "serial_ref", + 0, + "Number of serial refinements to perform on the mesh."); + params.addParam( + "parallel_ref", + 0, + "Number of parallel refinements to perform on the mesh."); + params.addClassDescription("Class to read in and store an mfem::ParMesh from file."); + return params; } @@ -35,12 +45,12 @@ MFEMMesh::buildMesh() mfem::Mesh mfem_ser_mesh(getFileName()); // Perform serial refinements - uniformRefinement(&mfem_ser_mesh, getParam("serial_refinements")); + uniformRefinement(mfem_ser_mesh, getParam("serial_ref")); _mfem_par_mesh = std::make_shared(MPI_COMM_WORLD, mfem_ser_mesh); // Perform parallel refinements - uniformRefinement(mfem_par_mesh.get(), getParam("parallel_refinements")); + uniformRefinement(*_mfem_par_mesh, getParam("parallel_ref")); } void @@ -66,11 +76,11 @@ MFEMMesh::buildDummyMooseMesh() } void -MFEMMesh::uniformRefinement(mfem::ParMesh * mesh, int nref) +MFEMMesh::uniformRefinement(mfem::Mesh & mesh, int nref) { - + std::cout << "Got into UniformRefinement! Will be doing " << nref << " refinements." << std::endl; for (int i = 0; i < nref; ++i) - mesh->UniformRefinement(); + mesh.UniformRefinement(); } std::unique_ptr diff --git a/test/tests/kernels/diffusion.i b/test/tests/kernels/diffusion.i index 938a09d4..81cdb0a3 100644 --- a/test/tests/kernels/diffusion.i +++ b/test/tests/kernels/diffusion.i @@ -2,11 +2,13 @@ type = MFEMMesh file = gold/mug.e dim = 3 + serial_ref = 0 + parallel_ref = 0 [] [Problem] type = MFEMProblem - device = "cpu" + device = "cuda" [] [Formulation] From d68a1e3567cfe2003f95baf4c4980ec1510cfdbf Mon Sep 17 00:00:00 2001 From: "Henrique B. R" Date: Fri, 9 Aug 2024 14:35:31 +0100 Subject: [PATCH 03/10] Linting --- src/mesh/MFEMMesh.C | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/mesh/MFEMMesh.C b/src/mesh/MFEMMesh.C index c3faa5fb..b4cf8575 100644 --- a/src/mesh/MFEMMesh.C +++ b/src/mesh/MFEMMesh.C @@ -15,14 +15,8 @@ InputParameters MFEMMesh::validParams() { InputParameters params = FileMesh::validParams(); - params.addParam( - "serial_ref", - 0, - "Number of serial refinements to perform on the mesh."); - params.addParam( - "parallel_ref", - 0, - "Number of parallel refinements to perform on the mesh."); + params.addParam("serial_ref", 0, "Number of serial refinements to perform on the mesh."); + params.addParam("parallel_ref", 0, "Number of parallel refinements to perform on the mesh."); params.addClassDescription("Class to read in and store an mfem::ParMesh from file."); From 751285ad390d4a02be8b4bfa4bfdb21031af0afc Mon Sep 17 00:00:00 2001 From: "Henrique B. R" Date: Fri, 9 Aug 2024 14:53:44 +0100 Subject: [PATCH 04/10] Return diffusion script to CPU run --- test/tests/kernels/diffusion.i | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/tests/kernels/diffusion.i b/test/tests/kernels/diffusion.i index 81cdb0a3..72bd39d6 100644 --- a/test/tests/kernels/diffusion.i +++ b/test/tests/kernels/diffusion.i @@ -8,7 +8,7 @@ [Problem] type = MFEMProblem - device = "cuda" + device = "cpu" [] [Formulation] From 2cf0e87020fdb1e066f15f500f0a94aa1b34e30a Mon Sep 17 00:00:00 2001 From: "Henrique B. R" Date: Mon, 12 Aug 2024 11:39:17 +0100 Subject: [PATCH 05/10] Changed refinement variable name and added uniform_refine option --- src/mesh/MFEMMesh.C | 24 +++++++++++++++++++----- test/tests/kernels/diffusion.i | 4 ++-- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/mesh/MFEMMesh.C b/src/mesh/MFEMMesh.C index b4cf8575..6def0a47 100644 --- a/src/mesh/MFEMMesh.C +++ b/src/mesh/MFEMMesh.C @@ -15,8 +15,16 @@ InputParameters MFEMMesh::validParams() { InputParameters params = FileMesh::validParams(); - params.addParam("serial_ref", 0, "Number of serial refinements to perform on the mesh."); - params.addParam("parallel_ref", 0, "Number of parallel refinements to perform on the mesh."); + params.addParam( + "serial_refine", + 0, + "Number of serial refinements to perform on the mesh. Equivalent to uniform_refine."); + params.addParam( + "uniform_refine", + 0, + "Number of serial refinements to perform on the mesh. Equivalent to serial_refine"); + params.addParam( + "parallel_refine", 0, "Number of parallel refinements to perform on the mesh."); params.addClassDescription("Class to read in and store an mfem::ParMesh from file."); @@ -39,12 +47,18 @@ MFEMMesh::buildMesh() mfem::Mesh mfem_ser_mesh(getFileName()); // Perform serial refinements - uniformRefinement(mfem_ser_mesh, getParam("serial_ref")); + mooseAssert(!(getParam("serial_refine") && getParam("uniform_refine")), + "Cannot define serial_refine and uniform_refine to be nonzero at the same time (they " + "are the same variable). Please choose one.\n"); + + uniformRefinement(mfem_ser_mesh, + (bool)getParam("serial_refine") ? getParam("serial_refine") + : getParam("uniform_refine")); _mfem_par_mesh = std::make_shared(MPI_COMM_WORLD, mfem_ser_mesh); // Perform parallel refinements - uniformRefinement(*_mfem_par_mesh, getParam("parallel_ref")); + uniformRefinement(*_mfem_par_mesh, getParam("parallel_refine")); } void @@ -72,7 +86,7 @@ MFEMMesh::buildDummyMooseMesh() void MFEMMesh::uniformRefinement(mfem::Mesh & mesh, int nref) { - std::cout << "Got into UniformRefinement! Will be doing " << nref << " refinements." << std::endl; + for (int i = 0; i < nref; ++i) mesh.UniformRefinement(); } diff --git a/test/tests/kernels/diffusion.i b/test/tests/kernels/diffusion.i index 72bd39d6..b66c0576 100644 --- a/test/tests/kernels/diffusion.i +++ b/test/tests/kernels/diffusion.i @@ -2,8 +2,8 @@ type = MFEMMesh file = gold/mug.e dim = 3 - serial_ref = 0 - parallel_ref = 0 + serial_refine = 0 + parallel_refine = 0 [] [Problem] From c22cd786444777b746fbd67ae1070ec338a72a47 Mon Sep 17 00:00:00 2001 From: "Henrique B. R" Date: Mon, 12 Aug 2024 14:13:46 +0100 Subject: [PATCH 06/10] Added unit test for mesh refinement --- unit/src/MFEMMeshTest.C | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/unit/src/MFEMMeshTest.C b/unit/src/MFEMMeshTest.C index c611b4ce..14f34ac2 100644 --- a/unit/src/MFEMMeshTest.C +++ b/unit/src/MFEMMeshTest.C @@ -6,7 +6,7 @@ class MFEMMeshTest : public ::testing::Test { protected: void SetUp() override; - void buildMFEMMesh(MeshFileName filename); + void buildMFEMMesh(MeshFileName filename, int serial_ref = 0, int parallel_ref = 0); std::shared_ptr _app; Factory * _factory; @@ -30,10 +30,12 @@ MFEMMeshTest::SetUp() * Helper method to set up and build mesh given mesh filename. */ void -MFEMMeshTest::buildMFEMMesh(MeshFileName filename) +MFEMMeshTest::buildMFEMMesh(MeshFileName filename, int serial_ref, int parallel_ref) { InputParameters params = _factory->getValidParams(_mesh_type); params.set("file") = filename; + params.set("serial_refine") = serial_ref; + params.set("parallel_refine") = parallel_ref; _mfem_mesh_ptr = _factory->create(_mesh_type, "moose_mesh", params); _app->actionWarehouse().mesh() = _mfem_mesh_ptr; _mfem_mesh_ptr->setMeshBase(_mfem_mesh_ptr->buildMeshBaseObject()); @@ -120,3 +122,28 @@ TEST_F(MFEMMeshTest, MFEMHighOrderMeshFormatReader) // Test MFEMMesh can be cloned ASSERT_NE(_mfem_mesh_ptr->safeClone(), nullptr); } + +TEST_F(MFEMMeshTest, Refinement) +{ + buildMFEMMesh("data/mug.e", 1, 2); + mfem::ParMesh & pmesh(_mfem_mesh_ptr->getMFEMParMesh()); + + // Check expected number of vertices have been read + EXPECT_EQ(pmesh.GetNV(), 1349545); + // Check expected number of elements have been read + EXPECT_EQ(pmesh.GetNE(), 1267712); + // Check expected number of boundary elements have been read + EXPECT_EQ(pmesh.GetNBE(), 35456); + // Check expected number of edges have been read + EXPECT_EQ(pmesh.GetNEdges(), 3966632); + // Check expected number of faces have been read + EXPECT_EQ(pmesh.GetNFaces(), 3884800); + // Check expected number of boundary attributes (sidesets) have been read + EXPECT_EQ(pmesh.bdr_attributes.Size(), 2); + // Check expected number of element attributes (blocks) have been read + EXPECT_EQ(pmesh.attributes.Size(), 1); + + // Test MFEMMesh can be cloned + ASSERT_NE(_mfem_mesh_ptr->safeClone(), nullptr); +} + From e3e70f53fcc5b391ff7640c4540519268f9b3ea0 Mon Sep 17 00:00:00 2001 From: "Henrique B. R" Date: Mon, 12 Aug 2024 14:35:36 +0100 Subject: [PATCH 07/10] Linting --- unit/src/MFEMMeshTest.C | 1 - 1 file changed, 1 deletion(-) diff --git a/unit/src/MFEMMeshTest.C b/unit/src/MFEMMeshTest.C index 14f34ac2..a9c1ba4c 100644 --- a/unit/src/MFEMMeshTest.C +++ b/unit/src/MFEMMeshTest.C @@ -146,4 +146,3 @@ TEST_F(MFEMMeshTest, Refinement) // Test MFEMMesh can be cloned ASSERT_NE(_mfem_mesh_ptr->safeClone(), nullptr); } - From 2178cd647ece52ea4b69dbd49bc7ee0b243a54e0 Mon Sep 17 00:00:00 2001 From: "Henrique B. R" Date: Mon, 12 Aug 2024 15:40:53 +0100 Subject: [PATCH 08/10] Changed mooseAssert for a paramError --- src/mesh/MFEMMesh.C | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/mesh/MFEMMesh.C b/src/mesh/MFEMMesh.C index 6def0a47..aeb5a929 100644 --- a/src/mesh/MFEMMesh.C +++ b/src/mesh/MFEMMesh.C @@ -46,14 +46,14 @@ MFEMMesh::buildMesh() // Build the MFEM ParMesh from a serial MFEM mesh mfem::Mesh mfem_ser_mesh(getFileName()); - // Perform serial refinements - mooseAssert(!(getParam("serial_refine") && getParam("uniform_refine")), - "Cannot define serial_refine and uniform_refine to be nonzero at the same time (they " - "are the same variable). Please choose one.\n"); + if (isParamSetByUser("serial_refine") && isParamSetByUser("uniform_refine")) + paramError( + "Cannot define serial_refine and uniform_refine to be nonzero at the same time (they " + "are the same variable). Please choose one.\n"); uniformRefinement(mfem_ser_mesh, - (bool)getParam("serial_refine") ? getParam("serial_refine") - : getParam("uniform_refine")); + isParamSetByUser("serial_refine") ? getParam("serial_refine") + : getParam("uniform_refine")); _mfem_par_mesh = std::make_shared(MPI_COMM_WORLD, mfem_ser_mesh); From 87d85da7c110a2946ae2215a3a60353bc5927775 Mon Sep 17 00:00:00 2001 From: "Henrique B. R" Date: Mon, 12 Aug 2024 15:55:27 +0100 Subject: [PATCH 09/10] Removed explicit refinement lines from diffusion.i --- test/tests/kernels/diffusion.i | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/tests/kernels/diffusion.i b/test/tests/kernels/diffusion.i index b66c0576..938a09d4 100644 --- a/test/tests/kernels/diffusion.i +++ b/test/tests/kernels/diffusion.i @@ -2,8 +2,6 @@ type = MFEMMesh file = gold/mug.e dim = 3 - serial_refine = 0 - parallel_refine = 0 [] [Problem] From 65ae7be32129c61918489b29b29728eaf171f82d Mon Sep 17 00:00:00 2001 From: "Henrique B. R" Date: Mon, 12 Aug 2024 16:42:37 +0100 Subject: [PATCH 10/10] Changed test mesh --- unit/src/MFEMMeshTest.C | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/unit/src/MFEMMeshTest.C b/unit/src/MFEMMeshTest.C index a9c1ba4c..a4a2baba 100644 --- a/unit/src/MFEMMeshTest.C +++ b/unit/src/MFEMMeshTest.C @@ -125,21 +125,21 @@ TEST_F(MFEMMeshTest, MFEMHighOrderMeshFormatReader) TEST_F(MFEMMeshTest, Refinement) { - buildMFEMMesh("data/mug.e", 1, 2); + buildMFEMMesh("data/fichera-q3.mesh", 1, 2); mfem::ParMesh & pmesh(_mfem_mesh_ptr->getMFEMParMesh()); // Check expected number of vertices have been read - EXPECT_EQ(pmesh.GetNV(), 1349545); + EXPECT_EQ(pmesh.GetNV(), 4401); // Check expected number of elements have been read - EXPECT_EQ(pmesh.GetNE(), 1267712); + EXPECT_EQ(pmesh.GetNE(), 3584); // Check expected number of boundary elements have been read - EXPECT_EQ(pmesh.GetNBE(), 35456); + EXPECT_EQ(pmesh.GetNBE(), 1536); // Check expected number of edges have been read - EXPECT_EQ(pmesh.GetNEdges(), 3966632); + EXPECT_EQ(pmesh.GetNEdges(), 12336); // Check expected number of faces have been read - EXPECT_EQ(pmesh.GetNFaces(), 3884800); + EXPECT_EQ(pmesh.GetNFaces(), 11520); // Check expected number of boundary attributes (sidesets) have been read - EXPECT_EQ(pmesh.bdr_attributes.Size(), 2); + EXPECT_EQ(pmesh.bdr_attributes.Size(), 24); // Check expected number of element attributes (blocks) have been read EXPECT_EQ(pmesh.attributes.Size(), 1);