Ignore:
Timestamp:
Apr 5, 2013, 12:39:30 PM (13 years ago)
Author:
Julian Iseringhausen <julian.iseringhausen@…>
Children:
4a709e
Parents:
f57182
Message:

Merge stashed open boundary stuff.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/base/interface.cpp

    rf57182 r8180d8  
    4848{
    4949  int i;
    50   Index size_factor;
     50  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);
    5154
    5255  const Vector box_center = box_offset + 0.5 * box_size;
     
    5659   */
    5760  for (i=0; i<coarseningSteps; ++i) {
     61
     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);
     64
     65    num_cells = Helper::intpow(2,levelMax-i) * size_factor;
     66
     67    global.push_back(GlobalIndices());
    5868    extent.push_back(SpatialExtent());
    59     for (int j=0; j<3; ++j)
    60       size_factor[j] = (bc[j] == Periodic ? 1 : Helper::intpow(2, static_cast<int>(log(pow(alpha, i+1)) / log(2.0) + 1.0)));
    6169
    6270    extent.back().Size() = box_size * static_cast<Vector>(size_factor);
    6371    extent.back().Begin() = box_center - 0.5 * extent.back().Size();
    6472    extent.back().End() = extent.back().Begin() + extent.back().Size();
    65     extent.back().MeshWidth() = pow(2.0, i-levelMax) * extent.back().Size() / size_factor;
     73    extent.back().MeshWidth() = extent.back().Size() / num_cells;
     74
     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;
     78
     79    global.back().GlobalSizeNew() = global.back().LocalSize();
     80    global.back().GlobalBegin() = global.back().LocalBegin();
     81    global.back().GlobalEnd() = global.back().LocalEnd();
     82
     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;
     86
    6687  }
    6788
    68   if (extent.size() == 0) {
    69     extent.push_back(SpatialExtent());
    70     extent.back().Size() = box_size;
    71     extent.back().Begin() = box_offset;
    72     extent.back().End() = box_offset + box_size;
    73     extent.back().MeshWidth() = box_size / Helper::intpow(2,levelMax);
     89  if (coarseningSteps == 0) {
     90
     91          num_cells = Helper::intpow(2, levelMax);
     92
     93          global.push_back(GlobalIndices());
     94          extent.push_back(SpatialExtent());
     95
     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;
     100
     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;
     104
     105          global.back().GlobalSizeNew() = global.back().LocalSize();
     106          global.back().GlobalBegin() = global.back().LocalBegin();
     107          global.back().GlobalEnd() = global.back().LocalEnd();
     108
     109          global.back().GlobalSizeFinest() = global.back().LocalSize();
     110          global.back().GlobalBeginFinest() = global.back().LocalBegin();
     111          global.back().GlobalEndFinest() = global.back().LocalEnd();
     112
    74113  }
    75114
    76   while ((extent.back().Size() / extent.back().MeshWidth()).Min() > Helper::intpow(2,levelMin) + 1) {
    77     extent.push_back(SpatialExtent(extent.back()));
    78     extent.back().MeshWidth() *= 2;
    79   }
     115  while (global.back().LocalSize().Min() > Helper::intpow(2, levelMin)+1) {
    80116
    81   /*
    82    * Find GlobalMax
    83    */
    84   for (std::vector<SpatialExtent>::const_iterator iter=extent.begin(); iter!=extent.end(); ++iter) {
    85     global.push_back(GlobalIndices());
    86     global.back().BoundaryType() = GlobalCoarsened;
    87   }
     117    num_cells /= 2;
    88118
    89   for (i=global.size()-1; i>=0; --i) {
    90     if (i == 0 || extent[i-1].Size() != extent[i].Size()) {
    91       global[i].BoundaryType() = GlobalMax;
     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
     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;
     127
     128    global.back().GlobalSizeNew() = global.back().LocalSize();
     129    global.back().GlobalBegin() = global.back().LocalBegin();
     130    global.back().GlobalEnd() = global.back().LocalEnd();
     131
     132    global.back().GlobalSizeFinest() = (++global.rbegin())->GlobalSizeFinest();
     133    global.back().GlobalBeginFinest() = (++global.rbegin())->GlobalBeginFinest();
     134    global.back().GlobalEndFinest() = (++global.rbegin())->GlobalEndFinest();
     135  }     
     136
     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;
    92143      break;
    93144    }
    94145  }
    95   for (--i; i>=0; --i)
    96     global[i].BoundaryType() = LocallyRefined;
    97 
    98   /*
    99    * Compute global grid values
    100    */
    101   for (i=0; i<global.size(); ++i) {
    102 
    103     const Index num_cells = extent[i].Size() / extent[i].MeshWidth() + 0.5;
    104 
    105     for (int j=0; j<3; ++j) {
    106 
    107       if (bc[j] == Dirichlet || bc[j] == Open) {
    108         /*
    109          * Dirichlet
    110          */
    111 
    112         if (global[i].BoundaryType() == LocallyRefined) {
    113           /*
    114            * Locally Refined
    115            */
    116 
    117           global[i].GlobalSize()[j] = num_cells[j] + 3;
    118 
    119           if (i == 0) {
    120             global[i].GlobalFinerBegin()[j] = GetGlobalIndex(box_offset, extent[i], global[i].BoundaryType())[j];
    121             global[i].GlobalFinerEnd()[j] = GetGlobalIndex(box_offset + box_size, extent[i], global[i].BoundaryType())[j] + 1;
    122             global[i].GlobalFinerSize()[j] = global[i].GlobalFinerEnd()[j] - global[i].GlobalFinerBegin()[j];
    123           } else {
    124             global[i].GlobalFinerBegin()[j] = GetGlobalIndex(extent[i-1].Begin(), extent[i], global[i].BoundaryType())[j];
    125             global[i].GlobalFinerEnd()[j] = GetGlobalIndex(extent[i-1].End(), extent[i], global[i].BoundaryType())[j] + 1;
    126             global[i].GlobalFinerSize()[j] = global[i].GlobalFinerEnd()[j] - global[i].GlobalFinerBegin()[j];
    127           }
    128 
    129         } else if (global[i].BoundaryType() == GlobalMax) {
    130           /*
    131            * Global Max
    132            */
    133 
    134           global[i].GlobalSize()[j] = num_cells[j] + 1;
    135 
    136           if (i == 0) {
    137             global[i].GlobalFinerBegin()[j] = 0;
    138             global[i].GlobalFinerEnd()[j] = num_cells[j] + 1;
    139             global[i].GlobalFinerSize()[j] = num_cells[j] + 1;
    140           } else {
    141             global[i].GlobalFinerBegin()[j] = GetGlobalIndex(extent[i-1].Begin(), extent[i], global[i].BoundaryType())[j];
    142             global[i].GlobalFinerEnd()[j] = GetGlobalIndex(extent[i-1].End(), extent[i], global[i].BoundaryType())[j] + 1;
    143             global[i].GlobalFinerSize()[j] = global[i].GlobalFinerEnd()[j] - global[i].GlobalFinerBegin()[j];
    144           }
    145 
    146         } else {
    147           /*
    148            * Global Coarsened
    149            */
    150 
    151           global[i].GlobalSize()[j] = num_cells[j] + 1;
    152 
    153           global[i].GlobalFinerBegin()[j] = 0;
    154           global[i].GlobalFinerEnd()[j] = num_cells[j] + 1;
    155           global[i].GlobalFinerSize()[j] = num_cells[j] + 1;
    156 
    157         }
    158 
    159       } else if (bc[j] == Periodic) {
    160         /*
    161          * Periodic
    162          */
    163 
    164         global[i].GlobalSize()[j] = num_cells[j];
    165 
    166         global[i].GlobalFinerBegin()[j] = 0;
    167         global[i].GlobalFinerEnd()[j] = num_cells[j];
    168         global[i].GlobalFinerSize()[j] = num_cells[j];
    169 
    170       }
    171     }
    172 
    173     global[i].LocalBegin() = 0;
    174     global[i].LocalEnd() = global[i].GlobalSize();
    175     global[i].LocalSize() = global[i].GlobalSize();
    176 
    177     global[i].LocalFinerBegin() = global[i].GlobalFinerBegin();
    178     global[i].LocalFinerEnd() = global[i].GlobalFinerEnd();
    179     global[i].LocalFinerSize() = global[i].GlobalFinerSize();
    180 
    181   }
    182146
    183147  levelMin = levelMax - global.size() + 1;
    184 
    185148}
Note: See TracChangeset for help on using the changeset viewer.