|
Teuchos - Trilinos Tools Package
Version of the Day
|
00001 // @HEADER 00002 // *********************************************************************** 00003 // 00004 // Tpetra: Templated Linear Algebra Services Package 00005 // Copyright (2008) Sandia Corporation 00006 // 00007 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, 00008 // the U.S. Government retains certain rights in this software. 00009 // 00010 // Redistribution and use in source and binary forms, with or without 00011 // modification, are permitted provided that the following conditions are 00012 // met: 00013 // 00014 // 1. Redistributions of source code must retain the above copyright 00015 // notice, this list of conditions and the following disclaimer. 00016 // 00017 // 2. Redistributions in binary form must reproduce the above copyright 00018 // notice, this list of conditions and the following disclaimer in the 00019 // documentation and/or other materials provided with the distribution. 00020 // 00021 // 3. Neither the name of the Corporation nor the names of the 00022 // contributors may be used to endorse or promote products derived from 00023 // this software without specific prior written permission. 00024 // 00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY 00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE 00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00036 // 00037 // Questions? Contact Michael A. Heroux (maherou@sandia.gov) 00038 // 00039 // ************************************************************************ 00040 // @HEADER 00041 00042 #ifndef __Teuchos_MatrixMarket_Raw_Writer_hpp 00043 #define __Teuchos_MatrixMarket_Raw_Writer_hpp 00044 00045 #include "Teuchos_MatrixMarket_SetScientific.hpp" 00046 #include "Teuchos_ArrayView.hpp" 00047 #include "Teuchos_ParameterList.hpp" 00048 #include <fstream> 00049 #include <iostream> 00050 00051 namespace Teuchos { 00052 namespace MatrixMarket { 00053 namespace Raw { 00066 template<class ScalarType, class OrdinalType> 00067 class Writer { 00068 public: 00090 void 00091 writeFile (const std::string& filename, 00092 const ArrayView<const OrdinalType>& rowptr, 00093 const ArrayView<const OrdinalType>& colind, 00094 const ArrayView<const ScalarType>& values, 00095 const OrdinalType numRows, 00096 const OrdinalType numCols) 00097 { 00098 std::ofstream out (filename.c_str ()); 00099 TEUCHOS_TEST_FOR_EXCEPTION(! out, std::runtime_error, 00100 "Failed to open file \"" << filename << "\" for writing."); 00101 write (out, rowptr, colind, values, numRows, numCols); 00102 } 00103 00129 void 00130 write (std::ostream& out, 00131 const ArrayView<const OrdinalType>& rowptr, 00132 const ArrayView<const OrdinalType>& colind, 00133 const ArrayView<const ScalarType>& values, 00134 const OrdinalType numRows, 00135 const OrdinalType numCols) 00136 { 00137 using std::endl; 00138 typedef ScalarTraits<ScalarType> STS; 00139 typedef typename ArrayView<const OrdinalType>::size_type size_type; 00140 00141 // Make the output stream write floating-point numbers in 00142 // scientific notation. It will politely put the output 00143 // stream back to its state on input, when this scope 00144 // terminates. 00145 Teuchos::MatrixMarket::details::SetScientific<ScalarType> sci (out); 00146 00147 // Data type string for ScalarType. 00148 std::string dataType; 00149 if (STS::isComplex) { 00150 dataType = "complex"; 00151 } else if (STS::isOrdinal) { 00152 dataType = "integer"; 00153 } else { 00154 dataType = "real"; 00155 } 00156 00157 // Print the Matrix Market banner line. We assume 00158 // nonsymmetric storage ("general"). 00159 out << "%%MatrixMarket matrix coordinate " << dataType << " general" 00160 << endl; 00161 00162 // // Print comments (the matrix name and / or description). 00163 // if (matrixName != "") { 00164 // printAsComment (out, matrixName); 00165 // } 00166 // if (matrixDescription != "") { 00167 // printAsComment (out, matrixDescription); 00168 // } 00169 00170 // Write the dimensions of the sparse matrix: (# rows, # 00171 // columns, # matrix entries (counting duplicates as 00172 // separate entries)). 00173 out << numRows << " " << numCols << " " << rowptr[numRows] << endl; 00174 00175 for (size_type i = 0; i < numRows; ++i) { 00176 for (OrdinalType k = rowptr[i]; k < rowptr[i+1]; ++k) { 00177 const OrdinalType j = colind[k]; 00178 const ScalarType& A_ij = values[k]; 00179 00180 // Matrix Market files use 1-based row and column indices. 00181 out << (i+1) << " " << (j+1) << " "; 00182 if (STS::isComplex) { 00183 out << STS::real (A_ij) << " " << STS::imag (A_ij); 00184 } else { 00185 out << A_ij; 00186 } 00187 out << endl; 00188 } 00189 } 00190 } 00191 }; // end of class Writer 00192 } // namespace Raw 00193 } // namespace MatrixMarket 00194 } // namespace Teuchos 00195 00196 #endif // __Teuchos_MatrixMarket_Raw_Writer_hpp
1.7.6.1