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