1 2 // This program is free software; you can redistribute it and/or 3 // modify it under the terms of the GNU General Public License 4 // as published by the Free Software Foundation; either version 2 5 // of the License, or (at your option) any later version. 6 // 7 // This program is distributed in the hope that it will be useful, 8 // but WITHOUT ANY WARRANTY; without even the implied warranty of 9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 // GNU General Public License for more details. 11 // You should have received a copy of the GNU General Public License 12 // along with this program; if not, write to the Free Software 13 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 14 // 15 #ifndef ACTION_GER 16 #define ACTION_GER 17 #include "utilities.h" 18 #include "STL_interface.hh" 19 #include <string> 20 #include "init/init_function.hh" 21 #include "init/init_vector.hh" 22 #include "init/init_matrix.hh" 23 24 using namespace std; 25 26 template<class Interface> 27 class Action_ger { 28 29 public : 30 31 // Ctor Action_ger(int size)32 BTL_DONT_INLINE Action_ger( int size ):_size(size) 33 { 34 MESSAGE("Action_ger Ctor"); 35 36 // STL matrix and vector initialization 37 typename Interface::stl_matrix tmp; 38 init_matrix<pseudo_random>(A_stl,_size); 39 init_vector<pseudo_random>(B_stl,_size); 40 init_vector<pseudo_random>(X_stl,_size); 41 init_vector<null_function>(resu_stl,_size); 42 43 // generic matrix and vector initialization 44 Interface::matrix_from_stl(A_ref,A_stl); 45 Interface::matrix_from_stl(A,A_stl); 46 Interface::vector_from_stl(B_ref,B_stl); 47 Interface::vector_from_stl(B,B_stl); 48 Interface::vector_from_stl(X_ref,X_stl); 49 Interface::vector_from_stl(X,X_stl); 50 } 51 52 // invalidate copy ctor Action_ger(const Action_ger &)53 Action_ger( const Action_ger & ) 54 { 55 INFOS("illegal call to Action_ger Copy Ctor"); 56 exit(1); 57 } 58 59 // Dtor ~Action_ger(void)60 BTL_DONT_INLINE ~Action_ger( void ){ 61 MESSAGE("Action_ger Dtor"); 62 Interface::free_matrix(A,_size); 63 Interface::free_vector(B); 64 Interface::free_vector(X); 65 Interface::free_matrix(A_ref,_size); 66 Interface::free_vector(B_ref); 67 Interface::free_vector(X_ref); 68 69 } 70 71 // action name name(void)72 static inline std::string name( void ) 73 { 74 return "ger_" + Interface::name(); 75 } 76 nb_op_base(void)77 double nb_op_base( void ){ 78 return 2.0*_size*_size; 79 } 80 initialize(void)81 BTL_DONT_INLINE void initialize( void ){ 82 Interface::copy_matrix(A_ref,A,_size); 83 Interface::copy_vector(B_ref,B,_size); 84 Interface::copy_vector(X_ref,X,_size); 85 } 86 calculate(void)87 BTL_DONT_INLINE void calculate( void ) { 88 BTL_ASM_COMMENT("#begin ger"); 89 Interface::ger(A,B,X,_size); 90 BTL_ASM_COMMENT("end ger"); 91 } 92 check_result(void)93 BTL_DONT_INLINE void check_result( void ){ 94 // calculation check 95 Interface::vector_to_stl(X,resu_stl); 96 97 STL_interface<typename Interface::real_type>::ger(A_stl,B_stl,X_stl,_size); 98 99 typename Interface::real_type error= 100 STL_interface<typename Interface::real_type>::norm_diff(X_stl,resu_stl); 101 102 if (error>1.e-3){ 103 INFOS("WRONG CALCULATION...residual=" << error); 104 // exit(0); 105 } 106 107 } 108 109 private : 110 111 typename Interface::stl_matrix A_stl; 112 typename Interface::stl_vector B_stl; 113 typename Interface::stl_vector X_stl; 114 typename Interface::stl_vector resu_stl; 115 116 typename Interface::gene_matrix A_ref; 117 typename Interface::gene_vector B_ref; 118 typename Interface::gene_vector X_ref; 119 120 typename Interface::gene_matrix A; 121 typename Interface::gene_vector B; 122 typename Interface::gene_vector X; 123 124 int _size; 125 }; 126 127 128 #endif 129