MPQC 2.3.1
|
00001 // 00002 // print_scmat_norms.h 00003 // 00004 // Copyright (C) 2005 Edward Valeev 00005 // 00006 // Author: Edward Valeev <edward.valeev@chemistry.gatech.edu> 00007 // Maintainer: EV 00008 // 00009 // This file is part of the SC Toolkit. 00010 // 00011 // The SC Toolkit is free software; you can redistribute it and/or modify 00012 // it under the terms of the GNU Library General Public License as published by 00013 // the Free Software Foundation; either version 2, or (at your option) 00014 // any later version. 00015 // 00016 // The SC Toolkit is distributed in the hope that it will be useful, 00017 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00019 // GNU Library General Public License for more details. 00020 // 00021 // You should have received a copy of the GNU Library General Public License 00022 // along with the SC Toolkit; see the file COPYING.LIB. If not, write to 00023 // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 00024 // 00025 // The U.S. Government is granted a limited license as per AL 91-7. 00026 // 00027 00028 #ifdef __GNUG__ 00029 #pragma interface 00030 #endif 00031 00032 #include <string> 00033 #include <util/misc/formio.h> 00034 #include <util/ref/ref.h> 00035 #include <math/scmat/matrix.h> 00036 00037 #ifndef _chemistry_qc_mbptr12_printscmatnorms_h 00038 #define _chemistry_qc_mbptr12_printscmatnorms_h 00039 00040 namespace sc { 00041 00043 template <class RefSCMat> 00044 void print_scmat_norms(const RefSCMat& A, const std::string& label, std::ostream& os = ExEnv::out0()) 00045 { 00046 Ref<SCElementMaxAbs> maxabs_op(new SCElementMaxAbs); 00047 A.element_op(maxabs_op); 00048 const double maxabs = maxabs_op->result(); 00049 00050 Ref<SCElementKNorm> onenorm_op(new SCElementKNorm(1.0)); 00051 A.element_op(onenorm_op); 00052 const double onenorm = onenorm_op->result(); 00053 00054 Ref<SCElementKNorm> twonorm_op(new SCElementKNorm(2.0)); 00055 A.element_op(twonorm_op); 00056 const double twonorm = twonorm_op->result(); 00057 00058 os << indent << "Norms of " << label << endl; 00059 os << indent << "------------------------" << endl; 00060 os << indent << "||A||_{\\infty} = " << scprintf("%10.5lf",maxabs) << endl; 00061 os << indent << "||A||_1 = " << scprintf("%10.5lf",onenorm) << endl; 00062 os << indent << "||A||_2 = " << scprintf("%10.5lf",twonorm) << endl << endl; 00063 } 00064 00065 00066 }; 00067 00068 #endif 00069