Skip to content

Commit 3c40023

Browse files
committed
Merge branch 'trilinos/improvement-trilinos-space' into trilinos/use-space-refactoring
2 parents a25abaf + 28ac058 commit 3c40023

4 files changed

Lines changed: 105 additions & 5 deletions

File tree

applications/TrilinosApplication/custom_python/add_trilinos_space_to_python.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,26 @@ AuxiliaryVectorWrapper ReadMatrixMarketVector(TrilinosSparseSpaceType& dummy, co
178178
return AuxiliaryVectorWrapper(dummy.ReadMatrixMarketVector(FileName, Comm, n));
179179
}
180180

181+
AuxiliaryVectorWrapper CreateVectorCopy(TrilinosSparseSpaceType& dummy, const TrilinosSparseSpaceType::VectorType& rV)
182+
{
183+
return AuxiliaryVectorWrapper(dummy.CreateVectorCopy(rV));
184+
}
185+
186+
AuxiliaryVectorWrapper CreateVector(TrilinosSparseSpaceType& dummy, TrilinosSparseSpaceType::MapPointerType& pMap)
187+
{
188+
return AuxiliaryVectorWrapper(dummy.CreateVector(pMap));
189+
}
190+
191+
AuxiliaryMatrixWrapper CreateMatrix(TrilinosSparseSpaceType& dummy, TrilinosSparseSpaceType::GraphPointerType& pGraph)
192+
{
193+
return AuxiliaryMatrixWrapper(dummy.CreateMatrix(pGraph));
194+
}
195+
196+
AuxiliaryMatrixWrapper CreateMatrixCopy(TrilinosSparseSpaceType& dummy, const TrilinosSparseSpaceType::MatrixType& rA)
197+
{
198+
return AuxiliaryMatrixWrapper(dummy.CreateMatrixCopy(rA));
199+
}
200+
181201
Epetra_FECrsMatrix& GetMatRef(AuxiliaryMatrixWrapper& dummy)
182202
{
183203
return dummy.GetReference();
@@ -363,6 +383,10 @@ void AddBasicOperations(pybind11::module& m)
363383
.def("ScaleAndAdd", ScaleAndAdd)
364384
.def("CreateEmptyMatrixPointer", CreateEmptyMatrixPointer)
365385
.def("CreateEmptyVectorPointer", CreateEmptyVectorPointer)
386+
.def("CreateVectorCopy", CreateVectorCopy)
387+
.def("CreateVector", CreateVector)
388+
.def("CreateMatrix", CreateMatrix)
389+
.def("CreateMatrixCopy", CreateMatrixCopy)
366390
.def("ReadMatrixMarketMatrix", ReadMatrixMarketMatrix)
367391
.def("ReadMatrixMarketVector", ReadMatrixMarketVector)
368392
.def("WriteMatrixMarketMatrix", WriteMatrixMarketMatrixHelper)

applications/TrilinosApplication/tests/cpp_tests/test_trilinos_space.cpp

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,6 @@ KRATOS_TEST_CASE_IN_SUITE(TrilinosMatrixMarketVector, KratosTrilinosApplicationM
760760
}
761761
}
762762

763-
764763
KRATOS_TEST_CASE_IN_SUITE(TrilinosIsDistributedSpace, KratosTrilinosApplicationMPITestSuite)
765764
{
766765
KRATOS_EXPECT_TRUE(TrilinosSparseSpaceType::IsDistributedSpace());
@@ -950,6 +949,49 @@ KRATOS_TEST_CASE_IN_SUITE(TrilinosCreateVectorCopy, KratosTrilinosApplicationMPI
950949
TrilinosCPPTestUtilities::CheckSparseVectorFromLocalVector(*p_copy, local_vector);
951950
}
952951

952+
KRATOS_TEST_CASE_IN_SUITE(TrilinosCreateVector, KratosTrilinosApplicationMPITestSuite)
953+
{
954+
const auto& r_comm = Testing::GetDefaultDataCommunicator();
955+
const int size = 2 * r_comm.Size();
956+
auto raw_mpi_comm = MPIDataCommunicator::GetMPICommunicator(r_comm);
957+
TrilinosSparseSpaceType::CommunicatorType epetra_comm(raw_mpi_comm);
958+
auto p_map = Kratos::make_shared<TrilinosSparseSpaceType::MapType>(size, 0, epetra_comm);
959+
auto p_vec = TrilinosSparseSpaceType::CreateVector(p_map);
960+
KRATOS_EXPECT_FALSE(TrilinosSparseSpaceType::IsNull(p_vec));
961+
KRATOS_EXPECT_EQ(static_cast<std::size_t>(size), TrilinosSparseSpaceType::Size(*p_vec));
962+
}
963+
964+
KRATOS_TEST_CASE_IN_SUITE(TrilinosCreateMatrix, KratosTrilinosApplicationMPITestSuite)
965+
{
966+
const auto& r_comm = Testing::GetDefaultDataCommunicator();
967+
const int size = 2 * r_comm.Size();
968+
auto matrix = TrilinosCPPTestUtilities::GenerateDummySparseMatrix(r_comm, size);
969+
// Build a graph from the existing matrix and use CreateMatrix
970+
auto p_graph = Kratos::make_shared<TrilinosSparseSpaceType::GraphType>(matrix.Graph());
971+
auto p_new_matrix = TrilinosSparseSpaceType::CreateMatrix(p_graph);
972+
KRATOS_EXPECT_FALSE(TrilinosSparseSpaceType::IsNull(p_new_matrix));
973+
KRATOS_EXPECT_EQ(TrilinosSparseSpaceType::Size1(matrix), TrilinosSparseSpaceType::Size1(*p_new_matrix));
974+
KRATOS_EXPECT_EQ(TrilinosSparseSpaceType::Size2(matrix), TrilinosSparseSpaceType::Size2(*p_new_matrix));
975+
}
976+
977+
KRATOS_TEST_CASE_IN_SUITE(TrilinosCreateMatrixCopy, KratosTrilinosApplicationMPITestSuite)
978+
{
979+
const auto& r_comm = Testing::GetDefaultDataCommunicator();
980+
const int size = 2 * r_comm.Size();
981+
auto matrix = TrilinosCPPTestUtilities::GenerateDummySparseMatrix(r_comm, size);
982+
auto p_copy = TrilinosSparseSpaceType::CreateMatrixCopy(matrix);
983+
// Sizes must match
984+
KRATOS_EXPECT_EQ(TrilinosSparseSpaceType::Size1(matrix), TrilinosSparseSpaceType::Size1(*p_copy));
985+
KRATOS_EXPECT_EQ(TrilinosSparseSpaceType::Size2(matrix), TrilinosSparseSpaceType::Size2(*p_copy));
986+
// Frobenius norms must match
987+
KRATOS_EXPECT_NEAR(TrilinosSparseSpaceType::TwoNorm(matrix),
988+
TrilinosSparseSpaceType::TwoNorm(*p_copy), 1.0e-12);
989+
// Copy must be independent: zeroing the original does not affect the copy
990+
const double original_norm = TrilinosSparseSpaceType::TwoNorm(*p_copy);
991+
TrilinosSparseSpaceType::SetToZero(matrix);
992+
KRATOS_EXPECT_NEAR(TrilinosSparseSpaceType::TwoNorm(*p_copy), original_norm, 1.0e-12);
993+
}
994+
953995
KRATOS_TEST_CASE_IN_SUITE(TrilinosCreateEmptyPointerWithComm, KratosTrilinosApplicationMPITestSuite)
954996
{
955997
const auto& r_comm = Testing::GetDefaultDataCommunicator();

applications/TrilinosApplication/tests/cpp_tests/trilinos_cpp_test_utilities.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,8 @@ class TrilinosCPPTestUtilities
187187
* @param rRowIndexes The row indices
188188
* @param rColumnIndexes The column indices
189189
* @param rValues The values
190-
* @param PrintValues If printing the vectors, for debugging pourposes
191-
* @param IncludeHardZeros If including the hard zeros (giving a cerain threshold)
190+
* @param PrintValues If printing the vectors, for debugging purposes
191+
* @param IncludeHardZeros If including the hard zeros (giving a certain threshold)
192192
*/
193193
static void GenerateSparseMatrixIndexAndValuesVectors(
194194
const TrilinosSparseSpaceType::MatrixType& rA,

applications/TrilinosApplication/trilinos_space.h

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,9 +264,43 @@ class TrilinosSpace
264264
* @param src The source vector
265265
* @return Shared pointer to a deep copy of src
266266
*/
267-
static VectorPointerType CreateVectorCopy(const VectorType& src)
267+
static VectorPointerType CreateVectorCopy(const VectorType& rVector)
268268
{
269-
return VectorPointerType(new VectorType(src));
269+
return VectorPointerType(new VectorType(rVector));
270+
}
271+
272+
/**
273+
* @brief Creates a VectorType from a given Epetra map.
274+
* @param pMap The Epetra map to construct the vector from
275+
* @return Shared pointer to the newly created vector
276+
*/
277+
static VectorPointerType CreateVector(const MapPointerType& pMap)
278+
{
279+
return VectorPointerType(new VectorType(*pMap));
280+
}
281+
282+
/**
283+
* @brief Creates a MatrixType from a given Epetra CRS graph.
284+
* @param pGraph The Epetra CRS graph to construct the matrix from
285+
* @return Shared pointer to the newly created matrix
286+
*/
287+
static MatrixPointerType CreateMatrix(const GraphPointerType& pGraph)
288+
{
289+
return MatrixPointerType(new TMatrixType(::Copy, *pGraph));
290+
}
291+
292+
/**
293+
* @brief Creates a deep copy of a matrix.
294+
* @details Constructs a new matrix with the same sparsity pattern and values
295+
* as @p rMatrix using the existing CopyMatrixValues helper.
296+
* @param rMatrix The source matrix to copy
297+
* @return Shared pointer to the new matrix
298+
*/
299+
static MatrixPointerType CreateMatrixCopy(const MatrixType& rMatrix)
300+
{
301+
auto p_copy = MatrixPointerType(new TMatrixType(::Copy, rMatrix.Graph()));
302+
CopyMatrixValues(*p_copy, rMatrix);
303+
return p_copy;
270304
}
271305

272306
/**

0 commit comments

Comments
 (0)