Changeset 06e153


Ignore:
Timestamp:
May 10, 2012, 2:17:09 PM (14 years ago)
Author:
Julian Iseringhausen <isering@…>
Children:
fcf7f6
Parents:
cd0fed
Message:

vmg: Improved serial performance.

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

Location:
src/units/particle
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/units/particle/bspline.hpp

    rcd0fed r06e153  
    4848    int c = 0;
    4949
    50     Index i;
    51     Vector dir;
     50    const int index_global_x = (p.Pos().X() - grid.Extent().Begin().X()) / grid.Extent().MeshWidth().X();
     51    const int index_global_y = (p.Pos().Y() - grid.Extent().Begin().Y()) / grid.Extent().MeshWidth().Y();
     52    const int index_global_z = (p.Pos().Z() - grid.Extent().Begin().Z()) / grid.Extent().MeshWidth().Z();
    5253
    53     const Index index_global = static_cast<Index>((p.Pos() - grid.Extent().Begin()) / grid.Extent().MeshWidth());
    54     assert(index_global.X() >= grid.Global().LocalBegin().X() && index_global.X() < grid.Global().LocalEnd().X());
    55     assert(index_global.Y() >= grid.Global().LocalBegin().Y() && index_global.Y() < grid.Global().LocalEnd().Y());
    56     assert(index_global.Z() >= grid.Global().LocalBegin().Z() && index_global.Z() < grid.Global().LocalEnd().Z());
     54    assert(index_global_x >= grid.Global().LocalBegin().X() && index_global_x < grid.Global().LocalEnd().X());
     55    assert(index_global_y >= grid.Global().LocalBegin().Y() && index_global_y < grid.Global().LocalEnd().Y());
     56    assert(index_global_z >= grid.Global().LocalBegin().Z() && index_global_z < grid.Global().LocalEnd().Z());
    5757
    58     const Index index_local = index_global - grid.Global().LocalBegin() + grid.Local().Begin();
    59     assert(index_local.X() >= grid.Local().Begin().X() && index_local.X() < grid.Local().End().X());
    60     assert(index_local.Y() >= grid.Local().Begin().Y() && index_local.Y() < grid.Local().End().Y());
    61     assert(index_local.Z() >= grid.Local().Begin().Z() && index_local.Z() < grid.Local().End().Z());
     58    const int index_local_x = index_global_x - grid.Global().LocalBegin().X() + grid.Local().Begin().X();
     59    const int index_local_y = index_global_y - grid.Global().LocalBegin().Y() + grid.Local().Begin().Y();
     60    const int index_local_z = index_global_z - grid.Global().LocalBegin().Z() + grid.Local().Begin().Z();
    6261
    63     const Vector pos_beg = p.Pos() - grid.Extent().Begin() - grid.Extent().MeshWidth() * (index_global - near_field_cells);
    64     const Vector& h = grid.Extent().MeshWidth();
     62    assert(index_local_x >= grid.Local().Begin().X() && index_local_x < grid.Local().End().X());
     63    assert(index_local_y >= grid.Local().Begin().Y() && index_local_y < grid.Local().End().Y());
     64    assert(index_local_z >= grid.Local().Begin().Z() && index_local_z < grid.Local().End().Z());
     65
     66    const vmg_float pos_beg_x = p.Pos().X() - grid.Extent().Begin().X() - grid.Extent().MeshWidth().X() * (index_global_x - near_field_cells);
     67    const vmg_float pos_beg_y = p.Pos().Y() - grid.Extent().Begin().Y() - grid.Extent().MeshWidth().Y() * (index_global_y - near_field_cells);
     68    const vmg_float pos_beg_z = p.Pos().Z() - grid.Extent().Begin().Z() - grid.Extent().MeshWidth().Z() * (index_global_z - near_field_cells);
     69
     70    const vmg_float h_x = grid.Extent().MeshWidth().X();
     71    const vmg_float h_y = grid.Extent().MeshWidth().Y();
     72    const vmg_float h_z = grid.Extent().MeshWidth().Z();
    6573
    6674    // Iterate over all grid points which lie in the support of the interpolating B-Spline
    67     dir[0] = pos_beg[0];
    68     for (i.X()=-1*near_field_cells; i.X()<=near_field_cells; ++i.X()) {
    69       dir[1] = pos_beg[1];
    70       for (i.Y()=-1*near_field_cells; i.Y()<=near_field_cells; ++i.Y()) {
    71         dir[2] = pos_beg[2];
    72         for (i.Z()=-1*near_field_cells; i.Z()<=near_field_cells; ++i.Z()) {
     75
     76    vmg_float dir_x, dir_y, dir_z;
     77    dir_x = pos_beg_x;
     78    for (int i=-1*near_field_cells; i<=near_field_cells; ++i) {
     79      dir_y = pos_beg_y;
     80      for (int j=-1*near_field_cells; j<=near_field_cells; ++j) {
     81        dir_z = pos_beg_z;
     82        for (int k=-1*near_field_cells; k<=near_field_cells; ++k) {
    7383
    7484          // Compute distance from grid point to particle
    75           temp_val = EvaluateSpline(dir.Length());
     85          temp_val = EvaluateSpline(std::sqrt(dir_x*dir_x+dir_y*dir_y+dir_z*dir_z));
    7686          vals[c++] = temp_val * p.Charge();
    7787          int_val += temp_val;
    7888
    79           dir[2] -= h[2];
     89          dir_z -= h_z;
    8090        }
    81         dir[1] -= h[1];
     91        dir_y -= h_y;
    8292      }
    83       dir[0] -= h[0];
     93      dir_x -= h_x;
    8494    }
    8595
    8696    // Reciprocal value of the numerically integrated spline
    87     int_val = 1.0 / (int_val * grid.Extent().MeshWidth().Product());
     97    int_val = 1.0 / (int_val * h_x * h_y * h_z);
    8898
    8999    c = 0;
    90     for (i.X()=-1*near_field_cells; i.X()<=near_field_cells; ++i.X())
    91       for (i.Y()=-1*near_field_cells; i.Y()<=near_field_cells; ++i.Y())
    92         for (i.Z()=-1*near_field_cells; i.Z()<=near_field_cells; ++i.Z())
    93           grid(index_local+i) += vals[c++] * int_val;
     100    for (int i=-1*near_field_cells; i<=near_field_cells; ++i)
     101      for (int j=-1*near_field_cells; j<=near_field_cells; ++j)
     102        for (int k=-1*near_field_cells; k<=near_field_cells; ++k)
     103          grid(index_local_x + i,
     104               index_local_y + j,
     105               index_local_z + k) += vals[c++] * int_val;
    94106
    95107  }
  • src/units/particle/interface_particles.cpp

    rcd0fed r06e153  
    8484
    8585  // Assign charge values to the right hand side
    86   for (index.X()=0; index.X()<grid.Local().Size().X(); ++index.X())
    87     for (index.Y()=0; index.Y()<grid.Local().Size().Y(); ++index.Y())
    88       for (index.Z()=0; index.Z()<grid.Local().Size().Z(); ++index.Z())
    89         grid(index + grid.Local().Begin()) = 4.0 * Math::pi * particle_grid.GetVal(index + particle_grid.Local().Begin());
     86  for (int i=0; i<grid.Local().Size().X(); ++i)
     87    for (int j=0; j<grid.Local().Size().Y(); ++j)
     88      for (int k=0; k<grid.Local().Size().Z(); ++k)
     89        grid(grid.Local().Begin().X() + i,
     90             grid.Local().Begin().Y() + j,
     91             grid.Local().Begin().Z() + k) = 4.0 * Math::pi *
     92          particle_grid.GetVal(particle_grid.Local().Begin().X() + i,
     93                               particle_grid.Local().Begin().Y() + j,
     94                               particle_grid.Local().Begin().Z() + k);
    9095
    9196#ifdef DEBUG_OUTPUT
Note: See TracChangeset for help on using the changeset viewer.