Page MenuHomec4science

grid.cpp
No OneTemporary

File Metadata

Created
Sun, Jul 7, 23:08

grid.cpp

/**
*
* @author Lucas Frérot <lucas.frerot@epfl.ch>
*
* @section LICENSE
*
* Copyright (©) 2016 EPFL (Ecole Polytechnique Fédérale de
* Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des
* Solides)
*
* Tamaas is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any
* later version.
*
* Tamaas is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Tamaas. If not, see <http://www.gnu.org/licenses/>.
*
*/
/* -------------------------------------------------------------------------- */
#include "tamaas.hh"
#include "grid.hh"
#include <cstring>
#include <complex>
#include <algorithm>
/* -------------------------------------------------------------------------- */
__BEGIN_TAMAAS__
/* -------------------------------------------------------------------------- */
template <typename T, UInt dim>
Grid<T, dim>::Grid():
GridBase<T>() {
std::fill(this->n.begin(), this->n.end(), 0);
std::fill(this->L.begin(), this->L.end(), 0);
this->nb_components = 1;
}
/* -------------------------------------------------------------------------- */
template <typename T, UInt dim>
Grid<T, dim>::Grid(const std::array<UInt, dim> & n,
const std::array<Real, dim> & L,
UInt nb_components):
GridBase<T>() {
this->init(n, L, nb_components);
}
template <typename T, UInt dim>
Grid<T, dim>::Grid(const std::vector<UInt> & n,
const std::vector<Real> & L,
UInt nb_components):
GridBase<T>() {
if (n.size() != dim || L.size() != dim)
TAMAAS_EXCEPTION("Provided sizes for grid do not match dimension");
this->init(n, L, nb_components);
}
/* -------------------------------------------------------------------------- */
template <typename T, UInt dim>
Grid<T, dim>::~Grid() {}
/* -------------------------------------------------------------------------- */
template <typename T, UInt dim>
void Grid<T, dim>::resize(const std::array<UInt, dim> & n) {
std::copy(n.begin(), n.end(), this->n.begin());
UInt size = this->computeSize();
this->data.resize(size);
this->data.assign(size, T(0.));
}
/* -------------------------------------------------------------------------- */
template <typename T, UInt dim>
void Grid<T, dim>::uniformSetComponents(const Grid<T, 1> &vec) {
TAMAAS_ASSERT(vec.dataSize() == this->nb_components,
"Cannot set grid field with values of vector");
#pragma omp parallel for
for (UInt i = 0 ; i < dataSize() ; i++) {
this->data[i] = vec(i % this->nb_components);
}
}
/* -------------------------------------------------------------------------- */
template <typename T, UInt dim>
void Grid<T, dim>::printself(std::ostream & str) const {
str << "Grid(" << dim << ", " << this->nb_components << ") {";
for (UInt i = 0 ; i < this->data.size() - 1 ; i++) {
str << this->data[i] << ", ";
}
str << this->data[this->data.size()-1] << "}";
}
/* -------------------------------------------------------------------------- */
#define GRID_SCALAR_OPERATOR_IMPL(op) \
template <typename T, UInt dim> \
inline void Grid<T, dim>::operator op(const T & e) { \
_Pragma("omp parallel for") \
for (UInt i = 0 ; i < this->data.size() ; i++) { \
this->data[i] op e; \
} \
} \
GRID_SCALAR_OPERATOR_IMPL(+=);
GRID_SCALAR_OPERATOR_IMPL(*=);
GRID_SCALAR_OPERATOR_IMPL(-=);
GRID_SCALAR_OPERATOR_IMPL(/=);
GRID_SCALAR_OPERATOR_IMPL(=);
#undef GRID_SCALAR_OPERATOR_IMPL
/* -------------------------------------------------------------------------- */
/// Class instanciation
#define GRID_INSTANCIATE_TYPE(type) template class Grid<type, 1>; \
template class Grid<type, 2>; \
template class Grid<type, 3>
GRID_INSTANCIATE_TYPE(Real);
GRID_INSTANCIATE_TYPE(UInt);
GRID_INSTANCIATE_TYPE(Complex);
GRID_INSTANCIATE_TYPE(int);
GRID_INSTANCIATE_TYPE(bool);
GRID_INSTANCIATE_TYPE(unsigned long);
#undef GRID_INSTANCIATE_TYPE
__END_TAMAAS__

Event Timeline