ExtArray ExtArray::deriv(value_t dt) const { if (isconst()) return const_array(0.0); if (data_size_ == 1) { const value_t dx = (last_ - data_.get()[0]) / (2 * dt); value_t* x = new value_t[2]; x[0] = dx; /* left and right finite differences */ x[1] = dx; return ExtArray(shared_owner(x), 0.0, 2); } else { const value_t dt2 = 2 * dt; value_t* x = new value_t[data_size_ + 1]; /* left/right finite difference for edges, otherwise central diff */ x[0] = (data_.get()[1] - data_.get()[0]) / dt; for (size_t i = 1; i < data_size_-1; ++i) x[i] = (data_.get()[i + 1] - data_.get()[i - 1]) / dt2; if (data_size_ >= 3) x[data_size_ - 1] = (last_ - data_.get()[data_size_ - 2]) / dt2; x[data_size_] = (last_ - data_.get()[data_size_-1]) / dt; return ExtArray(shared_owner(x), 0.0, data_size_ + 1); } }
constexpr std::pair<const_array, const_array> cut(size_t o) const { return {const_array(d, o), const_array(d + o, n - o)}; }