Program Listing for File basis3D.cpp¶
↰ Return to documentation for file (src_qcm/basis3D.cpp)
#include "basis3D.hpp"
#include "matrix.hpp"
basis3D::basis3D(vector<double> _e)
{
trivial();
if(_e.size()%3 or _e.size()>9) qcm_throw("the basis array should have 0, 3, 6 or 9 elements");
size_t D = _e.size()/3;
int j=0;
for(int i=0; i<D; i++){
e[i].x = _e[j++];
e[i].y = _e[j++];
e[i].z = _e[j++];
}
init();
}
//------------------------------------------------------------------------------
void basis3D::init()
{
M.set_size(3);
M(0,0) = e[0].x;
M(1,0) = e[0].y;
M(2,0) = e[0].z;
M(0,1) = e[1].x;
M(1,1) = e[1].y;
M(2,1) = e[1].z;
M(0,2) = e[2].x;
M(1,2) = e[2].y;
M(2,2) = e[2].z;
M.inverse();
vol = triple_product(e[0], e[1], e[2]);
}
//------------------------------------------------------------------------------
void basis3D::inverse()
{
M.set_size(3);
M(0,0) = e[0].x;
M(1,0) = e[0].y;
M(2,0) = e[0].z;
M(0,1) = e[1].x;
M(1,1) = e[1].y;
M(2,1) = e[1].z;
M(0,2) = e[2].x;
M(1,2) = e[2].y;
M(2,2) = e[2].z;
matrix<double> Q(M);
Q.inverse();
e[0].x = Q(0,0);
e[0].y = Q(1,0);
e[0].z = Q(2,0);
e[1].x = Q(0,1);
e[1].y = Q(1,1);
e[1].z = Q(2,1);
e[2].x = Q(0,2);
e[2].y = Q(1,2);
e[2].z = Q(2,2);
vol = triple_product(e[0], e[1], e[2]);
}
//------------------------------------------------------------------------------
vector3D<double> basis3D::to(const vector3D<double>& V)
{
vector3D<double> W;
W = V;
W.transform(M);
return W;
}
//------------------------------------------------------------------------------
vector3D<double> basis3D::from(const vector3D<double>& V)
{
vector3D<double> W;
W.x = V.x*e[0].x + V.y*e[1].x + V.z*e[2].x;
W.y = V.x*e[0].y + V.y*e[1].y + V.z*e[2].y;
W.z = V.x*e[0].z + V.y*e[1].z + V.z*e[2].z;
return W;
}
//------------------------------------------------------------------------------
void basis3D::dual(basis3D &D)
{
double L1 = 2.0*M_PI/vol;
D.e[0] = vector_product(e[1],e[2])*L1;
D.e[1] = vector_product(e[2],e[0])*L1;
D.e[2] = vector_product(e[0],e[1])*L1;
}
//------------------------------------------------------------------------------
std::istream & operator>>(std::istream &flux, basis3D &B){
flux >> B.e[0] >> B.e[1] >> B.e[2];
B.init();
return flux;
}
//------------------------------------------------------------------------------
std::ostream & operator<<(std::ostream &flux, basis3D &B){
flux << B.e[0] << '\n' << B.e[1] << '\n' << B.e[2] << '\n';
return flux;
}