Changeset 1a92cf


Ignore:
Timestamp:
Apr 29, 2012, 10:50:41 AM (14 years ago)
Author:
Julian Iseringhausen <isering@…>
Children:
39a6d9
Parents:
4571da
Message:

vmg: Prepared force calculation.

git-svn-id: https://svn.version.fz-juelich.de/scafacos/trunk@1765 5161e1c8-67bf-11de-9fd5-51895aff932f

Location:
src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • src/base/interpolate_polynomial.cpp

    r4571da r1a92cf  
    1414
    1515InterpolatePolynomial::InterpolatePolynomial(const unsigned int& degree) :
     16  deg(degree),
    1617  deg_1(degree+1),
    17   pos_begin(0.0)
     18  buffer(degree+1),
     19  buffer_diff(degree)
    1820{
    1921  coeff = new vmg_float[Helper::intpow(deg_1, 3)];
     22  coeff_buffer = new vmg_float[deg_1];
     23  for (int i=0; i<degree; ++i)
     24    buffer_diff[i].resize(i+1);
    2025}
    2126
     
    2328{
    2429  delete [] coeff;
     30  delete [] coeff_buffer;
    2531}
    2632
     
    5965void InterpolatePolynomial::_compute_coefficients_1d(const Index& index, const unsigned int& direction)
    6066{
    61   vmg_float temp_array[deg_1];
    6267  vmg_float power = 1.0;
    6368  unsigned long faculty = 1;
     
    6671
    6772  for (i=index, c=0; c<deg_1; ++i[direction], ++c)
    68     temp_array[c] = _access_coeff(i);
     73    coeff_buffer[c] = _access_coeff(i);
    6974
    7075  i=index;
     
    7277  for (c=1; c<deg_1; ++i[direction], ++c) {
    7378    for (unsigned int j=0; j<deg_1-c; ++j)
    74       temp_array[j] = temp_array[j+1] - temp_array[j];
     79      coeff_buffer[j] = coeff_buffer[j+1] - coeff_buffer[j];
    7580    faculty *= c;
    7681    power *= h[direction];
    77     _access_coeff(i) = temp_array[0] / (faculty*power);
     82    _access_coeff(i) = coeff_buffer[0] / (faculty*power);
    7883  }
    7984}
     
    8691
    8792  prod[0] = 1.0;
    88   offset[0] = pos_begin[0];
     93  offset[0] = pos[0] - pos_begin[0];
    8994  for (i[0]=0; i[0]<deg_1; ++i[0]) {
    9095    prod[1] = prod[0];
    91     offset[1] = pos_begin[1];
     96    offset[1] = pos[1] - pos_begin[1];
    9297    for (i[1]=0; i[1]<deg_1; ++i[1]) {
    9398      prod[2] = prod[1];
    94       offset[2] = pos_begin[2];
     99      offset[2] = pos[2] - pos_begin[2];
    95100      for (i[2]=0; i[2]<deg_1; ++i[2]) {
    96101        result += _access_coeff(i) * prod[2];
    97         prod[2] *= pos[2] - offset[2];
    98         offset[2] += h[2];
     102        prod[2] *= offset[2];
     103        offset[2] -= h[2];
    99104      }
    100       prod[1] *= pos[1] - offset[1];
    101       offset[1] += h[1];
     105      prod[1] *= offset[1];
     106      offset[1] -= h[1];
    102107    }
    103     prod[0] *= pos[0] - offset[0];
    104     offset[0] += h[0];
     108    prod[0] *= offset[0];
     109    offset[0] -= h[0];
    105110  }
    106111
     
    108113}
    109114
    110 Vector InterpolatePolynomial::EvaluateGradient(const Vector& pos)
     115void InterpolatePolynomial::Evaluate(const Vector& pos, vmg_float& pot, Vector& field)
    111116{
    112   Vector buffer[deg_1];
    113   std::vector<Vector> buffer_diff[deg_1-1];
     117 Vector offset;
     118
     119 pot = 0.0;
     120 field = 0.0;
     121
     122  buffer[0] = 1.0;
     123  offset = pos - pos_begin;
     124  for (int i=1; i<deg_1; ++i) {
     125    buffer[i] = buffer[i-1] * offset;
     126    offset -= h;
     127  }
     128
     129  offset = pos - pos_begin;
     130  for (int i=0; i<deg; ++i) {
     131    for (int j=0; j<i; ++j)
     132      buffer_diff[i][j] = buffer_diff[i-1][j] * offset;
     133    buffer_diff[i][i] = buffer[i];
     134    offset -= h;
     135  }
     136
     137  for (int i=1; i<deg; ++i)
     138    for (int j=1; j<=i; ++j)
     139      buffer_diff[i][0] += buffer_diff[i][j];
     140
     141  for (int i=0; i<deg_1; ++i)
     142    for (int j=0; j<deg_1; ++j)
     143      for (int k=0; k<deg_1; ++k)
     144        pot += _access_coeff(i,j,k) * buffer[i][0] * buffer[j][1] * buffer[k][2];
     145
     146  for (int i=0; i<deg_1; ++i)
     147    for (int j=0; j<deg_1; ++j)
     148      for (int k=0; k<deg; ++k) {
     149        field[0] -= _access_coeff(k+1, i, j) * buffer[i][1] * buffer[j][2] * buffer_diff[k][0][0];
     150        field[1] -= _access_coeff(i, k+1, j) * buffer[i][0] * buffer[j][2] * buffer_diff[k][0][1];
     151        field[2] -= _access_coeff(i, j, k+1) * buffer[i][0] * buffer[j][1] * buffer_diff[k][0][2];
     152      }
     153
     154}
     155
     156Vector InterpolatePolynomial::EvaluateNegGradient(const Vector& pos)
     157{
    114158  Vector offset, result;
    115159
     
    118162  for (int i=1; i<deg_1; ++i) {
    119163    buffer[i] = buffer[i-1] * offset;
    120     offset += h;
     164    offset -= h;
    121165  }
    122166
    123167  offset = pos - pos_begin;
    124   for (int i=0; i<deg_1-1; ++i) {
    125     buffer_diff[i].resize(i+1);
    126     offset += h;
     168  for (int i=0; i<deg; ++i) {
    127169    for (int j=0; j<i; ++j)
    128170      buffer_diff[i][j] = buffer_diff[i-1][j] * offset;
    129     buffer_diff[i][i] = buffer[i+1];
     171    buffer_diff[i][i] = buffer[i];
     172    offset -= h;
    130173  }
     174
     175  for (int i=1; i<deg; ++i)
     176    for (int j=1; j<=i; ++j)
     177      buffer_diff[i][0] += buffer_diff[i][j];
    131178
    132179  for (int i=0; i<deg_1; ++i)
    133180    for (int j=0; j<deg_1; ++j)
    134       for (int k=0; k<deg_1-1; ++k) {
    135         Vector sum;
    136         for (int l=0; l<=k; ++l)
    137           sum += buffer_diff[k][l];
    138         result[0] += _access_coeff(k+1, i, j) * buffer[i][1] * buffer[j][2] * sum[0];
    139         result[1] += _access_coeff(i, k+1, j) * buffer[i][0] * buffer[j][2] * sum[1];
    140         result[2] += _access_coeff(i, j, k+1) * buffer[i][0] * buffer[j][1] * sum[2];
     181      for (int k=0; k<deg; ++k) {
     182        result[0] -= _access_coeff(k+1, i, j) * buffer[i][1] * buffer[j][2] * buffer_diff[k][0][0];
     183        result[1] -= _access_coeff(i, k+1, j) * buffer[i][0] * buffer[j][2] * buffer_diff[k][0][1];
     184        result[2] -= _access_coeff(i, j, k+1) * buffer[i][0] * buffer[j][1] * buffer_diff[k][0][2];
    141185      }
    142186
  • src/base/interpolate_polynomial.hpp

    r4571da r1a92cf  
    22#define INTERPOLATE_POLYNOMIAL_HPP_
    33
    4 #include <base/vector.hpp>
     4#include <vector>
     5
     6#include "base/index.hpp"
     7#include "base/vector.hpp"
    58
    69namespace VMG
     
    811
    912class Grid;
    10 class Index;
    1113
    1214class InterpolatePolynomial
     
    1921
    2022  vmg_float Evaluate(const Vector& pos);
    21   Vector EvaluateGradient(const Vector& pos);
     23  void Evaluate(const Vector& pos, vmg_float& pot, Vector& field);
     24  Vector EvaluateNegGradient(const Vector& pos);
    2225
    2326private:
     
    3538
    3639  vmg_float* coeff;
    37   unsigned int deg_1;
     40  vmg_float* coeff_buffer;
     41  unsigned int deg, deg_1;
    3842  Vector pos_begin;
    3943  Vector h;
     44  std::vector<Vector> buffer;
     45  std::vector< std::vector<Vector> > buffer_diff;
    4046};
    4147
  • src/interface/interface_particles.cpp

    r4571da r1a92cf  
    101101{
    102102  Index i;
    103   vmg_float length;
    104103
    105104#ifdef DEBUG_OUTPUT
     
    161160    for (p1=lc_1.begin(); p1!=lc_1.end(); ++p1) {
    162161
    163       (*p1)->Pot() = ip.Evaluate((*p1)->Pos()) - (*p1)->Charge() * spl.GetAntiDerivativeAtZero();
     162      ip.Evaluate((*p1)->Pos(), (*p1)->Pot(), (*p1)->Field());
     163      (*p1)->Pot() -= (*p1)->Charge() * spl.GetAntiDerivativeAtZero();
    164164
    165165#ifdef DEBUG_OUTPUT
     
    177177              if (*p1 != *p2) {
    178178
    179                 length = ((*p2)->Pos() - (*p1)->Pos()).Length();
     179                const Vector dir = (*p1)->Pos() - (*p2)->Pos();
     180                const vmg_float length = dir.Length();
    180181
    181182                if (length < r_cut) {
     183
    182184                  (*p1)->Pot() += (*p2)->Charge() / length * (1.0 + spl.EvaluatePotential(length));
     185                  (*p1)->Field() += (*p2)->Charge() * dir * spl.EvaluateField(length);
    183186
    184187#ifdef DEBUG_OUTPUT
  • src/samples/bspline.cpp

    r4571da r1a92cf  
    3333  potential_nom((BSPLINE_DEGREE+1)/2+1),
    3434  potential_denom((BSPLINE_DEGREE+1)/2+1),
     35  field_nom((BSPLINE_DEGREE+1)/2),
     36  field_denom((BSPLINE_DEGREE+1)/2),
    3537  intervals((BSPLINE_DEGREE+1)/2),
    3638  R(width)
     
    6870  potential_denom[1] = Polynomial(0, 160.0*POW(R,5));
    6971  potential_denom[2] = Polynomial(0, 1.0);
     72
     73  field_nom[0] = Polynomial(5,
     74                            20.0 * POW(R,5),
     75                            0.0,
     76                            0.0,
     77                            -135.0 * POW(R,2),
     78                            0.0,
     79                            243.0);
     80
     81  field_nom[1] = Polynomial(5,
     82                            81.0 * POW(R,5),
     83                            0.0,
     84                            0.0,
     85                            -810.0 * POW(R,2),
     86                            1215.0 * R,
     87                            -486.0);
     88
     89  field_denom[0] = Polynomial(3,
     90                              0.0,
     91                              0.0,
     92                              0.0,
     93                              20.0 * POW(R,5));
     94
     95  field_denom[1] = Polynomial(3,
     96                              0.0,
     97                              0.0,
     98                              0.0,
     99                              80.0 * POW(R,5));
    70100
    71101  antid = 39.0 / (16.0 * R);
     
    141171  potential_denom[3] = Polynomial(0, 0.0);
    142172
     173  field_nom[0] = Polynomial(8,
     174                            280.0    * POW(R,8),
     175                            0.0,
     176                            0.0,
     177                            -5544.0  * POW(R,5),
     178                            0.0,
     179                            27216.0  * POW(R,3),
     180                            0.0,
     181                            -87480.0 * R,
     182                            76545.0);
     183
     184  field_nom[1] = Polynomial(8,
     185                            1675.0 * POW(R,8),
     186                            0.0,
     187                            0.0,
     188                            -25704.0 * POW(R,5),
     189                            -85050.0 * POW(R,4),
     190                            571536.0 * POW(R,3),
     191                            -1020600.0 * POW(R,2),
     192                            787320.0 * R,
     193                            -229635.0);
     194
     195  field_nom[2] = Polynomial(8,
     196                            729.0 * POW(R,8),
     197                            0.0,
     198                            0.0,
     199                            -40824.0 * POW(R,5),
     200                            153090.0 * POW(R,4),
     201                            -244944.0 * POW(R,3),
     202                            204120.0 * POW(R,2),
     203                            -87480.0 * R,
     204                            15309.0);
     205
     206  field_denom[0] = Polynomial(3,
     207                              0.0,
     208                              0.0,
     209                              0.0,
     210                              280.0 * POW(R,8));
     211  field_denom[1] = Polynomial(3,
     212                              0.0,
     213                              0.0,
     214                              0.0,
     215                              1680.0 * POW(R,8));
     216
     217  field_denom[2] = Polynomial(3,
     218                              0.0,
     219                              0.0,
     220                              0.0,
     221                              560.0 * POW(R,8));
     222
    143223  antid = 239.0 / (70.0 * R);
    144224
  • src/samples/bspline.hpp

    r4571da r1a92cf  
    9191  }
    9292
     93  vmg_float EvaluateField(const vmg_float& val) const
     94  {
     95    for (unsigned int i=0; i<intervals.size(); ++i)
     96      if (val < intervals[i])
     97        return field_nom[i](val) / field_denom[i](val);
     98    return 0.0;
     99  }
     100
    93101  const vmg_float& GetAntiDerivativeAtZero() const
    94102  {
     
    99107  std::vector<Polynomial> spline_nom, spline_denom;
    100108  std::vector<Polynomial> potential_nom, potential_denom;
     109  std::vector<Polynomial> field_nom, field_denom;
    101110  vmg_float antid;
    102111  std::vector<vmg_float> intervals;
Note: See TracChangeset for help on using the changeset viewer.