icedb  version 0.5.1
Snow particle scattering database API
Public Types | Public Member Functions | Public Attributes | Static Public Attributes | List of all members
NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT > Class Template Reference

#include <linterp.h>

Inheritance diagram for NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >:
Inheritance graph
[legend]
Collaboration diagram for NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >:
Collaboration graph
[legend]

Public Types

typedef T value_type
 
typedef ArrayRefCountT array_ref_count_type
 
typedef GridRefCountT grid_ref_count_type
 
typedef boost::numeric::ublas::array_adaptor< T > grid_type
 
typedef boost::const_multi_array_ref< T, N > array_type
 
typedef std::unique_ptr< array_typearray_type_ptr
 

Public Member Functions

template<class IterT1 , class IterT2 , class IterT3 >
 NDInterpolator (IterT1 grids_begin, IterT2 grids_len_begin, IterT3 f_begin, IterT3 f_end)
 
template<class IterT1 , class IterT2 , class IterT3 , class RefCountIterT >
 NDInterpolator (IterT1 grids_begin, IterT2 grids_len_begin, IterT3 f_begin, IterT3 f_end, ArrayRefCountT &refF, RefCountIterT grid_refs_begin)
 
template<class IterT1 , class IterT2 , class IterT3 >
void init (IterT1 grids_begin, IterT2 grids_len_begin, IterT3 f_begin, IterT3 f_end)
 
template<class IterT1 , class IterT2 , class IterT3 , class RefCountIterT >
void init_refcount (IterT1 grids_begin, IterT2 grids_len_begin, IterT3 f_begin, IterT3 f_end, ArrayRefCountT &refF, RefCountIterT grid_refs_begin)
 
template<class IterT1 , class IterT2 >
void set_grids (IterT1 grids_begin, IterT2 grids_len_begin, bool bCopy)
 
template<class IterT1 , class RefCountIterT >
void set_grids_refcount (RefCountIterT refs_begin, RefCountIterT refs_end)
 
template<class IterT >
void set_f_array (IterT f_begin, IterT f_end, bool bCopy)
 
void set_f_refcount (ArrayRefCountT &refF)
 
int find_cell (int dim, T x) const
 
get_f_val (array< int, N > const &cell_index, array< int, N > const &v_index) const
 
get_f_val (array< int, N > const &cell_index, int v) const
 

Public Attributes

array_type_ptr m_pF
 
ArrayRefCountT m_ref_F
 
vector< T > m_F_copy
 
vector< grid_typem_grid_list
 
vector< GridRefCountT > m_grid_ref_list
 
vector< vector< T > > m_grid_copy_list
 

Static Public Attributes

static const int m_N = N
 
static const bool m_bCopyData = CopyData
 
static const bool m_bContinuous = Continuous
 

Detailed Description

template<int N, class T, bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
class NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >

Definition at line 71 of file linterp.h.

Member Typedef Documentation

◆ array_ref_count_type

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
typedef ArrayRefCountT NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::array_ref_count_type

Definition at line 74 of file linterp.h.

◆ array_type

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
typedef boost::const_multi_array_ref<T, N> NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::array_type

Definition at line 82 of file linterp.h.

◆ array_type_ptr

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
typedef std::unique_ptr<array_type> NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::array_type_ptr

Definition at line 83 of file linterp.h.

◆ grid_ref_count_type

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
typedef GridRefCountT NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::grid_ref_count_type

Definition at line 75 of file linterp.h.

◆ grid_type

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
typedef boost::numeric::ublas::array_adaptor<T> NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::grid_type

Definition at line 81 of file linterp.h.

◆ value_type

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
typedef T NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::value_type

Definition at line 73 of file linterp.h.

Constructor & Destructor Documentation

◆ NDInterpolator() [1/2]

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
template<class IterT1 , class IterT2 , class IterT3 >
NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::NDInterpolator ( IterT1  grids_begin,
IterT2  grids_len_begin,
IterT3  f_begin,
IterT3  f_end 
)
inline

Definition at line 96 of file linterp.h.

96  {
97  init(grids_begin, grids_len_begin, f_begin, f_end);
98  }
void init(IterT1 grids_begin, IterT2 grids_len_begin, IterT3 f_begin, IterT3 f_end)
Definition: linterp.h:107

◆ NDInterpolator() [2/2]

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
template<class IterT1 , class IterT2 , class IterT3 , class RefCountIterT >
NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::NDInterpolator ( IterT1  grids_begin,
IterT2  grids_len_begin,
IterT3  f_begin,
IterT3  f_end,
ArrayRefCountT &  refF,
RefCountIterT  grid_refs_begin 
)
inline

Definition at line 102 of file linterp.h.

