|
pointgrp.h00001 // 00002 // pointgrp.h 00003 // 00004 // Modifications are 00005 // Copyright (C) 1996 Limit Point Systems, Inc. 00006 // 00007 // Author: Edward Seidl <seidl@janed.com> 00008 // Maintainer: LPS 00009 // 00010 // This file is part of the SC Toolkit. 00011 // 00012 // The SC Toolkit is free software; you can redistribute it and/or modify 00013 // it under the terms of the GNU Library General Public License as published by 00014 // the Free Software Foundation; either version 2, or (at your option) 00015 // any later version. 00016 // 00017 // The SC Toolkit is distributed in the hope that it will be useful, 00018 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00019 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00020 // GNU Library General Public License for more details. 00021 // 00022 // You should have received a copy of the GNU Library General Public License 00023 // along with the SC Toolkit; see the file COPYING.LIB. If not, write to 00024 // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 00025 // 00026 // The U.S. Government is granted a limited license as per AL 91-7. 00027 // 00028 00029 /* pointgrp.h -- definition of the point group classes 00030 * 00031 * THIS SOFTWARE FITS THE DESCRIPTION IN THE U.S. COPYRIGHT ACT OF A 00032 * "UNITED STATES GOVERNMENT WORK". IT WAS WRITTEN AS A PART OF THE 00033 * AUTHOR'S OFFICIAL DUTIES AS A GOVERNMENT EMPLOYEE. THIS MEANS IT 00034 * CANNOT BE COPYRIGHTED. THIS SOFTWARE IS FREELY AVAILABLE TO THE 00035 * PUBLIC FOR USE WITHOUT A COPYRIGHT NOTICE, AND THERE ARE NO 00036 * RESTRICTIONS ON ITS USE, NOW OR SUBSEQUENTLY. 00037 * 00038 * Author: 00039 * E. T. Seidl 00040 * Bldg. 12A, Rm. 2033 00041 * Computer Systems Laboratory 00042 * Division of Computer Research and Technology 00043 * National Institutes of Health 00044 * Bethesda, Maryland 20892 00045 * Internet: seidl@alw.nih.gov 00046 * June, 1993 00047 */ 00048 00049 #ifdef __GNUC__ 00050 #pragma interface 00051 #endif 00052 00053 #ifndef _math_symmetry_pointgrp_h 00054 #define _math_symmetry_pointgrp_h 00055 00056 #include <iostream> 00057 00058 #include <util/class/class.h> 00059 #include <util/state/state.h> 00060 #include <util/keyval/keyval.h> 00061 #include <math/scmat/vector3.h> 00062 00063 namespace sc { 00064 00065 // ////////////////////////////////////////////////////////////////// 00066 00070 class SymmetryOperation { 00071 private: 00072 double d[3][3]; 00073 00074 public: 00075 SymmetryOperation(); 00076 SymmetryOperation(const SymmetryOperation &); 00077 ~SymmetryOperation(); 00078 00080 double trace() const { return d[0][0]+d[1][1]+d[2][2]; } 00081 00083 double* operator[](int i) { return d[i]; } 00084 00086 const double* operator[](int i) const { return d[i]; } 00087 00090 double& operator()(int i, int j) { return d[i][j]; } 00091 00093 double operator()(int i, int j) const { return d[i][j]; } 00094 00096 void zero() { memset(d,0,sizeof(double)*9); } 00097 00099 SymmetryOperation operate(const SymmetryOperation& r) const; 00100 00102 SymmetryOperation transform(const SymmetryOperation& r) const; 00103 00105 void unit() { zero(); d[0][0] = d[1][1] = d[2][2] = 1.0; } 00106 00108 void E() { unit(); } 00109 00111 void i() { zero(); d[0][0] = d[1][1] = d[2][2] = -1.0; } 00112 00114 void sigma_h() { unit(); d[2][2] = -1.0; } 00115 00117 void sigma_xz() { unit(); d[1][1] = -1.0; } 00118 00120 void sigma_yz() { unit(); d[0][0] = -1.0; } 00121 00123 void rotation(int n); 00124 void rotation(double theta); 00125 00127 void c2_x() { i(); d[0][0] = 1.0; } 00128 00130 void c2_y() { i(); d[1][1] = 1.0; } 00131 00132 void transpose(); 00133 00135 void print(std::ostream& =ExEnv::out0()) const; 00136 }; 00137 00138 // ////////////////////////////////////////////////////////////////// 00139 00145 class SymRep { 00146 private: 00147 int n; 00148 double d[5][5]; 00149 00150 public: 00151 SymRep(int =0); 00152 SymRep(const SymmetryOperation&); 00153 ~SymRep(); 00154 00156 operator SymmetryOperation() const; 00157 00159 inline double trace() const; 00160 00162 void set_dim(int i) { n=i; } 00163 00165 double* operator[](int i) { return d[i]; } 00167 const double* operator[](int i) const { return d[i]; } 00168 00171 double& operator()(int i, int j) { return d[i][j]; } 00173 double operator()(int i, int j) const { return d[i][j]; } 00174 00176 void zero() { memset(d,0,sizeof(double)*25); } 00177 00179 SymRep operate(const SymRep& r) const; 00180 00182 SymRep transform(const SymRep& r) const; 00183 00185 void unit() { 00186 zero(); d[0][0] = d[1][1] = d[2][2] = d[3][3] = d[4][4] = 1.0; 00187 } 00188 00190 void E() { unit(); } 00191 00193 void i() { zero(); d[0][0] = d[1][1] = d[2][2] = d[3][3] = d[4][4] = -1.0;} 00194 00196 void sigma_h(); 00197 00199 void sigma_xz(); 00200 00202 void sigma_yz(); 00203 00205 void rotation(int n); 00206 void rotation(double theta); 00207 00209 void c2_x(); 00210 00212 void c2_y(); 00213 00215 void print(std::ostream& =ExEnv::out0()) const; 00216 }; 00217 00218 inline double 00219 SymRep::trace() const 00220 { 00221 double r=0; 00222 for (int i=0; i < n; i++) 00223 r += d[i][i]; 00224 return r; 00225 } 00226 00227 // ////////////////////////////////////////////////////////////////// 00228 00229 00230 class CharacterTable; 00231 00239 class IrreducibleRepresentation { 00240 friend class CharacterTable; 00241 00242 private: 00243 int g; // the order of the group 00244 int degen; // the degeneracy of the irrep 00245 int nrot_; // the number of rotations in this irrep 00246 int ntrans_; // the number of translations in this irrep 00247 int complex_; // true if this irrep has a complex representation 00248 char *symb; // mulliken symbol for this irrep 00249 char *csymb; // mulliken symbol for this irrep w/o special characters 00250 00251 SymRep *rep; // representation matrices for the symops 00252 00253 public: 00254 IrreducibleRepresentation(); 00255 IrreducibleRepresentation(const IrreducibleRepresentation&); 00259 IrreducibleRepresentation(int,int,const char*,const char* =0); 00260 00261 ~IrreducibleRepresentation(); 00262 00263 IrreducibleRepresentation& operator=(const IrreducibleRepresentation&); 00264 00266 void init(int =0, int =0, const char* =0, const char* =0); 00267 00269 int order() const { return g; } 00270 00272 int degeneracy() const { return degen; } 00273 00275 int complex() const { return complex_; } 00276 00278 int nproj() const { return degen*degen; } 00279 00281 int nrot() const { return nrot_; } 00282 00284 int ntrans() const { return ntrans_; } 00285 00287 const char * symbol() const { return symb; } 00288 00292 const char * symbol_ns() const { return (csymb?csymb:symb); } 00293 00296 double character(int i) const { 00297 return complex_ ? 0.5*rep[i].trace() : rep[i].trace(); 00298 } 00299 00301 double p(int x1, int x2, int i) const { return rep[i](x1,x2); } 00302 00305 double p(int d, int i) const { 00306 int dc=d/degen; int dr=d%degen; 00307 return rep[i](dr,dc); 00308 } 00309 00313 void print(std::ostream& =ExEnv::out0()) const; 00314 }; 00315 00316 // /////////////////////////////////////////////////////////// 00325 class CharacterTable { 00326 public: 00327 enum pgroups {C1, CS, CI, CN, CNV, CNH, DN, DND, DNH, SN, T, TH, TD, O, 00328 OH, I, IH}; 00329 00330 private: 00331 int g; // the order of the point group 00332 int nt; // order of the princ rot axis 00333 pgroups pg; // the class of the point group 00334 int nirrep_; // the number of irreps in this pg 00335 IrreducibleRepresentation *gamma_; // an array of irreps 00336 SymmetryOperation *symop; // the matrices describing sym ops 00337 int *_inv; // index of the inverse symop 00338 char *symb; // the Schoenflies symbol for the pg 00339 00341 int parse_symbol(); 00343 int make_table(); 00344 00345 // these create the character tables for the cubic groups 00346 void t(); 00347 void th(); 00348 void td(); 00349 void o(); 00350 void oh(); 00351 void i(); 00352 void ih(); 00353 00354 public: 00355 CharacterTable(); 00358 CharacterTable(const char*); 00362 CharacterTable(const char*,const SymmetryOperation&); 00363 00364 CharacterTable(const CharacterTable&); 00365 ~CharacterTable(); 00366 00367 CharacterTable& operator=(const CharacterTable&); 00368 00370 int nirrep() const { return nirrep_; } 00372 int order() const { return g; } 00374 const char * symbol() const { return symb; } 00376 IrreducibleRepresentation& gamma(int i) { return gamma_[i]; } 00378 SymmetryOperation& symm_operation(int i) { return symop[i]; } 00379 00383 int complex() const { 00384 if (pg==CN || pg==SN || pg==CNH || pg==T || pg==TH) 00385 return 1; 00386 return 0; 00387 } 00388 00390 int inverse(int i) const { return _inv[i]; } 00391 00392 int ncomp() const { 00393 int ret=0; 00394 for (int i=0; i < nirrep_; i++) { 00395 int nc = (gamma_[i].complex()) ? 1 : gamma_[i].degen; 00396 ret += nc; 00397 } 00398 return ret; 00399 } 00400 00402 int which_irrep(int i) { 00403 for (int ir=0, cn=0; ir < nirrep_; ir++) { 00404 int nc = (gamma_[ir].complex()) ? 1 : gamma_[ir].degen; 00405 for (int c=0; c < nc; c++,cn++) 00406 if (cn==i) 00407 return ir; 00408 } 00409 return -1; 00410 } 00411 00413 int which_comp(int i) { 00414 for (int ir=0, cn=0; ir < nirrep_; ir++) { 00415 int nc = (gamma_[ir].complex()) ? 1 : gamma_[ir].degen; 00416 for (int c=0; c < nc; c++,cn++) 00417 if (cn==i) 00418 return c; 00419 } 00420 return -1; 00421 } 00422 00424 void print(std::ostream& =ExEnv::out0()) const; 00425 }; 00426 00427 // /////////////////////////////////////////////////////////// 00428 00436 class PointGroup: public SavableState { 00437 private: 00438 char *symb; 00439 SymmetryOperation frame; 00440 SCVector3 origin_; 00441 00442 public: 00443 PointGroup(); 00446 PointGroup(const char*); 00449 PointGroup(const char*,SymmetryOperation&); 00452 PointGroup(const char*,SymmetryOperation&,const SCVector3&); 00487 PointGroup(const Ref<KeyVal>&); 00488 00489 PointGroup(StateIn&); 00490 PointGroup(const PointGroup&); 00491 PointGroup(const Ref<PointGroup>&); 00492 ~PointGroup(); 00493 00494 PointGroup& operator=(const PointGroup&); 00495 00497 int equiv(const Ref<PointGroup> &, double tol = 1.0e-6) const; 00498 00500 CharacterTable char_table() const; 00502 const char * symbol() const { return symb; } 00504 SymmetryOperation& symm_frame() { return frame; } 00506 const SymmetryOperation& symm_frame() const { return frame; } 00508 SCVector3& origin() { return origin_; } 00509 const SCVector3& origin() const { return origin_; } 00510 00512 void set_symbol(const char*); 00513 00514 void save_data_state(StateOut& so); 00515 00516 void print(std::ostream&o=ExEnv::out0()) const; 00517 }; 00518 00519 } 00520 00521 #endif 00522 00523 // Local Variables: 00524 // mode: c++ 00525 // c-file-style: "ETS" 00526 // End: Generated at Fri Jan 10 08:14:09 2003 for MPQC 2.1.3 using the documentation package Doxygen 1.2.14. |