Changeset e85cfd for src/base


Ignore:
Timestamp:
Apr 9, 2013, 9:45:13 AM (13 years ago)
Author:
Julian Iseringhausen <isering@…>
Children:
0bd47e
Parents:
4a709e
Message:

Work.

Location:
src/base
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/base/interface.cpp

    r4a709e re85cfd  
    3838using namespace VMG;
    3939
    40 static Index GetGlobalIndex(const Vector& pos, const SpatialExtent& extent, const BT& bt)
     40void Interface::InitInterface(const Vector& box_offset, const vmg_float& box_size,
     41    const int& max_boundary_nodes, const vmg_float& alpha)
    4142{
    42   const Index index = (pos - extent.Begin()) / extent.MeshWidth() + 0.5;
    43   return index + (bt == LocallyRefined ? 1 : 0);
    44 }
    45 
    46 void Interface::InitInterface(const Vector& box_offset, const vmg_float& box_size,
    47                               const int& coarseningSteps, const vmg_float& alpha)
    48 {
    49   int i;
    5043  Index num_cells, size_factor;
    51   Index add_node = Index(bc[0]==Periodic?0:1,
    52                                          bc[1]==Periodic?0:1,
    53                                          bc[2]==Periodic?0:1);
     44  Index add_node = Index(bc[0]==Periodic ? 0 : 1,
     45      bc[1]==Periodic ? 0 : 1,
     46          bc[2]==Periodic ? 0 : 1);
    5447
    5548  const Vector box_center = box_offset + 0.5 * box_size;
     
    5851   * Get Extents
    5952   */
    60   for (i=0; i<coarseningSteps; ++i) {
     53   if (bc[0] == Open || bc[1] == Open || bc[2] == Open) {
    6154
    62     for (int j=0; j<3; ++j)
    63       size_factor[j] = (bc[j] == Open ? Helper::intpow(2, static_cast<int>(log(pow(alpha, i+1)) / log(2.0) + 1.0)) : 1);
     55     while (global.size() == 0 ||
     56         (bc[0] == Open && global.back().GlobalSizeNew()[0] > max_boundary_nodes) ||
     57         (bc[1] == Open && global.back().GlobalSizeNew()[1] > max_boundary_nodes) ||
     58         (bc[2] == Open && global.back().GlobalSizeNew()[2] > max_boundary_nodes)) {
    6459
    65     num_cells = Helper::intpow(2,levelMax-i) * size_factor;
     60       global.push_back(GlobalIndices());
     61       extent.push_back(SpatialExtent());
    6662
    67     global.push_back(GlobalIndices());
    68     extent.push_back(SpatialExtent());
     63       for (int j=0; j<3; ++j)
     64         size_factor[j] = (bc[j] == Open ? Helper::intpow(2, static_cast<int>(log(pow(alpha, global.size())) / log(2.0) + 1.0)) : 1);
    6965
    70     extent.back().Size() = box_size * static_cast<Vector>(size_factor);
    71     extent.back().Begin() = box_center - 0.5 * extent.back().Size();
    72     extent.back().End() = extent.back().Begin() + extent.back().Size();
    73     extent.back().MeshWidth() = extent.back().Size() / num_cells;
     66       num_cells = Helper::intpow(2,levelMax-global.size()+1) * size_factor;
    7467
    75     global.back().LocalSize() = num_cells + add_node;
    76     global.back().LocalBegin() = -1 * num_cells / 2;
    77     global.back().LocalEnd() = num_cells/2 + add_node;
     68       extent.back().Size() = box_size * static_cast<Vector>(size_factor);
     69       extent.back().Begin() = box_center - 0.5 * extent.back().Size();
     70       extent.back().End() = extent.back().Begin() + extent.back().Size();
     71       extent.back().MeshWidth() = extent.back().Size() / num_cells;
    7872
    79     global.back().GlobalSizeNew() = global.back().LocalSize();
    80     global.back().GlobalBegin() = global.back().LocalBegin();
    81     global.back().GlobalEnd() = global.back().LocalEnd();
     73       global.back().LocalSize() = num_cells + add_node;
     74       global.back().LocalBegin() = -1 * num_cells / 2;
     75       global.back().LocalEnd() = num_cells/2 + add_node;
    8276
    83     global.back().GlobalSizeFinest() = Helper::intpow(2, coarseningSteps)*num_cells + add_node;
    84     global.back().GlobalBeginFinest() = -1 * ((Helper::intpow(2, coarseningSteps)*num_cells) / 2);
    85     global.back().GlobalEndFinest() = (Helper::intpow(2, coarseningSteps)*num_cells) / 2 + add_node;
     77       global.back().GlobalSizeNew() = global.back().LocalSize();
     78       global.back().GlobalBegin() = global.back().LocalBegin();
     79       global.back().GlobalEnd() = global.back().LocalEnd();
    8680
    87   }
     81       global.back().GlobalSizeFinest() = Helper::intpow(2, global.size()-1)*num_cells + add_node;
     82       global.back().GlobalBeginFinest() = -1 * ((Helper::intpow(2, global.size()-1)*num_cells) / 2);
     83       global.back().GlobalEndFinest() = (Helper::intpow(2, global.size()-1)*num_cells) / 2 + add_node;
    8884
    89   if (coarseningSteps == 0) {
     85       global.back().BoundaryType() = LocallyRefined;
    9086
    91           num_cells = Helper::intpow(2, levelMax);
     87     }
    9288
    93           global.push_back(GlobalIndices());
    94           extent.push_back(SpatialExtent());
     89     for (int i=global.size()-1; i>0; --i) {
     90       if (global[i].GlobalSizeFinest().Max() > global[i-1].GlobalSizeFinest().Max()) {
     91         global[i].BoundaryType() = GlobalMax;
     92         break;
     93       }else {
     94         global[i].BoundaryType() = GlobalCoarsened;
     95       }
     96     }
     97   } else {
    9598
    96           extent.back().Size() = box_size;
    97           extent.back().Begin() = box_center - 0.5 * extent.back().Size();
    98           extent.back().End() = extent.back().Begin() + extent.back().Size();
    99           extent.back().MeshWidth() = extent.back().Size() / num_cells;
     99     num_cells = Helper::intpow(2, levelMax);
    100100
    101           global.back().LocalSize() = num_cells + add_node;
    102           global.back().LocalBegin() = -1 * num_cells/2;
    103           global.back().LocalEnd() = num_cells/2 + add_node;
     101     global.push_back(GlobalIndices());
     102     extent.push_back(SpatialExtent());
    104103
    105           global.back().GlobalSizeNew() = global.back().LocalSize();
    106           global.back().GlobalBegin() = global.back().LocalBegin();
    107           global.back().GlobalEnd() = global.back().LocalEnd();
     104     extent.back().Size() = box_size;
     105     extent.back().Begin() = box_center - 0.5 * extent.back().Size();
     106     extent.back().End() = extent.back().Begin() + extent.back().Size();
     107     extent.back().MeshWidth() = extent.back().Size() / num_cells;
    108108
    109           global.back().GlobalSizeFinest() = global.back().LocalSize();
    110           global.back().GlobalBeginFinest() = global.back().LocalBegin();
    111           global.back().GlobalEndFinest() = global.back().LocalEnd();
     109     global.back().LocalSize() = num_cells + add_node;
     110     global.back().LocalBegin() = -1 * num_cells/2;
     111     global.back().LocalEnd() = num_cells/2 + add_node;
    112112
    113   }
     113     global.back().GlobalSizeNew() = global.back().LocalSize();
     114     global.back().GlobalBegin() = global.back().LocalBegin();
     115     global.back().GlobalEnd() = global.back().LocalEnd();
    114116
    115   while (global.back().LocalSize().Min() > Helper::intpow(2, levelMin)+1) {
     117     global.back().GlobalSizeFinest() = global.back().LocalSize();
     118     global.back().GlobalBeginFinest() = global.back().LocalBegin();
     119     global.back().GlobalEndFinest() = global.back().LocalEnd();
    116120
    117     num_cells /= 2;
     121     global.back().BoundaryType() = GlobalMax;
    118122
    119     extent.back().Size() = (++extent.rbegin())->Size();
    120     extent.back().Begin() = (++extent.rbegin())->Begin();
    121     extent.back().End() = (++extent.rbegin())->End();
    122     extent.back().MeshWidth() = 2.0 * (++extent.rbegin())->MeshWidth();
     123   }
    123124
    124     global.back().LocalSize() = num_cells + add_node;
    125     global.back().LocalBegin() = -1 * num_cells/2;
    126     global.back().LocalEnd() = num_cells/2 + add_node;
    127125
    128     global.back().GlobalSizeNew() = global.back().LocalSize();
    129     global.back().GlobalBegin() = global.back().LocalBegin();
    130     global.back().GlobalEnd() = global.back().LocalEnd();
     126   while (global.back().GlobalSizeNew().Min() > Helper::intpow(2, levelMin)+1) {
    131127
    132     global.back().GlobalSizeFinest() = (++global.rbegin())->GlobalSizeFinest();
    133     global.back().GlobalBeginFinest() = (++global.rbegin())->GlobalBeginFinest();
    134     global.back().GlobalEndFinest() = (++global.rbegin())->GlobalEndFinest();
    135   }     
     128     num_cells /= 2;
    136129
    137   for (i=global.size()-2; i>=0; --i) {
    138     if (global[i].GlobalSizeFinest().Product() >= global[i+1].GlobalSizeFinest().Product()) {
    139       global[i].BoundaryType() = GlobalCoarsened;
    140     }else {
    141       global[i].BoundaryType() = LocallyRefined;
    142       global[i+1].BoundaryType() = GlobalMax;
    143       break;
    144     }
    145   }
     130     global.push_back(GlobalIndices());
     131     extent.push_back(SpatialExtent());
    146132
    147   levelMin = levelMax - global.size() + 1;
     133     extent.back().Size() = (++extent.rbegin())->Size();
     134     extent.back().Begin() = (++extent.rbegin())->Begin();
     135     extent.back().End() = (++extent.rbegin())->End();
     136     extent.back().MeshWidth() = 2.0 * (++extent.rbegin())->MeshWidth();
     137
     138     global.back().LocalSize() = num_cells + add_node;
     139     global.back().LocalBegin() = -1 * num_cells/2;
     140     global.back().LocalEnd() = num_cells/2 + add_node;
     141
     142     global.back().GlobalSizeNew() = global.back().LocalSize();
     143     global.back().GlobalBegin() = global.back().LocalBegin();
     144     global.back().GlobalEnd() = global.back().LocalEnd();
     145
     146     global.back().GlobalSizeFinest() = (++global.rbegin())->GlobalSizeFinest();
     147     global.back().GlobalBeginFinest() = (++global.rbegin())->GlobalBeginFinest();
     148     global.back().GlobalEndFinest() = (++global.rbegin())->GlobalEndFinest();
     149
     150     global.back().BoundaryType() = GlobalCoarsened;
     151
     152   }
     153
     154   levelMin = levelMax - global.size() + 1;
    148155}
  • src/base/interface.hpp

    r4a709e re85cfd  
    4545  Interface(const Boundary& boundary, const int& levelMin, const int& levelMax,
    4646            const Vector& box_offset, const vmg_float box_size,
    47             int coarseningSteps=0, vmg_float alpha=1.6,
     47            int max_boundary_nodes=9, vmg_float alpha=1.6,
    4848            bool register_ = true) :
    4949    Object("INTERFACE", register_),
     
    5252    levelMax(levelMax)
    5353  {
    54     InitInterface(box_offset, box_size, coarseningSteps, alpha);
     54    InitInterface(box_offset, box_size, max_boundary_nodes, alpha);
    5555  }
    5656
     
    8080private:
    8181  void InitInterface(const Vector& box_offset, const vmg_float& box_end,
    82                      const int& coarseningSteps, const vmg_float& alpha);
     82                     const int& max_boundary_nodes, const vmg_float& alpha);
    8383
    8484  std::vector<GlobalIndices> global;
Note: See TracChangeset for help on using the changeset viewer.