A second quantized operator consists of an orbital and a "gender" (creator or annihilator):
Interface: SQOperator.H
1 #include <string> 2 #include <iostream> 3 4 using namespace std; 5 6 7 /*! 8 Implements a second quantized creation \[ \hat a_i^\dagger \] 9 or annihilation \[ \hat a_i \] operator 10 */ 11 class SQOperator { 12 public: 13 //! enumerate operator types 14 enum Gender { Creator, Annihilator }; 15 16 //! short cut constructor from character (upper case: creator, lower case annihilator) 17 SQOperator(char c); 18 19 //! construct from gender and character (capital does not matter) 20 SQOperator(Gender gender, char orb); 21 22 23 //! return gender 24 Gender gender() const; 25 26 //! return orbital 27 char orb() const; 28 29 30 //! check equality 31 bool operator == (SQOperator const & o) const; 32 //! "artificial" ordering relation (for sorting purposes) 33 bool operator < (SQOperator const & o) const; 34 35 private: 36 Gender _gender; 37 char _orb; 38 }; 39 40 ostream & operator << (ostream & o, SQOperator const & op);Implementation: SQOperator.C
1 #include "SQOperator.H" 2 3 4 5 SQOperator::SQOperator(char c) : 6 _gender(isupper(c) ? Creator : Annihilator), _orb(tolower(c)) {} 7 8 SQOperator::SQOperator(Gender gender, char orb) : 9 _gender(gender), _orb(orb) {} 10 11 SQOperator::Gender SQOperator::gender() const 12 { return _gender; } 13 14 char SQOperator::orb() const 15 { return _orb; } 16 17 18 bool SQOperator::operator == (SQOperator const & o) const 19 { return _gender==o._gender && _orb==o._orb; } 20 21 bool SQOperator::operator < (SQOperator const & o) const 22 { 23 if ( _gender<o._gender ) 24 return true; 25 if ( o._gender<_gender ) 26 return false; 27 return _orb<o._orb; 28 } 29 30 31 ostream & operator << (ostream & o, SQOperator const & op) 32 { 33 if ( op.gender()==SQOperator::Creator ) 34 o << static_cast<char>(toupper(op.orb())); 35 else 36 o << static_cast<char>(tolower(op.orb())); 37 return o; 38 }
Let's test it: SQOperator_Test.C
1 #include "SQOperator.H" 2 3 int main() 4 { 5 SQOperator op(SQOperator::Creator, 'i'); // test construtor 6 7 cout << op << endl; 8 9 10 SQOperator op1('u'); // annihilator orbital "u" 11 SQOperator op2('A'); // creator orbital "A" 12 13 cout << op1 << op2 << endl; 14 return 0; 15 }The output is (download files into a fresh directory, compile and link with g++ *.C, run a.out)
I uAOkay. Still trivial. Be patient...