102  {
103  init_refcount(grids_begin, grids_len_begin, f_begin, f_end, refF, grid_refs_begin);
104  }
void init_refcount(IterT1 grids_begin, IterT2 grids_len_begin, IterT3 f_begin, IterT3 f_end, ArrayRefCountT &refF, RefCountIterT grid_refs_begin)
Definition: linterp.h:112

Member Function Documentation

◆ find_cell()

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
int NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::find_cell ( int  dim,
x 
) const
inline

Definition at line 174 of file linterp.h.

174  {
175  grid_type const &grid(m_grid_list[dim]);
176  if (x < *(grid.begin())) return -1;
177  else if (x >= *(grid.end()-1)) return grid.size()-1;
178  else {
179  auto i_upper = std::upper_bound(grid.begin(), grid.end(), x);
180  return i_upper - grid.begin() - 1;
181  }
182  }
boost::numeric::ublas::array_adaptor< T > grid_type
Definition: linterp.h:81
vector< grid_type > m_grid_list
Definition: linterp.h:89

◆ get_f_val() [1/2]

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
T NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::get_f_val ( array< int, N > const &  cell_index,
array< int, N > const &  v_index 
) const
inline

Definition at line 185 of file linterp.h.

185  {
186  array<int,N> f_index;
187 
188  if (m_bContinuous) {
189  for (int i=0; i<N; i++) {
190  if (cell_index[i] < 0) {
191  f_index[i] = 0;
192  } else if (cell_index[i] >= m_grid_list[i].size()-1) {
193  f_index[i] = m_grid_list[i].size()-1;
194  } else {
195  f_index[i] = cell_index[i] + v_index[i];
196  }
197  }
198  } else {
199  for (int i=0; i<N; i++) {
200  if (cell_index[i] < 0) {
201  f_index[i] = 0;
202  } else if (cell_index[i] >= m_grid_list[i].size()-1) {
203  f_index[i] = (2*m_grid_list[i].size())-1;
204  } else {
205  f_index[i] = 1 + (2*cell_index[i]) + v_index[i];
206  }
207  }
208  }
209  return (*m_pF)(f_index);
210  }
array_type_ptr m_pF
Definition: linterp.h:85
static const bool m_bContinuous
Definition: linterp.h:79
vector< grid_type > m_grid_list
Definition: linterp.h:89

◆ get_f_val() [2/2]

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
T NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::get_f_val ( array< int, N > const &  cell_index,
int  v 
) const
inline

Definition at line 212 of file linterp.h.

212  {
213  array<int,N> v_index;
214  for (int dim=0; dim<N; dim++) {
215  v_index[dim] = (v >> (N-dim-1)) & 1; // test if the i-th bit is set
216  }
217  return get_f_val(cell_index, v_index);
218  }
T get_f_val(array< int, N > const &cell_index, array< int, N > const &v_index) const
Definition: linterp.h:185

◆ init()

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
template<class IterT1 , class IterT2 , class IterT3 >
void NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::init ( IterT1  grids_begin,
IterT2  grids_len_begin,
IterT3  f_begin,
IterT3  f_end 
)
inline

Definition at line 107 of file linterp.h.

107  {
108  set_grids(grids_begin, grids_len_begin, m_bCopyData);
109  set_f_array(f_begin, f_end, m_bCopyData);
110  }
void set_grids(IterT1 grids_begin, IterT2 grids_len_begin, bool bCopy)
Definition: linterp.h:120
void set_f_array(IterT f_begin, IterT f_end, bool bCopy)
Definition: linterp.h:144
static const bool m_bCopyData
Definition: linterp.h:78

◆ init_refcount()

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
template<class IterT1 , class IterT2 , class IterT3 , class RefCountIterT >
void NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::init_refcount ( IterT1  grids_begin,
IterT2  grids_len_begin,
IterT3  f_begin,
IterT3  f_end,
ArrayRefCountT &  refF,
RefCountIterT  grid_refs_begin 
)
inline

Definition at line 112 of file linterp.h.

112  {
113  set_grids(grids_begin, grids_len_begin, m_bCopyData);
114  set_grids_refcount(grid_refs_begin, grid_refs_begin + N);
115  set_f_array(f_begin, f_end, m_bCopyData);
116  set_f_refcount(refF);
117  }
void set_grids_refcount(RefCountIterT refs_begin, RefCountIterT refs_end)
Definition: linterp.h:137
void set_grids(IterT1 grids_begin, IterT2 grids_len_begin, bool bCopy)
Definition: linterp.h:120
void set_f_refcount(ArrayRefCountT &refF)
Definition: linterp.h:168
void set_f_array(IterT f_begin, IterT f_end, bool bCopy)
Definition: linterp.h:144
static const bool m_bCopyData
Definition: linterp.h:78

◆ set_f_array()

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
template<class IterT >
void NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::set_f_array ( IterT  f_begin,
IterT  f_end,
bool  bCopy 
)
inline

