17#ifndef __B2LINEAR_ALGEBRA_UTILS_H__ 
   18#define __B2LINEAR_ALGEBRA_UTILS_H__ 
   22#include "b2linear_algebra_def.H" 
   23#include "b2ppconfig.h" 
   37#define thread_local_storage __thread 
   39#define thread_local_storage 
   50    static T* 
get(
size_t size) {
 
   51        if (buffer_size < size) {
 
   52            while (buffer_size < size) { buffer_size = buffer_size ? buffer_size * 2 : 1; }
 
   54            buffer = 
new T[buffer_size];
 
   55            std::fill_n(buffer, buffer_size, initialisation_value);
 
 
   61    static thread_local_storage 
size_t buffer_size;
 
   62    static thread_local_storage T* buffer;
 
   63    static T initialisation_value;
 
 
   84    Interval(
size_t start_, 
size_t end_) : start(start_), end(end_) {}
 
   86    bool is_null()
 const { 
return this == &null; }
 
   88    bool is_all()
 const { 
return this == &all; }
 
   90    size_t size()
 const { 
return end - start; }
 
   92    size_t operator[](
size_t i)
 const { 
return start + i; }
 
   94    size_t get_start()
 const { 
return start; }
 
   96    size_t get_end()
 const { 
return end; }
 
   98    std::pair<bool, size_t> find(
size_t i)
 const {
 
   99        if (i >= start && i < end) { 
return std::pair<bool, size_t>(
true, i - start); }
 
  100        return std::pair<bool, size_t>(
false, 0);
 
  103    static Interval null;
 
  115    Slice(
size_t start_, 
size_t end_ = 0, 
size_t step_ = 1)
 
  116        : start(start_), end(end_ == 0 ? start_ + 1 : end_), step(step_) {}
 
  118    bool is_null()
 const { 
return this == &null; }
 
  120    bool is_all()
 const { 
return this == &all; }
 
  122    size_t size()
 const { 
return (end - start) / step; }
 
  124    size_t increment()
 const { 
return step; }
 
  126    size_t operator[](
size_t i)
 const { 
return start + i * step; }
 
  128    std::pair<bool, size_t> find(
size_t i)
 const {
 
  129        if (i >= start && i < end) {
 
  130            size_t r = i - start;
 
  131            if ((r % step) == 0) { 
return std::pair<bool, size_t>(
true, r / start); }
 
  133        return std::pair<bool, size_t>(
false, 0);
 
  146class Index : 
public std::vector<size_t> {
 
  148    Index(
size_t s = 0) : std::vector<size_t>(s) {}
 
  150    Index(
const Index::const_iterator& ibegin, 
const Index::const_iterator& iend)
 
  151        : std::vector<size_t>(ibegin, iend) {}
 
  153    Index(
size_t start, 
size_t end) {
 
  154        reserve(end - start);
 
  155        while (start != end) { push_back(start++); }
 
  158    bool is_null()
 const { 
return this == &null; }
 
  160    bool is_all()
 const { 
return this == &all; }
 
  162    void set_zero() { std::fill(begin(), end(), 0); }
 
  164    std::pair<bool, size_t> find(
size_t i)
 const {
 
  165        std::vector<size_t>::const_iterator ii = std::lower_bound(begin(), end(), i);
 
  166        if (*ii == i) { 
return std::pair<bool, size_t>(
true, ii - begin()); }
 
  167        return std::pair<bool, size_t>(
false, 0);
 
  170    bool sorted()
 const {
 
  171        for (
size_t i = 1; i != size(); ++i) {
 
  172            if (
operator[](i - 1) > operator[](i)) { 
return false; }
 
  177    Index operator()(
const Interval& i) { 
return Index(begin() + i.start, begin() + i.end); }
 
  179    Index make_dual()
 const {
 
  181        for (
size_t i = 0; i != size(); ++i) {
 
  182            const size_t ii = operator[](i);
 
  192    friend logging::Logger& operator<<(logging::Logger& l, 
const Index& v) {
 
  193        l << 
"index vector ";
 
  194        l.write(v.size(), &v[0], 1);
 
  199std::ostream& operator<<(std::ostream& out, 
const Index& index);
 
Definition b2linear_algebra_utils.H:44
 
static T * get(size_t size)
Definition b2linear_algebra_utils.H:50
 
Contains the base classes for implementing Finite Elements.
Definition b2boundary_condition.H:32