1#ifndef PSCF_UNIT_CELL_BASE_H
2#define PSCF_UNIT_CELL_BASE_H
11#include <util/containers/FArray.h>
12#include <util/containers/FSArray.h>
13#include <util/containers/FMatrix.h>
14#include <pscf/math/IntVec.h>
15#include <pscf/math/RealVec.h>
16#include <util/math/Constants.h>
220 void initializeToZero();
229 virtual void setBasis() = 0;
234 void computeDerivatives();
244 {
return nParameter_; }
254 for (
int i = 0; i < nParameter_; ++i) {
255 parameters.
append(parameters_[i]);
266 {
return parameters_[i]; }
274 {
return rBasis_[i]; }
282 {
return kBasis_[i]; }
290 {
return drBasis_[k](i,j); }
298 {
return dkBasis_[k](i, j); }
306 {
return dkkBasis_[k](i, j); }
314 {
return drrBasis_[k](i, j); }
324 isInitialized_(false)
341 isInitialized_ =
false;
342 for (
int i = 0; i < nParameter_; ++i) {
343 parameters_[i] = parameters[i];
356 for (
int i = 0; i < D; ++i) {
361 for (
int i = 0; i < D; ++i) {
373 double element = 0.0;
376 for (
int p = 0; p < D; ++p){
377 for (
int q = 0; q < D; ++q){
378 element = dkkBasis(n, p, q);
379 value += vec[p]*vec[q]*element;
396 for (i = 0; i < D; ++i) {
397 for (j = 0; j < D; ++j) {
402 for (k = 0; k < 6; ++k){
403 for (i = 0; i < D; ++i) {
404 for (j = 0; j < D; ++j) {
405 drBasis_[k](i,j) = 0.0;
406 dkBasis_[k](i,j) = 0.0;
407 drrBasis_[k](i,j) = 0.0;
408 dkkBasis_[k](i,j) = 0.0;
418 void UnitCellBase<D>::computeDerivatives()
422 for (p = 0; p < nParameter_; ++p) {
423 for (q = 0; q < D; ++q) {
424 for (r = 0; r < D; ++r) {
427 for (s = 0; s < D; ++s) {
428 for (t = 0; t < D; ++t) {
430 -= kBasis_[q][s]*drBasis_[p](t,s)*kBasis_[t][r];
440 for (p = 0; p < nParameter_; ++p) {
441 for (q = 0; q < D; ++q) {
442 for (r = 0; r < D; ++r) {
443 for (s = 0; s < D; ++s) {
444 drrBasis_[p](q,r) += rBasis_[q][s]*drBasis_[p](r,s);
445 drrBasis_[p](q,r) += rBasis_[r][s]*drBasis_[p](q,s);
446 dkkBasis_[p](q,r) += kBasis_[q][s]*dkBasis_[p](r,s);
447 dkkBasis_[p](q,r) += kBasis_[r][s]*dkBasis_[p](q,s);
464 computeDerivatives();
465 isInitialized_ =
true;
An IntVec<D, T> is a D-component vector of elements of integer type T.
A RealVec<D, T> is D-component vector with elements of floating type T.
Base class template for a crystallographic unit cell.
FArray< FMatrix< double, D, D >, 6 > drrBasis_
Array of derivatives of a_i.a_j.
FArray< FMatrix< double, D, D >, 6 > drBasis_
Array of derivatives of rBasis.
int nParameter_
Number of parameters required to specify unit cell.
FArray< double, 6 > parameters_
Parameters used to describe the unit cell.
int nParameter() const
Get the number of parameters in the unit cell.
virtual double dksq(IntVec< D > const &vec, int n) const
Compute derivative of square wavevector w/respect to cell parameter.
const RealVec< D > & kBasis(int i) const
Get reciprocal basis vector i, denoted by b_i.
FArray< FMatrix< double, D, D >, 6 > dkBasis_
Array of derivatives of kBasis.
void setParameters(FSArray< double, 6 > const ¶meters)
Set all the parameters of unit cell.
double drrBasis(int k, int i, int j) const
Get derivative of dot product ai.aj with respect to parameter k.
FArray< FMatrix< double, D, D >, 6 > dkkBasis_
Array of derivatives of b_i.b_j.
void setLattice()
Compute all private data, given latticeSystem and parameters.
virtual double ksq(IntVec< D > const &k) const
Compute square magnitude of reciprocal lattice vector.
~UnitCellBase()
Destructor.
bool isInitialized_
Has this unit cell been fully initialized?
bool isInitialized() const
Has this unit cell been initialized?
double dkBasis(int k, int i, int j) const
Get component j of derivative of kBasis vector b_i w/respect to k.
double parameter(int i) const
Get a single parameter of this unit cell.
FArray< RealVec< D >, D > rBasis_
Array of Bravais lattice basis vectors.
FSArray< double, 6 > parameters() const
Get the parameters of this unit cell.
UnitCellBase()
Constructor.
double dkkBasis(int k, int i, int j) const
Get derivative of dot product bi.bj with respect to parameter k.
double drBasis(int k, int i, int j) const
Get component j of derivative of rBasis vector a_i w/respect to k.
const RealVec< D > & rBasis(int i) const
Get Bravais basis vector i, denoted by a_i.
FArray< RealVec< D >, D > kBasis_
Array of reciprocal lattice basis vectors.
Vec< D, T > & multiply(const Vec< D, T > &v, T s)
Multiply a vector v by a scalar s.
static const double Pi
Trigonometric constant Pi.
A fixed size (static) contiguous array template.
A fixed capacity (static) contiguous array with a variable logical size.
int size() const
Return logical size of this array (i.e., number of elements).
void append(Data const &data)
Append data to the end of the array.
#define UTIL_CHECK(condition)
Assertion macro suitable for serial or parallel production code.
C++ namespace for polymer self-consistent field theory (PSCF).
Utility classes for scientific computation.