⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ublasvector.cpp

📁 Dolfin provide a high-performance linear algebra library
💻 CPP
字号:
// Copyright (C) 2006-2007 Garth N. Wells.// Licensed under the GNU LGPL Version 2.1.//// Modified by Anders Logg 2006-2007.//// First added:  2006-04-04// Last changed: 2007-08-30#include <sstream>#include <iomanip>#include <dolfin/dolfin_log.h>#include <boost/numeric/ublas/vector.hpp>#include <dolfin/uBlasVector.h>#ifdef HAVE_PETSC_H#include <dolfin/PETScVector.h>#endifusing namespace dolfin;//-----------------------------------------------------------------------------uBlasVector::uBlasVector()  : GenericVector(),    Variable("x", "a dense vector"),    ublas_vector(){  //Do nothing}//-----------------------------------------------------------------------------uBlasVector::uBlasVector(uint N)  : GenericVector(),    Variable("x", "a dense vector"),    ublas_vector(N){  // Clear matrix (not done by ublas)  clear();}//-----------------------------------------------------------------------------uBlasVector::~uBlasVector(){  //Do nothing}//-----------------------------------------------------------------------------void uBlasVector::init(uint N){  if( this->size() == N)  {    clear();    return;  }    this->resize(N, false);  clear();}//-----------------------------------------------------------------------------uBlasVector* uBlasVector::create() const{  return new uBlasVector();} //-----------------------------------------------------------------------------uBlasVector* uBlasVector::copy() const{  return new uBlasVector(*this);}//-----------------------------------------------------------------------------void uBlasVector::get(real* values) const{  for (uint i = 0; i < size(); i++)    values[i] = (*this)(i);}//-----------------------------------------------------------------------------void uBlasVector::set(real* values){  for (uint i = 0; i < size(); i++)    (*this)(i) = values[i];}//-----------------------------------------------------------------------------void uBlasVector::add(real* values){  for (uint i = 0; i < size(); i++)    (*this)(i) += values[i];}//-----------------------------------------------------------------------------void uBlasVector::get(real* block, uint m, const uint* rows) const{  for (uint i = 0; i < m; i++)    block[i] = (*this)(rows[i]);}//-----------------------------------------------------------------------------void uBlasVector::set(const real* block, uint m, const uint* rows){  for (uint i = 0; i < m; i++)    (*this)(rows[i]) = block[i];}//-----------------------------------------------------------------------------void uBlasVector::add(const real* block, uint m, const uint* rows){  for (uint i = 0; i < m; i++)    (*this)(rows[i]) += block[i];}//-----------------------------------------------------------------------------void uBlasVector::apply(){  // Do nothing}//-----------------------------------------------------------------------------void uBlasVector::zero(){  clear();}//-----------------------------------------------------------------------------real uBlasVector::norm(VectorNormType type) const{  switch (type) {  case l1:    return norm_1(*this);  case l2:    return norm_2(*this);  case linf:    return norm_inf(*this);  default:    error("Requested vector norm type for uBlasVector unknown");  }  return norm_inf(*this);}void uBlasVector::div(const uBlasVector& y){  uBlasVector& x = *this;  uint s = size();  for(uint i = 0; i < s; i++)  {    x[i] = x[i] / y[i];  }}//-----------------------------------------------------------------------------void uBlasVector::axpy(real a, const uBlasVector& x){  uBlasVector& y = *this;    y += a * x;}//-----------------------------------------------------------------------------void uBlasVector::mult(real a){  uBlasVector& y = *this;    y *= a;}//-----------------------------------------------------------------------------const uBlasVector& uBlasVector::operator= (real a) {   this->assign(ublas::scalar_vector<double> (this->size(), a));  return *this;}//-----------------------------------------------------------------------------void uBlasVector::disp(uint precision) const{  dolfin::cout << "[ ";  for (ublas_vector::const_iterator it = this->begin(); it != this->end(); ++it)  {    std::stringstream entry;    entry << std::setiosflags(std::ios::scientific);    entry << std::setprecision(precision);    entry << *it << " ";    dolfin::cout << entry.str().c_str() << dolfin::endl;  }  dolfin::cout << " ]";}//-----------------------------------------------------------------------------LogStream& dolfin::operator<< (LogStream& stream, const uBlasVector& x){  // Check if vector has been defined  if ( x.size() == 0 )  {    stream << "[ uBlasVector (empty) ]";    return stream;  }  stream << "[ uBlasVector of size " << x.size() << " ]";  return stream;}//-----------------------------------------------------------------------------#ifdef HAVE_PETSC_Hvoid uBlasVector::copy(const PETScVector& y, uint off1, uint off2, uint len){  // FIXME: Verify if there's a more efficient implementation  uBlasVector& x = *this;  const real* vals = 0;  vals = y.array();  for(uint i = 0; i < len; i++)  {    x[i + off1] = vals[i + off2];  }  y.restore(vals);}#endif//-----------------------------------------------------------------------------void uBlasVector::copy(const uBlasVector& y, uint off1, uint off2, uint len){  uBlasVector& x = *this;  subrange(x, off1, off1 + len) = subrange(y, off2, off2 + len);}//-----------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -