From c414dd249f70aff067252fd71293b601c71c5c0e Mon Sep 17 00:00:00 2001
From: Thomas Fischer <thomas.fischer@ufz.de>
Date: Mon, 25 Jun 2012 16:16:42 +0200
Subject: [PATCH] - changed name of executable and source file from
 MatVecMultPerm to MatVecMultNDPerm - reformatted output

---
 SimpleTests/MatrixTests/CMakeLists.txt       |   8 +-
 SimpleTests/MatrixTests/MatMult.cpp          |  21 +--
 SimpleTests/MatrixTests/MatVecMultNDPerm.cpp | 173 +++++++++++++++++++
 3 files changed, 180 insertions(+), 22 deletions(-)
 create mode 100644 SimpleTests/MatrixTests/MatVecMultNDPerm.cpp

diff --git a/SimpleTests/MatrixTests/CMakeLists.txt b/SimpleTests/MatrixTests/CMakeLists.txt
index 3134e521cff..bec0e87864f 100644
--- a/SimpleTests/MatrixTests/CMakeLists.txt
+++ b/SimpleTests/MatrixTests/CMakeLists.txt
@@ -34,14 +34,14 @@ ADD_EXECUTABLE( MatTestRemoveRowsCols
 SET_TARGET_PROPERTIES(MatTestRemoveRowsCols PROPERTIES FOLDER SimpleTests)
 
 IF (METIS_FOUND)
-	ADD_EXECUTABLE( MatVecMultPerm
-        	MatVecMultPerm.cpp
+	ADD_EXECUTABLE( MatVecMultNDPerm
+        	MatVecMultNDPerm.cpp
 	        ${SOURCES}
         	${HEADERS}
 	)
-	SET_TARGET_PROPERTIES(MatVecMultPerm PROPERTIES FOLDER SimpleTests)
+	SET_TARGET_PROPERTIES(MatVecMultNDPerm PROPERTIES FOLDER SimpleTests)
 
-	TARGET_LINK_LIBRARIES ( MatVecMultPerm
+	TARGET_LINK_LIBRARIES ( MatVecMultNDPerm
 		BaseLib
 		MathLib
 		logog
diff --git a/SimpleTests/MatrixTests/MatMult.cpp b/SimpleTests/MatrixTests/MatMult.cpp
index ff2c8c7ad62..b58bfd76171 100644
--- a/SimpleTests/MatrixTests/MatMult.cpp
+++ b/SimpleTests/MatrixTests/MatMult.cpp
@@ -96,12 +96,12 @@ int main(int argc, char *argv[])
 		timer.start();
 		CS_read(in, n, iA, jA, A);
 		timer.stop();
-		INFO("ok, %e s", timer.elapsed());
+		INFO("\t- took %e s", timer.elapsed());
 	} else {
 		ERR("error reading matrix from %s", fname_mat.c_str());
 	}
 	unsigned nnz(iA[n]);
-	INFO("Parameters read: n=%d, nnz=%d", n, nnz);
+	INFO("\tParameters read: n=%d, nnz=%d", n, nnz);
 
 #ifdef _OPENMP
 	omp_set_num_threads(n_threads);
@@ -109,8 +109,6 @@ int main(int argc, char *argv[])
 #else
 	MathLib::CRSMatrix<double, unsigned> mat (n, iA, jA, A);
 #endif
-//	CRSMatrixPThreads<double> mat (n, iA, jA, A, n_threads);
-	INFO("%d x %d ", mat.getNRows(), mat.getNCols());
 
 	double *x(new double[n]);
 	double *y(new double[n]);
@@ -129,20 +127,7 @@ int main(int argc, char *argv[])
 	cpu_timer.stop();
 	run_timer.stop();
 
-	INFO("done [%e sec cpu time], [%e sec run time]", cpu_timer.elapsed(), run_timer.elapsed());
-	INFO("CPU time: %e", cpu_timer.elapsed());
-	INFO("wclock time: %e", run_timer.elapsed());
-
-	if (! output_arg.getValue().empty()) {
-		std::ofstream result_os (output_arg.getValue().c_str(), std::ios::app);
-		if (result_os) {
-			result_os << cpu_timer.elapsed() << "\t" << run_timer.elapsed() << std::endl;
-		}
-		result_os.close();
-	} else {
-		INFO("%e \t %e", cpu_timer.elapsed(), run_timer.elapsed());
-	}
-
+	INFO("\t[MVM] - took %e sec cpu time, %e sec run time", cpu_timer.elapsed(), run_timer.elapsed());
 
 	delete [] x;
 	delete [] y;
diff --git a/SimpleTests/MatrixTests/MatVecMultNDPerm.cpp b/SimpleTests/MatrixTests/MatVecMultNDPerm.cpp
new file mode 100644
index 00000000000..20ce14d29a9
--- /dev/null
+++ b/SimpleTests/MatrixTests/MatVecMultNDPerm.cpp
@@ -0,0 +1,173 @@
+/*
+ * MatVecMultNDPerm.cpp
+ *
+ *  Created on: Jan 3, 2012
+ *      Author: TF
+ */
+
+#include <cstdlib>
+
+// BaseLib
+#include "RunTime.h"
+#include "CPUTime.h"
+// BaseLib/tclap
+#include "tclap/CmdLine.h"
+// BaseLib/logog
+#include "logog.hpp"
+#include "formatter.hpp"
+
+// MathLib
+#include "sparse.h"
+
+#include "LinAlg/Sparse/NestedDissectionPermutation/AdjMat.h"
+#include "LinAlg/Sparse/NestedDissectionPermutation/CRSMatrixReordered.h"
+#include "LinAlg/Sparse/NestedDissectionPermutation/Cluster.h"
+#include "LinAlg/Sparse/CRSMatrix.h"
+
+/**
+ * new formatter for logog
+ */
+class FormatterCustom : public logog::FormatterGCC
+{
+    virtual TOPIC_FLAGS GetTopicFlags( const logog::Topic &topic )
+    {
+        return ( Formatter::GetTopicFlags( topic ) &
+                 ~( TOPIC_FILE_NAME_FLAG | TOPIC_LINE_NUMBER_FLAG ));
+    }
+};
+
+int main(int argc, char *argv[])
+{
+	LOGOG_INITIALIZE();
+
+	TCLAP::CmdLine cmd("The purpose of this program is the speed test of sparse matrix vector multiplication (MVM), where the matrix is stored in CRS format. Before executing the MVM a nested dissection reordering is performed.", ' ', "0.1");
+
+	// Define a value argument and add it to the command line.
+	// A value arg defines a flag and a type of value that it expects,
+	// such as "-m matrix".
+	TCLAP::ValueArg<std::string> matrix_arg("m","matrix","input matrix file in CRS format",true,"","file name of the matrix in CRS format");
+
+	// Add the argument mesh_arg to the CmdLine object. The CmdLine object
+	// uses this Arg to parse the command line.
+	cmd.add( matrix_arg );
+
+//	TCLAP::ValueArg<unsigned> n_cores_arg("n", "number-cores", "number of cores to use", true, "1", "number");
+//	cmd.add( n_cores_arg );
+
+	TCLAP::ValueArg<unsigned> n_mults_arg("n", "number-of-multiplications", "number of multiplications to perform", true, 10, "number of multiplications");
+	cmd.add( n_mults_arg );
+
+	TCLAP::ValueArg<std::string> output_arg("o", "output", "output file", false, "", "string");
+	cmd.add( output_arg );
+
+	TCLAP::ValueArg<unsigned> verbosity_arg("v", "verbose", "level of verbosity [0 very low information, 1 much information]", false, 0, "string");
+	cmd.add( verbosity_arg );
+
+	cmd.parse( argc, argv );
+
+	// read the number of multiplication to execute
+	unsigned n_mults (n_mults_arg.getValue());
+	std::string fname_mat (matrix_arg.getValue());
+	bool verbose (verbosity_arg.getValue());
+
+	FormatterCustom *custom_format (new FormatterCustom);
+	logog::Cout *logogCout(new logog::Cout);
+	logogCout->SetFormatter(*custom_format);
+
+	// *** reading matrix in crs format from file
+	std::ifstream in(fname_mat.c_str(), std::ios::in | std::ios::binary);
+	double *A(NULL);
+	unsigned *iA(NULL), *jA(NULL), n;
+	if (in) {
+		if (verbose) {
+			INFO("reading matrix from %s ...", fname_mat.c_str());
+		}
+		BaseLib::RunTime timer;
+		timer.start();
+		CS_read(in, n, iA, jA, A);
+		timer.stop();
+		if (verbose) {
+			INFO("ok, %e s", timer.elapsed());
+		}
+	} else {
+		ERR("error reading matrix from %s", fname_mat.c_str());
+		return -1;
+	}
+	unsigned nnz(iA[n]);
+	if (verbose) {
+		INFO("Parameters read: n=%d, nnz=%d", n, nnz);
+	}
+
+	MathLib::CRSMatrixReordered mat(n, iA, jA, A);
+
+	double *x(new double[n]);
+	double *y(new double[n]);
+
+	for (unsigned k(0); k<n; ++k)
+		x[k] = 1.0;
+
+	// create time measurement objects
+	BaseLib::RunTime run_timer;
+	BaseLib::CPUTime cpu_timer;
+
+	// calculate the nested dissection reordering
+	if (verbose) {
+		INFO("*** calculating nested dissection (ND) permutation of matrix ...");
+	}
+	run_timer.start();
+	cpu_timer.start();
+	MathLib::Cluster cluster_tree(n, iA, jA);
+	unsigned *op_perm(new unsigned[n]);
+	unsigned *po_perm(new unsigned[n]);
+	for (unsigned k(0); k<n; k++)
+		op_perm[k] = po_perm[k] = k;
+	cluster_tree.createClusterTree(op_perm, po_perm, 1000);
+	cpu_timer.stop();
+	run_timer.stop();
+	if (verbose) {
+		INFO("\t[ND] - took %e sec \t%e sec", cpu_timer.elapsed(), run_timer.elapsed());
+	}
+
+	// applying the nested dissection reordering
+	if (verbose) {
+		INFO("\t[ND] applying nested dissection permutation to FEM matrix ... ");
+	}
+	run_timer.start();
+	cpu_timer.start();
+	mat.reorderMatrix(op_perm, po_perm);
+	cpu_timer.stop();
+	run_timer.stop();
+	if (verbose) {
+		INFO("\t[ND]: - took %e sec\t%e sec", cpu_timer.elapsed(), run_timer.elapsed());
+	}
+
+#ifndef NDEBUG
+//	std::string fname_mat_out(fname_mat.substr(0,fname_mat.length()-4)+"-reordered.bin");
+//	std::ofstream os (fname_mat_out.c_str(), std::ios::binary);
+//	if (os) {
+//		std::cout << "writing matrix to " << fname_mat_out << " ... " << std::flush;
+//		CS_write(os, n, mat.getRowPtrArray(), mat.getColIdxArray(), mat.getEntryArray());
+//		std::cout << "done" << std::endl;
+//	}
+#endif
+
+	if (verbose) {
+		INFO("*** matrix vector multiplication (MVM) with Toms amuxCRS ... ");
+	}
+	run_timer.start();
+	cpu_timer.start();
+	for (size_t k(0); k<n_mults; k++) {
+		mat.amux (1.0, x, y);
+	}
+	cpu_timer.stop();
+	run_timer.stop();
+
+	if (verbose) {
+		INFO("\t[MVM] - took %e sec\t %e sec", cpu_timer.elapsed(), run_timer.elapsed());
+	}
+
+	delete [] x;
+	delete [] y;
+
+	return 0;
+}
-- 
GitLab