Am Montag, 13. Mai 2022, finden Wartungsarbeiten am Gitlab-Server (Update auf neue Version statt). Der Dienst wird daher am Montag für einige Zeit nicht verfügbar sein.
On Monday, May 13th 2022, the Gitlab server will be updated. The service will therefore not be accessible for some time on Monday.

Commit e0fde3a2 authored by Thomas Witkowski's avatar Thomas Witkowski
Browse files

Changes in ProblemVec matrix debugging functions.

parent 827d3113
...@@ -660,8 +660,6 @@ namespace AMDiS { ...@@ -660,8 +660,6 @@ namespace AMDiS {
// will be set to false). // will be set to false).
DOFMatrix *matrix = (*systemMatrix)[i][j]; DOFMatrix *matrix = (*systemMatrix)[i][j];
std::cout << " i = " << i << " j = " << j << " matrix " << matrix << std::endl;
if (matrix) if (matrix)
matrix->calculateNnz(); matrix->calculateNnz();
...@@ -765,29 +763,6 @@ namespace AMDiS { ...@@ -765,29 +763,6 @@ namespace AMDiS {
if (matrix) if (matrix)
nnz += matrix->getBaseMatrix().nnz(); nnz += matrix->getBaseMatrix().nnz();
std::cout << " i = " << i << " j = " << j << " matrix " << matrix << std::endl;
if (i == 0 && matrix) {
using mtl::tag::major; using mtl::tag::nz; using mtl::begin; using mtl::end;
namespace traits= mtl::traits;
typedef DOFMatrix::base_matrix_type Matrix;
traits::row<Matrix>::type row(matrix->getBaseMatrix());
traits::col<Matrix>::type col(matrix->getBaseMatrix());
traits::const_value<Matrix>::type value(matrix->getBaseMatrix());
typedef traits::range_generator<major, Matrix>::type cursor_type;
typedef traits::range_generator<nz, cursor_type>::type icursor_type;
std::cout.precision(10);
for (cursor_type cursor = begin<major>(matrix->getBaseMatrix()), cend = end<major>(matrix->getBaseMatrix()); cursor != cend; ++cursor)
for (icursor_type icursor = begin<nz>(cursor), icend = end<nz>(cursor); icursor != icend; ++icursor)
if (row(*icursor) == 0)
std::cout << "C = " << col(*icursor) << " : " << value(*icursor) << std::endl;
std::cout << "============================" << std::endl;
}
} }
// And now assemble boundary conditions on the vectors // And now assemble boundary conditions on the vectors
...@@ -1464,19 +1439,27 @@ namespace AMDiS { ...@@ -1464,19 +1439,27 @@ namespace AMDiS {
typedef traits::range_generator<major, Matrix>::type cursor_type; typedef traits::range_generator<major, Matrix>::type cursor_type;
typedef traits::range_generator<nz, cursor_type>::type icursor_type; typedef traits::range_generator<nz, cursor_type>::type icursor_type;
// Create map with all world coordinates of all DOFs.
DofToCoord dofToCoords; DofToCoord dofToCoords;
createDofToCoordMap(dofToCoords); createDofToCoordMap(dofToCoords);
// Start writing output file.
std::ofstream out(filename.c_str()); std::ofstream out(filename.c_str());
out.precision(15);
// First, we write the number of DOFs the file contains.
out << dofToCoords.size() << std::endl; out << dofToCoords.size() << std::endl;
int dimOfWorld = Global::getGeo(WORLD); int dimOfWorld = Global::getGeo(WORLD);
// And now write all the DOF's coords. The first line contains the dof index, all
// the other lines contain one component of the coordinates.
for (DofToCoord::iterator it = dofToCoords.begin(); it != dofToCoords.end(); ++it) { for (DofToCoord::iterator it = dofToCoords.begin(); it != dofToCoords.end(); ++it) {
out << it->first << std::endl; out << it->first << std::endl;
for (int j = 0; j < dimOfWorld; j++) for (int j = 0; j < dimOfWorld; j++)
out << (it->second)[j] << std::endl; out << (it->second)[j] << std::endl;
} }
// Write the matrices.
for (int i = 0; i < nComponents; i++) { for (int i = 0; i < nComponents; i++) {
for (int j = 0; j < nComponents; j++) { for (int j = 0; j < nComponents; j++) {
DOFMatrix *dofmatrix = (*systemMatrix)[i][j]; DOFMatrix *dofmatrix = (*systemMatrix)[i][j];
...@@ -1488,6 +1471,7 @@ namespace AMDiS { ...@@ -1488,6 +1471,7 @@ namespace AMDiS {
int nnz = matrix.nnz(); int nnz = matrix.nnz();
int testNnz = 0; int testNnz = 0;
// Write to file, how many entries the matrix conatins.
out << nnz << std::endl; out << nnz << std::endl;
traits::row<Matrix>::type row(matrix); traits::row<Matrix>::type row(matrix);
...@@ -1503,6 +1487,7 @@ namespace AMDiS { ...@@ -1503,6 +1487,7 @@ namespace AMDiS {
} }
} }
// Just to check, if nnz() is correct.
TEST_EXIT(testNnz == nnz)("NNZ does not fit together!\n"); TEST_EXIT(testNnz == nnz)("NNZ does not fit together!\n");
} }
} }
...@@ -1519,6 +1504,7 @@ namespace AMDiS { ...@@ -1519,6 +1504,7 @@ namespace AMDiS {
typedef traits::range_generator<major, Matrix>::type cursor_type; typedef traits::range_generator<major, Matrix>::type cursor_type;
typedef traits::range_generator<nz, cursor_type>::type icursor_type; typedef traits::range_generator<nz, cursor_type>::type icursor_type;
// Create a map from coords of all DOFs, to the DOF indices in this problem.
CoordToDof coordToDof; CoordToDof coordToDof;
createCoordToDofMap(coordToDof); createCoordToDofMap(coordToDof);
...@@ -1527,9 +1513,12 @@ namespace AMDiS { ...@@ -1527,9 +1513,12 @@ namespace AMDiS {
DegreeOfFreedom dof; DegreeOfFreedom dof;
int dimOfWorld = Global::getGeo(WORLD); int dimOfWorld = Global::getGeo(WORLD);
// Open file and read the number of DOFs the file contains.
std::ifstream in(filename.c_str()); std::ifstream in(filename.c_str());
int nReadDofs; int nReadDofs;
in >> nReadDofs; in >> nReadDofs;
// Read all DOF indices and their world coordinates.
for (int i = 0; i < nReadDofs; i++) { for (int i = 0; i < nReadDofs; i++) {
in >> dof; in >> dof;
for (int j = 0; j < dimOfWorld; j++) for (int j = 0; j < dimOfWorld; j++)
...@@ -1537,6 +1526,7 @@ namespace AMDiS { ...@@ -1537,6 +1526,7 @@ namespace AMDiS {
dofToCoord[dof] = coords; dofToCoord[dof] = coords;
} }
// Now we traverse all matrices and check them.
for (int i = 0; i < nComponents; i++) { for (int i = 0; i < nComponents; i++) {
for (int j = 0; j < nComponents; j++) { for (int j = 0; j < nComponents; j++) {
DOFMatrix *dofmatrix = (*systemMatrix)[i][j]; DOFMatrix *dofmatrix = (*systemMatrix)[i][j];
...@@ -1547,6 +1537,8 @@ namespace AMDiS { ...@@ -1547,6 +1537,8 @@ namespace AMDiS {
int readNnz; int readNnz;
in >> readNnz; in >> readNnz;
// Read each entry in file and check it with the corresponding matrix value
// in this problem.
for (int k = 0; k < readNnz; k++) { for (int k = 0; k < readNnz; k++) {
DegreeOfFreedom row, col; DegreeOfFreedom row, col;
double value; double value;
...@@ -1558,12 +1550,34 @@ namespace AMDiS { ...@@ -1558,12 +1550,34 @@ namespace AMDiS {
WorldVector<double> rowCoords = dofToCoord[row]; WorldVector<double> rowCoords = dofToCoord[row];
WorldVector<double> colCoords = dofToCoord[col]; WorldVector<double> colCoords = dofToCoord[col];
if (coordToDof.find(rowCoords) == coordToDof.end()) if (coordToDof.find(rowCoords) == coordToDof.end()) {
std::cout << "CANNOT FIND" << std::endl; std::cout << "CANNOT ROW FIND" << std::endl;
rowCoords.print();
exit(0);
}
if (coordToDof.find(colCoords) == coordToDof.end()) {
std::cout << "CANNOT COL FIND" << std::endl;
rowCoords.print();
exit(0);
}
DegreeOfFreedom rowHere = coordToDof[rowCoords];
DegreeOfFreedom colHere = coordToDof[colCoords];
double valueHere = (dofmatrix->getBaseMatrix())[rowHere][colHere];
double diff = fabs(valueHere - value);
// And so we check the difference between the value read from file and the
// corresponding value in the matrix.
if (diff > 1e-10) {
std::cout << "WRONG value in matrix[" << i << "][" << j << "]!" << std::endl
<< " DOF in other matrix [" << row << "][" << col << "] = " << value << std::endl
<< " DOF in this matrix [" << rowHere << "][" << colHere << "] = " << valueHere << std::endl;
exit(0);
}
if (coordToDof.find(colCoords) == coordToDof.end())
std::cout << "CANNOT FIND" << std::endl;
} }
} }
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment