00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
#if defined(__GNUC__)
00029
#pragma interface
00030
#endif
00031
00032
#ifndef _chemistry_qc_basis_transform_h
00033
#define _chemistry_qc_basis_transform_h
00034
00035
namespace sc {
00036
00037
00038
00041 class SphericalTransformComponent {
00042
protected:
00043
double coef_;
00044
int a_, b_, c_, cartindex_, pureindex_;
00045
00046
public:
00048 int a()
const {
return a_; }
00050 int b()
const {
return b_; }
00052 int c()
const {
return c_; }
00054 int cartindex()
const {
return cartindex_; }
00056 int pureindex()
const {
return pureindex_; }
00058 double coef()
const {
return coef_; }
00059
00068
virtual void init(
int a,
int b,
int c,
double coef,
int pureindex) =0;
00069 };
00070
00071
00072
00075 class SphericalTransform {
00076
protected:
00077
int n_;
00078
int l_;
00079
int subl_;
00080
SphericalTransformComponent *components_;
00081
00082
SphericalTransform();
00083
00091
SphericalTransform(
int l,
int subl = -1);
00092
00097
virtual void init();
00098
00099
public:
00100
virtual ~
SphericalTransform();
00101
00103
void add(
int a,
int b,
int c,
double coef,
int pureindex);
00104
00106 int cartindex(
int i)
const {
return components_[i].
cartindex(); }
00108 int pureindex(
int i)
const {
return components_[i].
pureindex(); }
00110 double coef(
int i)
const {
return components_[i].
coef(); }
00112 int a(
int i)
const {
return components_[i].
a(); }
00114 int b(
int i)
const {
return components_[i].
b(); }
00116 int c(
int i)
const {
return components_[i].
c(); }
00118 int l()
const {
return l_; }
00120 int n()
const {
return n_; }
00121
00124
virtual SphericalTransformComponent *
new_components() = 0;
00125 };
00126
00128 class ISphericalTransform:
public SphericalTransform {
00129
protected:
00130
ISphericalTransform();
00131
ISphericalTransform(
int l,
int subl=-1);
00132
void init();
00133 };
00134
00135
00136
00138 class SphericalTransformIter {
00139
private:
00140
int i_;
00141
00142
protected:
00143
const SphericalTransform *transform_;
00144
00145
public:
00146
SphericalTransformIter();
00147
SphericalTransformIter(
const SphericalTransform*);
00148
00149
void begin() { i_ = 0; }
00150
void start() { begin(); }
00151
void next() { i_++; }
00152
int ready() {
return i_ < transform_->
n(); }
00153 operator int() {
return ready(); }
00154
int l() {
return transform_->
l(); }
00155
int cartindex() {
return transform_->
cartindex(i_); }
00156
int pureindex() {
return transform_->
pureindex(i_); }
00157
int bfn() {
return pureindex(); }
00158
double coef() {
return transform_->
coef(i_); }
00159
int a() {
return transform_->
a(i_); }
00160
int b() {
return transform_->
b(i_); }
00161
int c() {
return transform_->
c(i_); }
00162
int l(
int i) {
return i?(i==1?b():c()):a(); }
00163
int n() {
return 2*l() + 1; }
00164 };
00165
00166 }
00167
00168
#endif
00169
00170
00171
00172
00173