/** * @file interface.cpp * @author Julian Iseringhausen * @date Mon Apr 18 12:55:48 2011 * * @brief VMG::Interface * */ #ifdef HAVE_CONFIG_H #include #endif #include #include "base/helper.hpp" #include "interface/interface.hpp" using namespace VMG; Interface::Interface(BC boundary, int levelMin_, int levelMax_, vmg_float box_begin_, vmg_float box_end_, int coarseningSteps, vmg_float alpha) { bc = boundary; levelMin = levelMin_; levelMax = levelMax_; bool restricted = false; const vmg_float box_center = 0.5 * (box_begin_ + box_end_); const vmg_float box_size = box_end_ - box_begin_; for (int i=0; i(log(pow(alpha, i+1)) / log(2.0) + 1.0)); extent.back().Size() = box_size * static_cast(extent.back().SizeFactor()); extent.back().Begin() = box_center - 0.5 * extent.back().Size(); extent.back().End() = extent.back().Begin() + extent.back().Size(); extent.back().MeshWidth() = pow(2.0, i-levelMax); global.back().Size() = static_cast(static_cast(extent.back().Size()) / extent.back().MeshWidth() + 0.5) + 1; global.back().Begin() = 0; global.back().End() = global.back().Size(); } for (int i=0; i( pow(2.0, levelMax) + 0.5) - 1) / 2; }else if (global[i].BoundaryType() == LocallyRefined) global[i].AlignmentBegin() = (extent[i].Size() - extent[i-1].Size()) * pow(2.0, levelMax-i-1) + 0.5; else if (global[i].BoundaryType() == GlobalMax) global[i].AlignmentBegin() = (extent[i].Size() - extent[i-1].Size()) * pow(2.0, levelMax-i-1) - 0.5; else global[i].AlignmentBegin() = 0; global[i].AlignmentEnd() = global[i].Size() - global[i].AlignmentBegin(); } while (global.size() == 0 || global.back().Size().Max() > Helper::intpow(2,levelMin)+1) { global.push_back(GlobalIndices()); extent.push_back(SpatialExtent()); extent.back().SizeFactor() = (global.size() > 1 ? (++extent.rbegin())->Size() : 1); extent.back().Size() = (global.size() > 1 ? (++extent.rbegin())->Size() : box_size); extent.back().Begin() = box_center - 0.5 * static_cast(extent.back().Size()); extent.back().End() = extent.back().Begin() + extent.back().Size(); extent.back().MeshWidth() = pow(2.0, static_cast(global.size())-levelMax-1); global.back().Size() = static_cast(static_cast(extent.back().Size()) / extent.back().MeshWidth() + 0.5) + 1; global.back().Begin() = 0; global.back().End() = global.back().Size(); if (global.size() > 1) global.back().BoundaryType() = GlobalCoarsened; else global.back().BoundaryType() = GlobalMax; global.back().AlignmentBegin() = 0; global.back().AlignmentEnd() = global.back().Size(); } if (boundary == Periodic) for (std::vector::iterator iter=global.begin(); iter!=global.end(); ++iter) iter->Size() -= 1; levelMin = levelMax - global.size() + 1; }