Definition at line 144 of file linterp.h.

144  {
145  unsigned int nGridPoints = 1;
146  array<int,N> sizes;
147  for (unsigned int i=0; i<m_grid_list.size(); i++) {
148  sizes[i] = m_grid_list[i].size();
149  nGridPoints *= sizes[i];
150  }
151 
152  int f_len = f_end - f_begin;
153  if ( (m_bContinuous && f_len != nGridPoints) || (!m_bContinuous && f_len != 2 * nGridPoints) ) {
154  throw std::invalid_argument("f has wrong size");
155  }
156  for (unsigned int i=0; i<m_grid_list.size(); i++) {
157  if (!m_bContinuous) { sizes[i] *= 2; }
158  }
159 
160  m_F_copy.clear();
161  if (bCopy == false) {
162  m_pF.reset(new array_type(f_begin, sizes));
163  } else {
164  m_F_copy = vector<T>(f_begin, f_end);
165  m_pF.reset(new array_type(&m_F_copy[0], sizes));
166  }
167  }
boost::const_multi_array_ref< T, N > array_type
Definition: linterp.h:82
array_type_ptr m_pF
Definition: linterp.h:85
static const bool m_bContinuous
Definition: linterp.h:79
vector< T > m_F_copy
Definition: linterp.h:87
vector< grid_type > m_grid_list
Definition: linterp.h:89

◆ set_f_refcount()

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
void NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::set_f_refcount ( ArrayRefCountT &  refF)
inline

Definition at line 168 of file linterp.h.

168  {
169  m_ref_F = refF;
170  }
ArrayRefCountT m_ref_F
Definition: linterp.h:86

◆ set_grids()

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
template<class IterT1 , class IterT2 >
void NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::set_grids ( IterT1  grids_begin,
IterT2  grids_len_begin,
bool  bCopy 
)
inline

Definition at line 120 of file linterp.h.

120  {
121  m_grid_list.clear();
122  m_grid_ref_list.clear();
123  m_grid_copy_list.clear();
124  for (int i=0; i<N; i++) {
125  int gridLength = grids_len_begin[i];
126  if (bCopy == false) {
127  T const *grid_ptr = &(*grids_begin[i]);
128  m_grid_list.push_back(grid_type(gridLength, (T*) grid_ptr )); // use the given pointer
129  } else {
130  m_grid_copy_list.push_back( vector<T>(grids_begin[i], grids_begin[i] + grids_len_begin[i]) ); // make our own copy of the grid
131  T *begin = &(m_grid_copy_list[i][0]);
132  m_grid_list.push_back(grid_type(gridLength, begin)); // use our copy
133  }
134  }
135  }
boost::numeric::ublas::array_adaptor< T > grid_type
Definition: linterp.h:81
vector< GridRefCountT > m_grid_ref_list
Definition: linterp.h:90
vector< grid_type > m_grid_list
Definition: linterp.h:89
vector< vector< T > > m_grid_copy_list
Definition: linterp.h:91

◆ set_grids_refcount()

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
template<class IterT1 , class RefCountIterT >
void NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::set_grids_refcount ( RefCountIterT  refs_begin,
RefCountIterT  refs_end 
)
inline

Definition at line 137 of file linterp.h.

137  {
138  assert(refs_end - refs_begin == N);
139  m_grid_ref_list.assign(refs_begin, refs_begin + N);
140  }
vector< GridRefCountT > m_grid_ref_list
Definition: linterp.h:90

Member Data Documentation

◆ m_bContinuous

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
const bool NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::m_bContinuous = Continuous
static

Definition at line 79 of file linterp.h.

◆ m_bCopyData

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
const bool NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::m_bCopyData = CopyData
static

Definition at line 78 of file linterp.h.

◆ m_F_copy

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
vector<T> NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::m_F_copy

Definition at line 87 of file linterp.h.

◆ m_grid_copy_list

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
vector<vector<T> > NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::m_grid_copy_list

Definition at line 91 of file linterp.h.

◆ m_grid_list

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
vector<grid_type> NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::m_grid_list

Definition at line 89 of file linterp.h.

◆ m_grid_ref_list

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
vector<GridRefCountT> NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::m_grid_ref_list

Definition at line 90 of file linterp.h.

◆ m_N

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
const int NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::m_N = N
static

Definition at line 77 of file linterp.h.

◆ m_pF

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
array_type_ptr NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::m_pF

Definition at line 85 of file linterp.h.

◆ m_ref_F

template<int N, class T , bool CopyData = true, bool Continuous = true, class ArrayRefCountT = EmptyClass, class GridRefCountT = EmptyClass>
ArrayRefCountT NDInterpolator< N, T, CopyData, Continuous, ArrayRefCountT, GridRefCountT >::m_ref_F

Definition at line 86 of file linterp.h.


The documentation for this class was generated from the following file: