Changeset 1a92cf
- Timestamp:
- Apr 29, 2012, 10:50:41 AM (14 years ago)
- Children:
- 39a6d9
- Parents:
- 4571da
- Location:
- src
- Files:
-
- 5 edited
-
base/interpolate_polynomial.cpp (modified) (8 diffs)
-
base/interpolate_polynomial.hpp (modified) (4 diffs)
-
interface/interface_particles.cpp (modified) (3 diffs)
-
samples/bspline.cpp (modified) (3 diffs)
-
samples/bspline.hpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/base/interpolate_polynomial.cpp
r4571da r1a92cf 14 14 15 15 InterpolatePolynomial::InterpolatePolynomial(const unsigned int& degree) : 16 deg(degree), 16 17 deg_1(degree+1), 17 pos_begin(0.0) 18 buffer(degree+1), 19 buffer_diff(degree) 18 20 { 19 21 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); 20 25 } 21 26 … … 23 28 { 24 29 delete [] coeff; 30 delete [] coeff_buffer; 25 31 } 26 32 … … 59 65 void InterpolatePolynomial::_compute_coefficients_1d(const Index& index, const unsigned int& direction) 60 66 { 61 vmg_float temp_array[deg_1];62 67 vmg_float power = 1.0; 63 68 unsigned long faculty = 1; … … 66 71 67 72 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); 69 74 70 75 i=index; … … 72 77 for (c=1; c<deg_1; ++i[direction], ++c) { 73 78 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]; 75 80 faculty *= c; 76 81 power *= h[direction]; 77 _access_coeff(i) = temp_array[0] / (faculty*power);82 _access_coeff(i) = coeff_buffer[0] / (faculty*power); 78 83 } 79 84 } … … 86 91 87 92 prod[0] = 1.0; 88 offset[0] = pos _begin[0];93 offset[0] = pos[0] - pos_begin[0]; 89 94 for (i[0]=0; i[0]<deg_1; ++i[0]) { 90 95 prod[1] = prod[0]; 91 offset[1] = pos _begin[1];96 offset[1] = pos[1] - pos_begin[1]; 92 97 for (i[1]=0; i[1]<deg_1; ++i[1]) { 93 98 prod[2] = prod[1]; 94 offset[2] = pos _begin[2];99 offset[2] = pos[2] - pos_begin[2]; 95 100 for (i[2]=0; i[2]<deg_1; ++i[2]) { 96 101 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]; 99 104 } 100 prod[1] *= pos[1] -offset[1];101 offset[1] += h[1];105 prod[1] *= offset[1]; 106 offset[1] -= h[1]; 102 107 } 103 prod[0] *= pos[0] -offset[0];104 offset[0] += h[0];108 prod[0] *= offset[0]; 109 offset[0] -= h[0]; 105 110 } 106 111 … … 108 113 } 109 114 110 Vector InterpolatePolynomial::EvaluateGradient(const Vector& pos)115 void InterpolatePolynomial::Evaluate(const Vector& pos, vmg_float& pot, Vector& field) 111 116 { 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 156 Vector InterpolatePolynomial::EvaluateNegGradient(const Vector& pos) 157 { 114 158 Vector offset, result; 115 159 … … 118 162 for (int i=1; i<deg_1; ++i) { 119 163 buffer[i] = buffer[i-1] * offset; 120 offset += h;164 offset -= h; 121 165 } 122 166 123 167 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) { 127 169 for (int j=0; j<i; ++j) 128 170 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; 130 173 } 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]; 131 178 132 179 for (int i=0; i<deg_1; ++i) 133 180 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]; 141 185 } 142 186 -
src/base/interpolate_polynomial.hpp
r4571da r1a92cf 2 2 #define INTERPOLATE_POLYNOMIAL_HPP_ 3 3 4 #include <base/vector.hpp> 4 #include <vector> 5 6 #include "base/index.hpp" 7 #include "base/vector.hpp" 5 8 6 9 namespace VMG … … 8 11 9 12 class Grid; 10 class Index;11 13 12 14 class InterpolatePolynomial … … 19 21 20 22 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); 22 25 23 26 private: … … 35 38 36 39 vmg_float* coeff; 37 unsigned int deg_1; 40 vmg_float* coeff_buffer; 41 unsigned int deg, deg_1; 38 42 Vector pos_begin; 39 43 Vector h; 44 std::vector<Vector> buffer; 45 std::vector< std::vector<Vector> > buffer_diff; 40 46 }; 41 47 -
src/interface/interface_particles.cpp
r4571da r1a92cf 101 101 { 102 102 Index i; 103 vmg_float length;104 103 105 104 #ifdef DEBUG_OUTPUT … … 161 160 for (p1=lc_1.begin(); p1!=lc_1.end(); ++p1) { 162 161 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(); 164 164 165 165 #ifdef DEBUG_OUTPUT … … 177 177 if (*p1 != *p2) { 178 178 179 length = ((*p2)->Pos() - (*p1)->Pos()).Length(); 179 const Vector dir = (*p1)->Pos() - (*p2)->Pos(); 180 const vmg_float length = dir.Length(); 180 181 181 182 if (length < r_cut) { 183 182 184 (*p1)->Pot() += (*p2)->Charge() / length * (1.0 + spl.EvaluatePotential(length)); 185 (*p1)->Field() += (*p2)->Charge() * dir * spl.EvaluateField(length); 183 186 184 187 #ifdef DEBUG_OUTPUT -
src/samples/bspline.cpp
r4571da r1a92cf 33 33 potential_nom((BSPLINE_DEGREE+1)/2+1), 34 34 potential_denom((BSPLINE_DEGREE+1)/2+1), 35 field_nom((BSPLINE_DEGREE+1)/2), 36 field_denom((BSPLINE_DEGREE+1)/2), 35 37 intervals((BSPLINE_DEGREE+1)/2), 36 38 R(width) … … 68 70 potential_denom[1] = Polynomial(0, 160.0*POW(R,5)); 69 71 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)); 70 100 71 101 antid = 39.0 / (16.0 * R); … … 141 171 potential_denom[3] = Polynomial(0, 0.0); 142 172 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 143 223 antid = 239.0 / (70.0 * R); 144 224 -
src/samples/bspline.hpp
r4571da r1a92cf 91 91 } 92 92 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 93 101 const vmg_float& GetAntiDerivativeAtZero() const 94 102 { … … 99 107 std::vector<Polynomial> spline_nom, spline_denom; 100 108 std::vector<Polynomial> potential_nom, potential_denom; 109 std::vector<Polynomial> field_nom, field_denom; 101 110 vmg_float antid; 102 111 std::vector<vmg_float> intervals;
Note:
See TracChangeset
for help on using the changeset viewer.
