PISM, A Parallel Ice Sheet Model  stable v2.1.1 committed by Constantine Khrulev on 2024-12-04 13:36:58 -0900
Array_helpers.hh
Go to the documentation of this file.
1 // Copyright (C) 2011, 2013, 2014, 2016, 2017, 2020, 2021, 2022, 2023 PISM Authors
2 //
3 // This file is part of PISM.
4 //
5 // PISM is free software; you can redistribute it and/or modify it under the
6 // terms of the GNU General Public License as published by the Free Software
7 // Foundation; either version 3 of the License, or (at your option) any later
8 // version.
9 //
10 // PISM is distributed in the hope that it will be useful, but WITHOUT ANY
11 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 // FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13 // details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with PISM; if not, write to the Free Software
17 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 
19 #ifndef PISM_ARRAY_HELPERS_H
20 #define PISM_ARRAY_HELPERS_H
21 
22 #include "pism/util/Grid.hh"
23 
24 namespace pism {
25 
26 namespace array {
27 
28 namespace details {
29 
30 //! \brief Computes result = x + alpha * y, where x, y, and z are 2D
31 //! Arrays (scalar or vector).
32 /*!
33  */
34 template <class V>
35 void add(const V &x, double alpha, const V &y, V &result, bool scatter = true) {
36 
37  array::AccessScope list{ &x, &y, &result };
38  for (auto p = result.grid()->points(); p; p.next()) {
39  const int i = p.i(), j = p.j();
40 
41  result(i, j) = x(i, j) + y(i, j) * alpha;
42  }
43 
44  if (scatter) {
45  result.update_ghosts();
46  }
47 
48  result.inc_state_counter();
49 }
50 
51 template <class V>
52 void copy(const V &input, V &result, bool scatter = true) {
53 
54  array::AccessScope list{ &input, &result };
55 
56  for (auto p = result.grid()->points(); p; p.next()) {
57  const int i = p.i(), j = p.j();
58 
59  result(i, j) = input(i, j);
60  }
61 
62  if (scatter) {
63  result.update_ghosts();
64  }
65 
66  result.inc_state_counter();
67 }
68 
69 } // namespace details
70 
71 } // namespace array
72 
73 } // end of namespace pism
74 
75 #endif /* PISM_ARRAY_HELPERS_H */
Makes sure that we call begin_access() and end_access() for all accessed array::Arrays.
Definition: Array.hh:65
void add(const V &x, double alpha, const V &y, V &result, bool scatter=true)
Computes result = x + alpha * y, where x, y, and z are 2D Arrays (scalar or vector).
void copy(const V &input, V &result, bool scatter=true)