19#include "pism/inverse/functional/IPMeanSquareFunctional.hh"
20#include "pism/util/Grid.hh"
21#include "pism/util/array/Vector.hh"
22#include "pism/util/array/Scalar.hh"
23#include "pism/util/pism_utilities.hh"
42 for (
auto p :
m_grid->points()) {
43 const int i = p.i(), j = p.j();
45 value += (*m_weights)(i, j);
48 for (
auto p :
m_grid->points()) {
67 for (
auto p :
m_grid->points()) {
68 const int i = p.i(), j = p.j();
74 for (
auto p :
m_grid->points()) {
75 const int i = p.i(), j = p.j();
78 value += (x_ij.
u*x_ij.
u + x_ij.
v*x_ij.
v);
95 for (
auto p :
m_grid->points()) {
96 const int i = p.i(), j = p.j();
103 for (
auto p :
m_grid->points()) {
104 const int i = p.i(), j = p.j();
108 value += (a_ij.
u*b_ij.
u + a_ij.
v*b_ij.
v);
123 for (
auto p :
m_grid->points()) {
124 const int i = p.i(), j = p.j();
130 for (
auto p :
m_grid->points()) {
131 const int i = p.i(), j = p.j();
152 for (
auto p :
m_grid->points()) {
153 const int i = p.i(), j = p.j();
155 value += (*m_weights)(i, j);
158 for (
auto p :
m_grid->points()) {
177 for (
auto p :
m_grid->points()) {
178 const int i = p.i(), j = p.j();
180 double &x_ij = x(i, j);
181 value += x_ij*x_ij*(*m_weights)(i, j);
184 for (
auto p :
m_grid->points()) {
185 const int i = p.i(), j = p.j();
187 double &x_ij = x(i, j);
205 for (
auto p :
m_grid->points()) {
206 const int i = p.i(), j = p.j();
208 value += (a(i, j)*b(i, j))*(*
m_weights)(i, j);
211 for (
auto p :
m_grid->points()) {
212 const int i = p.i(), j = p.j();
214 value += (a(i, j)*b(i, j));
230 for (
auto p :
m_grid->points()) {
231 const int i = p.i(), j = p.j();
236 for (
auto p :
m_grid->points()) {
237 const int i = p.i(), j = p.j();
This class represents a 2D vector field (such as ice velocity) at a certain grid point.
void add(const PetscAccessible &v)
Makes sure that we call begin_access() and end_access() for all accessed array::Arrays.
void add(double alpha, const Array2D< T > &x)
void set(double c)
Result: v[j] <- c for all j.
std::shared_ptr< const Grid > m_grid
virtual void normalize(double scale)
Implicitly set the normalization constant for the functional.
virtual void dot(array::Scalar &a, array::Scalar &b, double *OUTPUT)
Computes the inner product .
array::Scalar * m_weights
virtual void valueAt(array::Scalar &x, double *OUTPUT)
virtual void gradientAt(array::Scalar &x, array::Scalar &gradient)
virtual void gradientAt(array::Vector &x, array::Vector &gradient)
virtual void dot(array::Vector &a, array::Vector &b, double *OUTPUT)
Computes the inner product .
virtual void valueAt(array::Vector &x, double *OUTPUT)
virtual void normalize(double scale)
Implicitly set the normalization constant for the functional.
array::Scalar * m_weights
void GlobalSum(MPI_Comm comm, double *local, double *result, int count)