TiledArray  0.7.0
utils.h
Go to the documentation of this file.
1 /*
2  * This file is a part of TiledArray.
3  * Copyright (C) 2013 Virginia Tech
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * Eduard Valeyev
19  * Department of Chemistry, Virginia Tech
20  *
21  * utils.h
22  * May 20, 2013
23  *
24  */
25 
26 #ifndef TILEDARRAY_ALGEBRA_UTILS_H__INCLUDED
27 #define TILEDARRAY_ALGEBRA_UTILS_H__INCLUDED
28 
29 #include <sstream>
30 
31 #include "../dist_array.h"
32 #include "../expressions/expr.h"
33 
34 namespace TiledArray {
35 
36  namespace detail {
37 
38  inline std::string dummy_annotation(unsigned int DIM) {
39  std::ostringstream oss;
40  if (DIM > 0) oss << "i0";
41  for(unsigned int d=1; d<DIM; ++d)
42  oss << ",i" << d;
43  return oss.str();
44  }
45 
46  } // namespace detail
47 
48  template <typename Tile, typename Policy>
49  inline size_t size(const DistArray<Tile, Policy>& a) {
50  // this is the number of tiles
51  if (a.size() > 0) // assuming dense shape
52  return a.trange().elements_range().volume();
53  else
54  return 0;
55  }
56 
57  template <typename Tile, typename Policy>
59  return a;
60  }
61 
62  template <typename Tile, typename Policy>
63  inline void zero(DistArray<Tile,Policy>& a) {
64  const std::string vars = detail::dummy_annotation(a.trange().tiles_range().rank());
65  a(vars) = typename DistArray<Tile,Policy>::element_type(0) * a(vars);
66  }
67 
68  template <typename Tile, typename Policy>
71  return a(detail::dummy_annotation(a.trange().tiles_range().rank())).abs_min();
72  }
73 
74  template <typename Tile, typename Policy>
77  return a(detail::dummy_annotation(a.trange().tiles_range().rank())).abs_max();
78  }
79 
80  template <typename Tile, typename Policy>
82  const DistArray<Tile,Policy>& a2) {
83  const std::string vars = detail::dummy_annotation(a1.trange().tiles_range().rank());
84  a1(vars) = a1(vars) * a2(vars);
85  }
86 
87  template <typename Tile, typename Policy>
90  const std::string vars = detail::dummy_annotation(a1.trange().tiles_range().rank());
91  return a1(vars).dot(a2(vars)).get();
92  }
93 
94  template <typename Left, typename Right>
99  "no_alias() expressions are not allowed on the right-hand side of the "
100  "assignment operator.");
102  "no_alias() expressions are not allowed on the right-hand side of the "
103  "assignment operator.");
104  return a1.dot(a2).get();
105  }
106 
107  template <typename Tile, typename Policy>
109  typename DistArray<Tile,Policy>::element_type scaling_factor) {
110  const std::string vars = detail::dummy_annotation(a.trange().tiles_range().rank());
111  a(vars) = scaling_factor * a(vars);
112  }
113 
114  template <typename Tile, typename Policy>
115  inline void axpy(DistArray<Tile,Policy>& y,
117  const DistArray<Tile,Policy>& x) {
118  const std::string vars = detail::dummy_annotation(y.trange().tiles_range().rank());
119  y(vars) = y(vars) + a * x(vars);
120  }
121 
122  template <typename Tile, typename Policy>
124  const DistArray<Tile,Policy>& m2) {
125  m1 = m2;
126  }
127 
128  template <typename Tile, typename Policy>
131  return std::sqrt(a(detail::dummy_annotation(a.trange().tiles_range().rank())).squared_norm());
132  }
133 
134  template <typename Tile, typename Policy>
135  inline void print(const DistArray<Tile,Policy>& a, const char* label) {
136  std::cout << label << ":\n" << a << "\n";
137  }
138 
139 } // namespace TiledArray
140 
141 #endif // TILEDARRAY_ALGEBRA_UTILS_H__INCLUDED
DistArray< Tile, Policy >::scalar_type norm2(const DistArray< Tile, Policy > &a)
Definition: utils.h:130
void scale(DistArray< Tile, Policy > &a, typename DistArray< Tile, Policy >::element_type scaling_factor)
Definition: utils.h:108
const trange_type & trange() const
Tiled range accessor.
Definition: dist_array.h:547
DistArray< Tile, Policy >::element_type maxabs_value(const DistArray< Tile, Policy > &a)
Definition: utils.h:76
size_t size(const DistArray< Tile, Policy > &a)
Definition: utils.h:49
Forward declarations.
Definition: clone.h:32
detail::scalar_type< Tile >::type scalar_type
The tile scalar type.
Definition: dist_array.h:58
TiledArray::expressions::ExprTrait< Left >::scalar_type dot(const TiledArray::expressions::Expr< Left > &a1, const TiledArray::expressions::Expr< Right > &a2)
Definition: utils.h:96
void axpy(DistArray< Tile, Policy > &y, typename DistArray< Tile, Policy >::element_type a, const DistArray< Tile, Policy > &x)
Definition: utils.h:115
void vec_multiply(DistArray< Tile, Policy > &a1, const DistArray< Tile, Policy > &a2)
Definition: utils.h:81
void print(const DistArray< Tile, Policy > &a, const char *label)
Definition: utils.h:135
Base class for expression evaluation.
Definition: expr.h:81
DistArray< Tile, Policy > copy(const DistArray< Tile, Policy > &a)
Definition: utils.h:58
void zero(DistArray< Tile, Policy > &a)
Definition: utils.h:63
Future< typename TiledArray::DotReduction< typename EngineTrait< engine_type >::eval_type, typename EngineTrait< typename D::engine_type >::eval_type >::result_type > dot(const Expr< D > &right_expr, World &world) const
Definition: expr.h:743
DistArray< Tile, Policy >::element_type minabs_value(const DistArray< Tile, Policy > &a)
Definition: utils.h:70
detail::numeric_type< Tile >::type element_type
The tile element type.
Definition: dist_array.h:57
std::string dummy_annotation(unsigned int DIM)
Definition: utils.h:38
size_type size() const
Definition: dist_array.h:573
DistArray< Tile, Policy >::element_type dot_product(const DistArray< Tile, Policy > &a1, const DistArray< Tile, Policy > &a2)
Definition: utils.h:89
void assign(DistArray< Tile, Policy > &m1, const DistArray< Tile, Policy > &m2)
Definition: utils.h:123