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