/** * @file bspline.hpp * @author Julian Iseringhausen * @date Mon Nov 21 13:27:22 2011 * * @brief B-Splines for molecular dynamics. * */ #ifndef BSPLINE_HPP_ #define BSPLINE_HPP_ #include "base/helper.hpp" #include "base/index.hpp" #include "base/particle.hpp" #include "base/polynomial.hpp" #include "base/vector.hpp" #include "grid/grid.hpp" namespace VMG { class BSpline { public: BSpline(const vmg_float& width); vmg_float EvaluateSpline(const vmg_float& val) { for (unsigned int i=0; i= grid.Extent().Begin().X() && p.Pos().X() < grid.Extent().End().X()); assert(p.Pos().Y() >= grid.Extent().Begin().Y() && p.Pos().Y() < grid.Extent().End().Y()); assert(p.Pos().Z() >= grid.Extent().Begin().Z() && p.Pos().Z() < grid.Extent().End().Z()); Index i, index_global, index_local; vmg_float temp_val, length; std::vector vals; std::vector::const_iterator iter; vmg_float int_val = 0.0; index_global = static_cast((p.Pos() - grid.Extent().Begin()) / grid.Extent().MeshWidth()); assert(index_global.X() >= grid.Global().LocalBegin().X() && index_global.X() < grid.Global().LocalEnd().X()); assert(index_global.Y() >= grid.Global().LocalBegin().Y() && index_global.Y() < grid.Global().LocalEnd().Y()); assert(index_global.Z() >= grid.Global().LocalBegin().Z() && index_global.Z() < grid.Global().LocalEnd().Z()); index_local = index_global - grid.Global().LocalBegin() + grid.Local().Begin(); assert(index_local.X() >= grid.Local().Begin().X() && index_local.X() < grid.Local().End().X()); assert(index_local.Y() >= grid.Local().Begin().Y() && index_local.Y() < grid.Local().End().Y()); assert(index_local.Z() >= grid.Local().Begin().Z() && index_local.Z() < grid.Local().End().Z()); // Iterate over all grid points which lie in the support of the interpolating B-Spline for (i.X()=-1*near_field_cells; i.X()<=near_field_cells; ++i.X()) for (i.Y()=-1*near_field_cells; i.Y()<=near_field_cells; ++i.Y()) for (i.Z()=-1*near_field_cells; i.Z()<=near_field_cells; ++i.Z()) { // Compute distance from grid point to particle length = ( p.Pos() - grid.Extent().Begin() - grid.Extent().MeshWidth() * (index_global+i) ).Length(); temp_val = EvaluateSpline(length); vals.push_back(temp_val * p.Charge()); int_val += temp_val; } // Reciprocal value of the numerically integrated spline int_val = 1.0 / (int_val * grid.Extent().MeshWidth().Product()); iter = vals.begin(); for (i.X()=-1*near_field_cells; i.X()<=near_field_cells; ++i.X()) for (i.Y()=-1*near_field_cells; i.Y()<=near_field_cells; ++i.Y()) for (i.Z()=-1*near_field_cells; i.Z()<=near_field_cells; ++i.Z()) grid(index_local+i) += *iter++ * int_val; assert(iter == vals.end()); } vmg_float EvaluatePotential(const vmg_float& val) { for (unsigned int i=0; i spline_nom, spline_denom; std::vector potential_nom, potential_denom; vmg_float antid; std::vector intervals; vmg_float R; }; } #endif /* BSPLINE_HPP_ */