|
AbstractLinAlgPack: C++ Interfaces For Vectors, Matrices And Related Linear Algebra Objects
Version of the Day
|
00001 #if 0 00002 00003 // @HEADER 00004 // *********************************************************************** 00005 // 00006 // Moocho: Multi-functional Object-Oriented arCHitecture for Optimization 00007 // Copyright (2003) Sandia Corporation 00008 // 00009 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive 00010 // license for use of this work by or on behalf of the U.S. Government. 00011 // 00012 // Redistribution and use in source and binary forms, with or without 00013 // modification, are permitted provided that the following conditions are 00014 // met: 00015 // 00016 // 1. Redistributions of source code must retain the above copyright 00017 // notice, this list of conditions and the following disclaimer. 00018 // 00019 // 2. Redistributions in binary form must reproduce the above copyright 00020 // notice, this list of conditions and the following disclaimer in the 00021 // documentation and/or other materials provided with the distribution. 00022 // 00023 // 3. Neither the name of the Corporation nor the names of the 00024 // contributors may be used to endorse or promote products derived from 00025 // this software without specific prior written permission. 00026 // 00027 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY 00028 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00029 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00030 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE 00031 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00032 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00033 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00034 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00035 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00036 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00037 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00038 // 00039 // Questions? Contact Roscoe A. Bartlett (rabartl@sandia.gov) 00040 // 00041 // *********************************************************************** 00042 // @HEADER 00043 00044 #include <stdlib.h> 00045 00046 #include "AbstractLinAlgPack_SparseCOOReadMatrix.hpp" 00047 00048 // Throw an exception if the char is not ':' 00049 namespace { 00050 inline void assert_sep_char(char c) { 00051 if(c != ':') 00052 throw AbstractLinAlgPack::InputException("Sparse COO matrix input stream error: The seperator between the element, row indice and column indice must be a \':\'"); 00053 } 00054 inline void assert_eof(std::istream& istrm) { 00055 if(istrm.eof()) 00056 throw AbstractLinAlgPack::InputException("Sparse COO matrix input stream error: Premature end to the input file."); 00057 } 00058 } 00059 00060 void AbstractLinAlgPack::read_coo_into_valarrays(std::istream& istrm, size_type& m, size_type& n, size_type& nz 00061 , std::valarray<value_type>& a, std::valarray<indice_type>& ivect 00062 , std::valarray<indice_type>& jvect) 00063 { 00064 // read in dimensions and resize 00065 istrm >> m; assert_eof(istrm); 00066 istrm >> n; assert_eof(istrm); 00067 istrm >> nz; 00068 a.resize(nz); 00069 ivect.resize(nz); 00070 jvect.resize(nz); 00071 00072 // Read in the non-zero elements 00073 value_type *p_a = &a[0], 00074 *p_a_last = p_a + nz; 00075 indice_type *p_ivect = &ivect[0], 00076 *p_jvect = &jvect[0]; 00077 00078 for(; p_a != p_a_last; ++p_a, ++p_ivect, ++p_jvect) { 00079 const int bs = 50; 00080 char num[bs]; 00081 char c; 00082 assert_eof(istrm); 00083 istrm.get(num, bs-1, ':'); assert_eof(istrm); *p_a = ::atof(num); // Read in ak 00084 istrm.get(c); assert_eof(istrm); assert_sep_char(c); // Read in ':' 00085 istrm.get(num, bs-1, ':'); assert_eof(istrm); *p_ivect = ::atoi(num);// Read in ik 00086 istrm.get(c); assert_eof(istrm); assert_sep_char(c); // Read in ':' 00087 istrm >> *p_jvect; // Read in jk 00088 } 00089 } 00090 00091 #endif // 0
1.7.6.1