| [0b990d] | 1 | //
 | 
|---|
 | 2 | // maketab.cc
 | 
|---|
 | 3 | //
 | 
|---|
 | 4 | // Modifications are
 | 
|---|
 | 5 | // Copyright (C) 1996 Limit Point Systems, Inc.
 | 
|---|
 | 6 | //
 | 
|---|
 | 7 | // Author: Edward Seidl <seidl@janed.com>
 | 
|---|
 | 8 | // Maintainer: LPS
 | 
|---|
 | 9 | //
 | 
|---|
 | 10 | // This file is part of the SC Toolkit.
 | 
|---|
 | 11 | //
 | 
|---|
 | 12 | // The SC Toolkit is free software; you can redistribute it and/or modify
 | 
|---|
 | 13 | // it under the terms of the GNU Library General Public License as published by
 | 
|---|
 | 14 | // the Free Software Foundation; either version 2, or (at your option)
 | 
|---|
 | 15 | // any later version.
 | 
|---|
 | 16 | //
 | 
|---|
 | 17 | // The SC Toolkit is distributed in the hope that it will be useful,
 | 
|---|
 | 18 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
|---|
 | 19 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
|---|
 | 20 | // GNU Library General Public License for more details.
 | 
|---|
 | 21 | //
 | 
|---|
 | 22 | // You should have received a copy of the GNU Library General Public License
 | 
|---|
 | 23 | // along with the SC Toolkit; see the file COPYING.LIB.  If not, write to
 | 
|---|
 | 24 | // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 | 
|---|
 | 25 | //
 | 
|---|
 | 26 | // The U.S. Government is granted a limited license as per AL 91-7.
 | 
|---|
 | 27 | //
 | 
|---|
 | 28 | 
 | 
|---|
 | 29 | /* maketab.cc
 | 
|---|
 | 30 |  *
 | 
|---|
 | 31 |  *      THIS SOFTWARE FITS THE DESCRIPTION IN THE U.S. COPYRIGHT ACT OF A
 | 
|---|
 | 32 |  *      "UNITED STATES GOVERNMENT WORK".  IT WAS WRITTEN AS A PART OF THE
 | 
|---|
 | 33 |  *      AUTHOR'S OFFICIAL DUTIES AS A GOVERNMENT EMPLOYEE.  THIS MEANS IT
 | 
|---|
 | 34 |  *      CANNOT BE COPYRIGHTED.  THIS SOFTWARE IS FREELY AVAILABLE TO THE
 | 
|---|
 | 35 |  *      PUBLIC FOR USE WITHOUT A COPYRIGHT NOTICE, AND THERE ARE NO
 | 
|---|
 | 36 |  *      RESTRICTIONS ON ITS USE, NOW OR SUBSEQUENTLY.
 | 
|---|
 | 37 |  *
 | 
|---|
 | 38 |  *  Author:
 | 
|---|
 | 39 |  *      E. T. Seidl
 | 
|---|
 | 40 |  *      Bldg. 12A, Rm. 2033
 | 
|---|
 | 41 |  *      Computer Systems Laboratory
 | 
|---|
 | 42 |  *      Division of Computer Research and Technology
 | 
|---|
 | 43 |  *      National Institutes of Health
 | 
|---|
 | 44 |  *      Bethesda, Maryland 20892
 | 
|---|
 | 45 |  *      Internet: seidl@alw.nih.gov
 | 
|---|
 | 46 |  *      June, 1993
 | 
|---|
 | 47 |  */
 | 
|---|
 | 48 | 
 | 
|---|
 | 49 | #include <util/misc/math.h>
 | 
|---|
 | 50 | #include <stdio.h>
 | 
|---|
 | 51 | #include <string.h>
 | 
|---|
 | 52 | 
 | 
|---|
 | 53 | #include <math/symmetry/pointgrp.h>
 | 
|---|
 | 54 | #include <util/misc/formio.h>
 | 
|---|
 | 55 | 
 | 
|---|
 | 56 | using namespace std;
 | 
|---|
 | 57 | using namespace sc;
 | 
|---|
 | 58 | 
 | 
|---|
 | 59 | /*
 | 
|---|
 | 60 |  * This function will generate a character table for the point group.
 | 
|---|
 | 61 |  * This character table is in the order that symmetry operations are
 | 
|---|
 | 62 |  * generated, not in Cotton order. If this is a problem, tough.
 | 
|---|
 | 63 |  * Also generate the transformation matrices.
 | 
|---|
 | 64 |  */
 | 
|---|
 | 65 | 
 | 
|---|
 | 66 | int CharacterTable::make_table()
 | 
|---|
 | 67 | {
 | 
|---|
 | 68 |   int i,j,ei,gi;
 | 
|---|
 | 69 |   char label[4];
 | 
|---|
 | 70 | 
 | 
|---|
 | 71 |   if (!g) return 0;
 | 
|---|
 | 72 | 
 | 
|---|
 | 73 |   gamma_ = new IrreducibleRepresentation[nirrep_];
 | 
|---|
 | 74 | 
 | 
|---|
 | 75 |   symop = new SymmetryOperation[g];
 | 
|---|
 | 76 |   SymmetryOperation so;
 | 
|---|
 | 77 | 
 | 
|---|
 | 78 |   _inv = new int[g];
 | 
|---|
 | 79 |   
 | 
|---|
 | 80 |   // this array forms a reducible representation for rotations about x,y,z
 | 
|---|
 | 81 |   double *rot = new double[g];
 | 
|---|
 | 82 |   memset(rot,0,sizeof(double)*g);
 | 
|---|
 | 83 | 
 | 
|---|
 | 84 |   // this array forms a reducible representation for translations along x,y,z
 | 
|---|
 | 85 |   double *trans = new double[g];
 | 
|---|
 | 86 |   memset(trans,0,sizeof(double)*g);
 | 
|---|
 | 87 | 
 | 
|---|
 | 88 |   // the angle to rotate about the principal axis
 | 
|---|
 | 89 |   double theta = (nt) ? 2.0*M_PI/nt : 2.0*M_PI;
 | 
|---|
 | 90 | 
 | 
|---|
 | 91 |   switch (pg) {
 | 
|---|
 | 92 | 
 | 
|---|
 | 93 |   case C1:
 | 
|---|
 | 94 |     // no symmetry case
 | 
|---|
 | 95 |     gamma_[0].init(1,1,"A");
 | 
|---|
 | 96 |     gamma_[0].nrot_ = 3;
 | 
|---|
 | 97 |     gamma_[0].ntrans_ = 3;
 | 
|---|
 | 98 |     gamma_[0].rep[0][0][0] = 1.0;
 | 
|---|
 | 99 | 
 | 
|---|
 | 100 |     symop[0].E();
 | 
|---|
 | 101 | 
 | 
|---|
 | 102 |     break;
 | 
|---|
 | 103 | 
 | 
|---|
 | 104 |   case CI:
 | 
|---|
 | 105 |     // equivalent to S2 about the z axis
 | 
|---|
 | 106 |     gamma_[0].init(2,1,"Ag");
 | 
|---|
 | 107 |     gamma_[0].rep[0][0][0] = 1.0;
 | 
|---|
 | 108 |     gamma_[0].rep[1][0][0] = 1.0;
 | 
|---|
 | 109 |     gamma_[0].nrot_=3;
 | 
|---|
 | 110 | 
 | 
|---|
 | 111 |     gamma_[1].init(2,1,"Au");
 | 
|---|
 | 112 |     gamma_[1].rep[0][0][0] =  1.0;
 | 
|---|
 | 113 |     gamma_[1].rep[1][0][0] = -1.0;
 | 
|---|
 | 114 |     gamma_[1].ntrans_=3;
 | 
|---|
 | 115 | 
 | 
|---|
 | 116 |     symop[0].E();
 | 
|---|
 | 117 |     symop[1].i();
 | 
|---|
 | 118 | 
 | 
|---|
 | 119 |     break;
 | 
|---|
 | 120 | 
 | 
|---|
 | 121 |   case CS: // reflection through the xy plane
 | 
|---|
 | 122 |     gamma_[0].init(2,1,"A'","Ap");
 | 
|---|
 | 123 |     gamma_[0].rep[0][0][0] = 1.0;
 | 
|---|
 | 124 |     gamma_[0].rep[1][0][0] = 1.0;
 | 
|---|
 | 125 |     gamma_[0].nrot_=1;
 | 
|---|
 | 126 |     gamma_[0].ntrans_=2;
 | 
|---|
 | 127 | 
 | 
|---|
 | 128 |     gamma_[1].init(2,1,"A\"","App");
 | 
|---|
 | 129 |     gamma_[1].rep[0][0][0] =  1.0;
 | 
|---|
 | 130 |     gamma_[1].rep[1][0][0] = -1.0;
 | 
|---|
 | 131 |     gamma_[1].nrot_=2;
 | 
|---|
 | 132 |     gamma_[1].ntrans_=1;
 | 
|---|
 | 133 | 
 | 
|---|
 | 134 |     symop[0].E();
 | 
|---|
 | 135 |     symop[1].sigma_h();
 | 
|---|
 | 136 | 
 | 
|---|
 | 137 |     break;
 | 
|---|
 | 138 | 
 | 
|---|
 | 139 |   case CN:
 | 
|---|
 | 140 |     // clockwise rotation about z axis by theta*i radians
 | 
|---|
 | 141 |     //
 | 
|---|
 | 142 |     // for odd n, the irreps are A and E1...E(nir-1)
 | 
|---|
 | 143 |     // for even n, the irreps are A, B, and E1...E(nir-2)
 | 
|---|
 | 144 |     //
 | 
|---|
 | 145 |     gamma_[0].init(g,1,"A");
 | 
|---|
 | 146 |     for (gi=0; gi < g; gi++)
 | 
|---|
 | 147 |       gamma_[0].rep[gi][0][0] = 1.0;
 | 
|---|
 | 148 | 
 | 
|---|
 | 149 |     i=1;
 | 
|---|
 | 150 | 
 | 
|---|
 | 151 |     if (!(nt%2)) {
 | 
|---|
 | 152 |       gamma_[1].init(g,1,"B");
 | 
|---|
 | 153 |       for (gi=0; gi < g; gi++)
 | 
|---|
 | 154 |         gamma_[1].rep[gi][0][0] = (gi%2) ? -1.0 : 1.0;
 | 
|---|
 | 155 | 
 | 
|---|
 | 156 |       i++;
 | 
|---|
 | 157 |     }
 | 
|---|
 | 158 | 
 | 
|---|
 | 159 |     ei=1;
 | 
|---|
 | 160 |     for (; i < nirrep_; i++, ei++) {
 | 
|---|
 | 161 |       IrreducibleRepresentation& ir = gamma_[i];
 | 
|---|
 | 162 | 
 | 
|---|
 | 163 |       if (nt==3 || nt==4)
 | 
|---|
 | 164 |         sprintf(label,"E");
 | 
|---|
 | 165 |       else
 | 
|---|
 | 166 |         sprintf(label,"E%d",ei);
 | 
|---|
 | 167 | 
 | 
|---|
 | 168 |       ir.init(g,2,label);
 | 
|---|
 | 169 |       ir.complex_=1;
 | 
|---|
 | 170 | 
 | 
|---|
 | 171 |       // identity
 | 
|---|
 | 172 |       ir.rep[0].E();
 | 
|---|
 | 173 | 
 | 
|---|
 | 174 |       // Cn
 | 
|---|
 | 175 |       ir.rep[1].rotation(ei*theta);
 | 
|---|
 | 176 | 
 | 
|---|
 | 177 |       // the other n-1 Cn's
 | 
|---|
 | 178 |       for (j=2; j < g; j++)
 | 
|---|
 | 179 |         ir.rep[j] = ir.rep[j-1].operate(ir.rep[1]);
 | 
|---|
 | 180 |     }
 | 
|---|
 | 181 | 
 | 
|---|
 | 182 |     // identity
 | 
|---|
 | 183 |     symop[0].E();
 | 
|---|
 | 184 | 
 | 
|---|
 | 185 |     // Cn
 | 
|---|
 | 186 |     symop[1].rotation(theta);
 | 
|---|
 | 187 |     
 | 
|---|
 | 188 |     // the other n-2 Cn's
 | 
|---|
 | 189 |     for (i=2; i < nt; i++)
 | 
|---|
 | 190 |       symop[i] = symop[i-1].operate(symop[1]);
 | 
|---|
 | 191 |     
 | 
|---|
 | 192 |     for (i=0; i < nt ; i++)
 | 
|---|
 | 193 |       rot[i] = trans[i] = symop[i].trace();
 | 
|---|
 | 194 | 
 | 
|---|
 | 195 |     break;
 | 
|---|
 | 196 | 
 | 
|---|
 | 197 |   case CNV:
 | 
|---|
 | 198 |     // clockwise rotation about z axis by theta*i radians, then
 | 
|---|
 | 199 |     // reflect through the xz plane
 | 
|---|
 | 200 |     //
 | 
|---|
 | 201 |     // for odd n, the irreps are A1, A2, and E1...E(nir-2)
 | 
|---|
 | 202 |     // for even n, the irreps are A1, A2, B1, B2, and E1...E(nir-4)
 | 
|---|
 | 203 |     //
 | 
|---|
 | 204 | 
 | 
|---|
 | 205 |     gamma_[0].init(g,1,"A1");
 | 
|---|
 | 206 |     gamma_[1].init(g,1,"A2");
 | 
|---|
 | 207 | 
 | 
|---|
 | 208 |     for (gi=0; gi < nt; gi++) {
 | 
|---|
 | 209 |       // Cn's
 | 
|---|
 | 210 |       gamma_[0].rep[gi][0][0] = 1.0;
 | 
|---|
 | 211 |       gamma_[1].rep[gi][0][0] = 1.0;
 | 
|---|
 | 212 | 
 | 
|---|
 | 213 |       // sigma's
 | 
|---|
 | 214 |       gamma_[0].rep[gi+nt][0][0] =  1.0;
 | 
|---|
 | 215 |       gamma_[1].rep[gi+nt][0][0] = -1.0;
 | 
|---|
 | 216 |     }
 | 
|---|
 | 217 | 
 | 
|---|
 | 218 |     if (!(nt%2)) {
 | 
|---|
 | 219 |       gamma_[2].init(g,1,"B1");
 | 
|---|
 | 220 |       gamma_[3].init(g,1,"B2");
 | 
|---|
 | 221 | 
 | 
|---|
 | 222 |       for (gi=0; gi < nt ; gi++) {
 | 
|---|
 | 223 |         double ci = (gi%2) ? -1.0 : 1.0;
 | 
|---|
 | 224 |         
 | 
|---|
 | 225 |         // Cn's
 | 
|---|
 | 226 |         gamma_[2].rep[gi][0][0] = ci;
 | 
|---|
 | 227 |         gamma_[3].rep[gi][0][0] = ci;
 | 
|---|
 | 228 | 
 | 
|---|
 | 229 |         // sigma's
 | 
|---|
 | 230 |         gamma_[2].rep[gi+nt][0][0] =  ci;
 | 
|---|
 | 231 |         gamma_[3].rep[gi+nt][0][0] = -ci;
 | 
|---|
 | 232 |       }
 | 
|---|
 | 233 |     }
 | 
|---|
 | 234 |     
 | 
|---|
 | 235 |     ei=1;
 | 
|---|
 | 236 |     for (i = (nt%2) ? 2 : 4; i < nirrep_; i++, ei++) {
 | 
|---|
 | 237 |       IrreducibleRepresentation& ir = gamma_[i];
 | 
|---|
 | 238 | 
 | 
|---|
 | 239 |       char lab[4];
 | 
|---|
 | 240 |       if (nt==3 || nt==4)
 | 
|---|
 | 241 |         sprintf(lab,"E");
 | 
|---|
 | 242 |       else
 | 
|---|
 | 243 |         sprintf(lab,"E%d",ei);
 | 
|---|
 | 244 | 
 | 
|---|
 | 245 |       ir.init(g,2,lab);
 | 
|---|
 | 246 | 
 | 
|---|
 | 247 |       // identity
 | 
|---|
 | 248 |       ir.rep[0].E();
 | 
|---|
 | 249 | 
 | 
|---|
 | 250 |       // Cn
 | 
|---|
 | 251 |       ir.rep[1].rotation(ei*theta);
 | 
|---|
 | 252 | 
 | 
|---|
 | 253 |       // the other n-2 Cn's
 | 
|---|
 | 254 |       for (j=2; j < nt; j++)
 | 
|---|
 | 255 |         ir.rep[j] = ir.rep[j-1].operate(ir.rep[1]);
 | 
|---|
 | 256 |       
 | 
|---|
 | 257 |       // sigma xz
 | 
|---|
 | 258 |       ir.rep[nt].sigma_xz();
 | 
|---|
 | 259 | 
 | 
|---|
 | 260 |       SymRep sr(2);
 | 
|---|
 | 261 |       sr.rotation(ei*theta/2.0);
 | 
|---|
 | 262 |       
 | 
|---|
 | 263 |       // the other n-1 sigma's
 | 
|---|
 | 264 |       for (j=nt+1; j < g; j++)
 | 
|---|
 | 265 |         ir.rep[j] = ir.rep[j-1].transform(sr);
 | 
|---|
 | 266 |     }
 | 
|---|
 | 267 | 
 | 
|---|
 | 268 |     // identity
 | 
|---|
 | 269 |     symop[0].E();
 | 
|---|
 | 270 |     
 | 
|---|
 | 271 |     // Cn
 | 
|---|
 | 272 |     symop[1].rotation(theta);
 | 
|---|
 | 273 |     
 | 
|---|
 | 274 |     // the other n-2 Cn's
 | 
|---|
 | 275 |     for (i=2; i < nt; i++)
 | 
|---|
 | 276 |       symop[i] = symop[i-1].operate(symop[1]);
 | 
|---|
 | 277 |     
 | 
|---|
 | 278 |     // sigma xz
 | 
|---|
 | 279 |     symop[nt].sigma_xz();
 | 
|---|
 | 280 | 
 | 
|---|
 | 281 |     so.rotation(theta/2.0);
 | 
|---|
 | 282 | 
 | 
|---|
 | 283 |     // the other n-1 sigma's
 | 
|---|
 | 284 |     for (j=nt+1; j < g; j++)
 | 
|---|
 | 285 |       symop[j] = symop[j-1].transform(so);
 | 
|---|
 | 286 | 
 | 
|---|
 | 287 |     for (i=0; i < nt ; i++) {
 | 
|---|
 | 288 |       rot[i] = trans[i] = symop[i].trace();
 | 
|---|
 | 289 | 
 | 
|---|
 | 290 |       rot[i+nt] = -symop[i+nt].trace();
 | 
|---|
 | 291 |       trans[i+nt] = symop[i+nt].trace();
 | 
|---|
 | 292 |     }
 | 
|---|
 | 293 |     
 | 
|---|
 | 294 |     break;
 | 
|---|
 | 295 | 
 | 
|---|
 | 296 |   case CNH:
 | 
|---|
 | 297 |     // lockwise rotation about z axis by theta*i radians,
 | 
|---|
 | 298 |     // as well as rotation-reflection about same axis
 | 
|---|
 | 299 | 
 | 
|---|
 | 300 |     //
 | 
|---|
 | 301 |     // for odd n, the irreps are A', A", E1'...E(nir/2-1)', E1"...E(nir/2-1)''
 | 
|---|
 | 302 |     // for even n, the irreps are Ag, Bg, Au, Bu,
 | 
|---|
 | 303 |     //                            E1g...E(nir/2-1)g, E1u...E(nir/2-1)u
 | 
|---|
 | 304 |     //
 | 
|---|
 | 305 |     gamma_[0].init(g,1, (nt%2) ? "A'" : "Ag", (nt%2) ? "Ap" : 0);
 | 
|---|
 | 306 |     gamma_[nirrep_/2].init(g,1, (nt%2) ? "A\"" : "Au", (nt%2) ? "Ap" : 0);
 | 
|---|
 | 307 | 
 | 
|---|
 | 308 |     for (gi=0; gi < nt; gi++) {
 | 
|---|
 | 309 |       // Cn's
 | 
|---|
 | 310 |       gamma_[0].rep[gi][0][0] = 1.0;
 | 
|---|
 | 311 |       gamma_[nirrep_/2].rep[gi][0][0] = 1.0;
 | 
|---|
 | 312 | 
 | 
|---|
 | 313 |       // Sn's
 | 
|---|
 | 314 |       gamma_[0].rep[gi+nt][0][0] = 1.0;
 | 
|---|
 | 315 |       gamma_[nirrep_/2].rep[gi+nt][0][0] = -1.0;
 | 
|---|
 | 316 |     }
 | 
|---|
 | 317 | 
 | 
|---|
 | 318 |     if (!(nt%2)) {
 | 
|---|
 | 319 |       gamma_[1].init(g,1,"Bg");
 | 
|---|
 | 320 |       gamma_[1+nirrep_/2].init(g,1,"Bu");
 | 
|---|
 | 321 | 
 | 
|---|
 | 322 |       for (gi=0; gi < nt; gi++) {
 | 
|---|
 | 323 |         double ci = (gi%2) ? -1.0 : 1.0;
 | 
|---|
 | 324 | 
 | 
|---|
 | 325 |         // Cn's
 | 
|---|
 | 326 |         gamma_[1].rep[gi][0][0] = ci;
 | 
|---|
 | 327 |         gamma_[1+nirrep_/2].rep[gi][0][0] = ci;
 | 
|---|
 | 328 |       
 | 
|---|
 | 329 |         // Sn's
 | 
|---|
 | 330 |         gamma_[1].rep[gi+nt][0][0] =  ci;
 | 
|---|
 | 331 |         gamma_[1+nirrep_/2].rep[gi+nt][0][0] = -ci;
 | 
|---|
 | 332 |       }
 | 
|---|
 | 333 |     }
 | 
|---|
 | 334 | 
 | 
|---|
 | 335 |     ei=1;
 | 
|---|
 | 336 |     for (i = (nt%2) ? 1 : 2; i < nirrep_/2 ; i++, ei++) {
 | 
|---|
 | 337 |       IrreducibleRepresentation& ir1 = gamma_[i];
 | 
|---|
 | 338 |       IrreducibleRepresentation& ir2 = gamma_[i+nirrep_/2];
 | 
|---|
 | 339 | 
 | 
|---|
 | 340 |       if (nt==3 || nt==4)
 | 
|---|
 | 341 |         sprintf(label,(nt%2) ? "E'" : "Eg");
 | 
|---|
 | 342 |       else
 | 
|---|
 | 343 |         sprintf(label,"E%d%s", ei, (nt%2) ? "'" : "g");
 | 
|---|
 | 344 | 
 | 
|---|
 | 345 |       ir1.init(g,2,label);
 | 
|---|
 | 346 | 
 | 
|---|
 | 347 |       if (nt==3 || nt==4)
 | 
|---|
 | 348 |         sprintf(label,(nt%2) ? "E\"" : "Eu");
 | 
|---|
 | 349 |       else
 | 
|---|
 | 350 |         sprintf(label,"E%d%s", ei, (nt%2) ? "\"" : "u");
 | 
|---|
 | 351 | 
 | 
|---|
 | 352 |       ir2.init(g,2,label);
 | 
|---|
 | 353 | 
 | 
|---|
 | 354 |       ir1.complex_=1;
 | 
|---|
 | 355 |       ir2.complex_=1;
 | 
|---|
 | 356 | 
 | 
|---|
 | 357 |       // identity
 | 
|---|
 | 358 |       ir1.rep[0].E();
 | 
|---|
 | 359 |       ir2.rep[0].E();
 | 
|---|
 | 360 | 
 | 
|---|
 | 361 |       // Cn
 | 
|---|
 | 362 |       ir1.rep[1].rotation(ei*theta);
 | 
|---|
 | 363 |       ir2.rep[1].rotation(ei*theta);
 | 
|---|
 | 364 | 
 | 
|---|
 | 365 |       for (j=2; j < nt; j++) {
 | 
|---|
 | 366 |         ir1.rep[j] = ir1.rep[j-1].operate(ir1.rep[1]);
 | 
|---|
 | 367 |         ir2.rep[j] = ir2.rep[j-1].operate(ir2.rep[1]);
 | 
|---|
 | 368 |       }
 | 
|---|
 | 369 | 
 | 
|---|
 | 370 |       // Sn's
 | 
|---|
 | 371 |       SymRep sr(2);
 | 
|---|
 | 372 |       sr.i();
 | 
|---|
 | 373 |       
 | 
|---|
 | 374 |       for (j=nt; j < g; j++) {
 | 
|---|
 | 375 |         ir1.rep[j] = ir1.rep[j-nt];
 | 
|---|
 | 376 |         ir2.rep[j] = ir2.rep[j-nt].operate(sr);
 | 
|---|
 | 377 |       }
 | 
|---|
 | 378 |     }
 | 
|---|
 | 379 | 
 | 
|---|
 | 380 |     // identity
 | 
|---|
 | 381 |     symop[0].E();
 | 
|---|
 | 382 | 
 | 
|---|
 | 383 |     // Cn
 | 
|---|
 | 384 |     symop[1].rotation(theta);
 | 
|---|
 | 385 |     
 | 
|---|
 | 386 |     // the other n-2 Cn's
 | 
|---|
 | 387 |     for (i=2; i < nt; i++)
 | 
|---|
 | 388 |       symop[i] = symop[i-1].operate(symop[1]);
 | 
|---|
 | 389 | 
 | 
|---|
 | 390 |     // Sn's, for odd nt, operate on Cn's with sigma_h, for even nt,
 | 
|---|
 | 391 |     // operate Cn's with i
 | 
|---|
 | 392 |     if (nt%2)
 | 
|---|
 | 393 |       so.sigma_h();
 | 
|---|
 | 394 |     else
 | 
|---|
 | 395 |       so.i();
 | 
|---|
 | 396 |     
 | 
|---|
 | 397 |     for (i=0; i < nt ; i++) {
 | 
|---|
 | 398 |       symop[i+nt] = symop[i].operate(so);
 | 
|---|
 | 399 |       
 | 
|---|
 | 400 |       rot[i] = trans[i] = symop[i].trace();
 | 
|---|
 | 401 |       trans[i+nt] = symop[i+nt].trace();
 | 
|---|
 | 402 |       rot[i+nt] = -trans[i+nt];
 | 
|---|
 | 403 |     }
 | 
|---|
 | 404 | 
 | 
|---|
 | 405 |     break;
 | 
|---|
 | 406 | 
 | 
|---|
 | 407 |   case SN:
 | 
|---|
 | 408 |     // clockwise rotation-reflection by theta*i radians about z axis
 | 
|---|
 | 409 |     //
 | 
|---|
 | 410 |     // for odd n/2, the irreps are Ag, Au, E1g...E(nir/2-1)g,E1u...E(nir/2-1)u
 | 
|---|
 | 411 |     // for even n/2, the irreps are A, B, E1...E(nir-2)
 | 
|---|
 | 412 |     //
 | 
|---|
 | 413 |     if ((nt/2)%2) {
 | 
|---|
 | 414 |       gamma_[0].init(g, 1, "Ag");
 | 
|---|
 | 415 |       gamma_[nirrep_/2].init(g, 1, "Au");
 | 
|---|
 | 416 | 
 | 
|---|
 | 417 |       for (gi=0; gi < nt/2; gi++) {
 | 
|---|
 | 418 |         gamma_[0].rep[gi][0][0] = 1.0;
 | 
|---|
 | 419 |         gamma_[nirrep_/2].rep[gi][0][0] = 1.0;
 | 
|---|
 | 420 | 
 | 
|---|
 | 421 |         gamma_[0].rep[gi+nt/2][0][0] =  1.0;
 | 
|---|
 | 422 |         gamma_[nirrep_/2].rep[gi+nt/2][0][0] = -1.0;
 | 
|---|
 | 423 |       }
 | 
|---|
 | 424 | 
 | 
|---|
 | 425 |       ei=1;
 | 
|---|
 | 426 |       for (i=1; i < nirrep_/2 ; i++, ei++) {
 | 
|---|
 | 427 |         IrreducibleRepresentation& ir1 = gamma_[i];
 | 
|---|
 | 428 |         IrreducibleRepresentation& ir2 = gamma_[i+nirrep_/2];
 | 
|---|
 | 429 | 
 | 
|---|
 | 430 |         if (nt==6)
 | 
|---|
 | 431 |           sprintf(label,"Eg");
 | 
|---|
 | 432 |         else
 | 
|---|
 | 433 |           sprintf(label,"E%dg",ei);
 | 
|---|
 | 434 | 
 | 
|---|
 | 435 |         ir1.init(g,2,label);
 | 
|---|
 | 436 |         ir1.complex_=1;
 | 
|---|
 | 437 | 
 | 
|---|
 | 438 |         if (nt==6)
 | 
|---|
 | 439 |           sprintf(label,"Eu");
 | 
|---|
 | 440 |         else
 | 
|---|
 | 441 |           sprintf(label,"E%du", ei);
 | 
|---|
 | 442 | 
 | 
|---|
 | 443 |         ir2.init(g,2,label);
 | 
|---|
 | 444 |         ir2.complex_=1;
 | 
|---|
 | 445 | 
 | 
|---|
 | 446 |         // identity
 | 
|---|
 | 447 |         ir1.rep[0].E();
 | 
|---|
 | 448 |         ir2.rep[0].E();
 | 
|---|
 | 449 |         
 | 
|---|
 | 450 |         // C(n/2)
 | 
|---|
 | 451 |         ir1.rep[1].rotation(ei*theta*2.0);
 | 
|---|
 | 452 |         ir2.rep[1].rotation(ei*theta*2.0);
 | 
|---|
 | 453 | 
 | 
|---|
 | 454 |         for (j=2; j < nt/2; j++) {
 | 
|---|
 | 455 |           ir1.rep[j] = ir1.rep[j-1].operate(ir1.rep[1]);
 | 
|---|
 | 456 |           ir2.rep[j] = ir2.rep[j-1].operate(ir2.rep[1]);
 | 
|---|
 | 457 |         }
 | 
|---|
 | 458 | 
 | 
|---|
 | 459 |         SymRep sr(2);
 | 
|---|
 | 460 |         sr.i();
 | 
|---|
 | 461 |       
 | 
|---|
 | 462 |         // Sn
 | 
|---|
 | 463 |         for (j=nt/2; j < nt; j++) {
 | 
|---|
 | 464 |           ir1.rep[j] = ir1.rep[j-nt/2];
 | 
|---|
 | 465 |           ir2.rep[j] = ir2.rep[j-nt/2].operate(sr);
 | 
|---|
 | 466 |         }
 | 
|---|
 | 467 |       }
 | 
|---|
 | 468 | 
 | 
|---|
 | 469 |       // identity
 | 
|---|
 | 470 |       symop[0].E();
 | 
|---|
 | 471 | 
 | 
|---|
 | 472 |       // Cn
 | 
|---|
 | 473 |       symop[1].rotation(2.0*theta);
 | 
|---|
 | 474 | 
 | 
|---|
 | 475 |       for (i=2; i < nt/2 ; i++)
 | 
|---|
 | 476 |         symop[i] = symop[i-1].operate(symop[1]);
 | 
|---|
 | 477 | 
 | 
|---|
 | 478 |       so.i();
 | 
|---|
 | 479 | 
 | 
|---|
 | 480 |       // Sn
 | 
|---|
 | 481 |       for (i=nt/2; i < nt; i++)
 | 
|---|
 | 482 |         symop[i] = symop[i-nt/2].operate(so);
 | 
|---|
 | 483 |       
 | 
|---|
 | 484 |       for (i=0; i < nt/2 ; i++) {
 | 
|---|
 | 485 |         rot[i] = trans[i] = symop[i].trace();
 | 
|---|
 | 486 | 
 | 
|---|
 | 487 |         trans[i+nt/2] = symop[i+nt/2].trace();
 | 
|---|
 | 488 |         rot[i+nt/2] = -trans[i+nt/2];
 | 
|---|
 | 489 |       }
 | 
|---|
 | 490 | 
 | 
|---|
 | 491 |     } else {
 | 
|---|
 | 492 |       gamma_[0].init(g, 1, "A");
 | 
|---|
 | 493 |       gamma_[1].init(g, 1, "B");
 | 
|---|
 | 494 | 
 | 
|---|
 | 495 |       for (gi=0; gi < nt; gi++) {
 | 
|---|
 | 496 |         gamma_[0].rep[gi][0][0] = 1.0;
 | 
|---|
 | 497 |         gamma_[1].rep[gi][0][0] = (gi%2) ? -1.0 : 1.0;
 | 
|---|
 | 498 |       }
 | 
|---|
 | 499 | 
 | 
|---|
 | 500 |       ei=1;
 | 
|---|
 | 501 |       for (i=2; i < nirrep_; i++, ei++) {
 | 
|---|
 | 502 |         IrreducibleRepresentation& ir = gamma_[i];
 | 
|---|
 | 503 |         
 | 
|---|
 | 504 |         if (nt==4)
 | 
|---|
 | 505 |           sprintf(label,"E");
 | 
|---|
 | 506 |         else
 | 
|---|
 | 507 |           sprintf(label,"E%d",ei);
 | 
|---|
 | 508 | 
 | 
|---|
 | 509 |         ir.init(g,2,label);
 | 
|---|
 | 510 |         ir.complex_ = 1;
 | 
|---|
 | 511 | 
 | 
|---|
 | 512 |         // identity
 | 
|---|
 | 513 |         ir.rep[0].E();
 | 
|---|
 | 514 | 
 | 
|---|
 | 515 |         // Sn
 | 
|---|
 | 516 |         ir.rep[1].rotation(ei*theta);
 | 
|---|
 | 517 |         
 | 
|---|
 | 518 |         for (j=2; j < nt; j++)
 | 
|---|
 | 519 |           ir.rep[j] = ir.rep[j-1].operate(ir.rep[1]);
 | 
|---|
 | 520 |       }
 | 
|---|
 | 521 | 
 | 
|---|
 | 522 |       // identity
 | 
|---|
 | 523 |       symop[0].E();
 | 
|---|
 | 524 | 
 | 
|---|
 | 525 |       // Sn
 | 
|---|
 | 526 |       symop[1].rotation(theta);
 | 
|---|
 | 527 |       symop[1][2][2] = -1.0;
 | 
|---|
 | 528 | 
 | 
|---|
 | 529 |       for (i=2; i < nt ; i++)
 | 
|---|
 | 530 |         symop[i] = symop[i-1].operate(symop[1]);
 | 
|---|
 | 531 | 
 | 
|---|
 | 532 |       for (i=0; i < nt ; i++) {
 | 
|---|
 | 533 |         trans[i] = symop[i].trace();
 | 
|---|
 | 534 |         rot[i] = (i%2) ? -trans[i] : trans[i];
 | 
|---|
 | 535 |       }
 | 
|---|
 | 536 |     }
 | 
|---|
 | 537 | 
 | 
|---|
 | 538 |     break;
 | 
|---|
 | 539 | 
 | 
|---|
 | 540 |   case DN:
 | 
|---|
 | 541 |     // clockwise rotation about z axis, followed by C2 about x axis
 | 
|---|
 | 542 | 
 | 
|---|
 | 543 |     // D2 is a special case
 | 
|---|
 | 544 |     if (nt==2) {
 | 
|---|
 | 545 |       gamma_[0].init(g,1,"A");
 | 
|---|
 | 546 |       gamma_[1].init(g,1,"B1");
 | 
|---|
 | 547 |       gamma_[2].init(g,1,"B2");
 | 
|---|
 | 548 |       gamma_[3].init(g,1,"B3");
 | 
|---|
 | 549 | 
 | 
|---|
 | 550 |       for (i=0; i < g; i++) {
 | 
|---|
 | 551 |         gamma_[0].rep[i][0][0] = 1.0;
 | 
|---|
 | 552 |         gamma_[1].rep[i][0][0] = (i < 2) ? 1.0 : -1.0;
 | 
|---|
 | 553 |         gamma_[2].rep[i][0][0] = (i % 2) ? -1.0 : 1.0;
 | 
|---|
 | 554 |         gamma_[3].rep[i][0][0] = (i < 2) ?
 | 
|---|
 | 555 |           ((i % 2) ? -1.0 : 1.0) : ((i%2) ? 1.0 : -1.0);
 | 
|---|
 | 556 |       }
 | 
|---|
 | 557 |     } else {
 | 
|---|
 | 558 |       // Dn is isomorphic with Cnv
 | 
|---|
 | 559 |       //
 | 
|---|
 | 560 |       // for odd n, the irreps are A1, A2, and E1...E(nir-2)
 | 
|---|
 | 561 |       // for even n, the irreps are A1, A2, B1, B2, and E1...E(nir-4)
 | 
|---|
 | 562 |       //
 | 
|---|
 | 563 |       gamma_[0].init(g,1,"A1");
 | 
|---|
 | 564 |       gamma_[1].init(g,1,"A2");
 | 
|---|
 | 565 | 
 | 
|---|
 | 566 |       for (gi=0; gi < nt; gi++) {
 | 
|---|
 | 567 |         // Cn's
 | 
|---|
 | 568 |         gamma_[0].rep[gi][0][0] = 1.0;
 | 
|---|
 | 569 |         gamma_[1].rep[gi][0][0] = 1.0;
 | 
|---|
 | 570 | 
 | 
|---|
 | 571 |         // C2's
 | 
|---|
 | 572 |         gamma_[0].rep[gi+nt][0][0] =  1.0;
 | 
|---|
 | 573 |         gamma_[1].rep[gi+nt][0][0] = -1.0;
 | 
|---|
 | 574 |       }
 | 
|---|
 | 575 | 
 | 
|---|
 | 576 |       i=2;
 | 
|---|
 | 577 | 
 | 
|---|
 | 578 |       if (!(nt%2)) {
 | 
|---|
 | 579 |         gamma_[2].init(g,1,"B1");
 | 
|---|
 | 580 |         gamma_[3].init(g,1,"B2");
 | 
|---|
 | 581 | 
 | 
|---|
 | 582 |         for (gi=0; gi < nt ; gi++) {
 | 
|---|
 | 583 |           double ci = (gi%2) ? -1.0 : 1.0;
 | 
|---|
 | 584 |         
 | 
|---|
 | 585 |           // Cn's
 | 
|---|
 | 586 |           gamma_[2].rep[gi][0][0] = ci;
 | 
|---|
 | 587 |           gamma_[3].rep[gi][0][0] = ci;
 | 
|---|
 | 588 | 
 | 
|---|
 | 589 |           // sigma's
 | 
|---|
 | 590 |           gamma_[2].rep[gi+nt][0][0] =  ci;
 | 
|---|
 | 591 |           gamma_[3].rep[gi+nt][0][0] = -ci;
 | 
|---|
 | 592 |         }
 | 
|---|
 | 593 | 
 | 
|---|
 | 594 |         i = 4;
 | 
|---|
 | 595 |       }
 | 
|---|
 | 596 | 
 | 
|---|
 | 597 |       ei=1;
 | 
|---|
 | 598 |       for (; i < nirrep_; i++, ei++) {
 | 
|---|
 | 599 |         IrreducibleRepresentation& ir = gamma_[i];
 | 
|---|
 | 600 |         
 | 
|---|
 | 601 |         char lab[4];
 | 
|---|
 | 602 |         if (nt==3 || nt==4)
 | 
|---|
 | 603 |           sprintf(lab,"E");
 | 
|---|
 | 604 |         else
 | 
|---|
 | 605 |           sprintf(lab,"E%d",ei);
 | 
|---|
 | 606 | 
 | 
|---|
 | 607 |         ir.init(g,2,lab);
 | 
|---|
 | 608 | 
 | 
|---|
 | 609 |         // identity
 | 
|---|
 | 610 |         ir.rep[0].E();
 | 
|---|
 | 611 | 
 | 
|---|
 | 612 |         // Cn
 | 
|---|
 | 613 |         ir.rep[1].rotation(ei*theta);
 | 
|---|
 | 614 | 
 | 
|---|
 | 615 |         for (j=2; j < nt; j++)
 | 
|---|
 | 616 |           ir.rep[j] = ir.rep[j-1].operate(ir.rep[1]);
 | 
|---|
 | 617 |         
 | 
|---|
 | 618 |         // C2(x)
 | 
|---|
 | 619 |         ir.rep[nt].c2_y();
 | 
|---|
 | 620 |         
 | 
|---|
 | 621 |         SymRep sr(2);
 | 
|---|
 | 622 |         sr.rotation(ei*theta/2.0);
 | 
|---|
 | 623 |       
 | 
|---|
 | 624 |         for (j=nt+1; j < 2*nt; j++)
 | 
|---|
 | 625 |           ir.rep[j] = ir.rep[j-1].transform(sr);
 | 
|---|
 | 626 |       }
 | 
|---|
 | 627 |     }
 | 
|---|
 | 628 |     
 | 
|---|
 | 629 |     // identity
 | 
|---|
 | 630 |     symop[0].E();
 | 
|---|
 | 631 | 
 | 
|---|
 | 632 |     // Cn
 | 
|---|
 | 633 |     symop[1].rotation(theta);
 | 
|---|
 | 634 | 
 | 
|---|
 | 635 |     for (i=2; i < nt; i++)
 | 
|---|
 | 636 |       symop[i] = symop[i-1].operate(symop[1]);
 | 
|---|
 | 637 | 
 | 
|---|
 | 638 |     // C2(x)
 | 
|---|
 | 639 |     symop[nt].c2_y();
 | 
|---|
 | 640 |     
 | 
|---|
 | 641 |     so.rotation(theta/2.0);
 | 
|---|
 | 642 | 
 | 
|---|
 | 643 |     for (i=nt+1; i < 2*nt; i++)
 | 
|---|
 | 644 |       symop[i] = symop[i-1].transform(so);
 | 
|---|
 | 645 |     
 | 
|---|
 | 646 |     for (i=0; i < 2*nt ; i++)
 | 
|---|
 | 647 |       rot[i] = trans[i] = symop[i].trace();
 | 
|---|
 | 648 | 
 | 
|---|
 | 649 |     break;
 | 
|---|
 | 650 | 
 | 
|---|
 | 651 |   case DND:
 | 
|---|
 | 652 |     // rotation reflection about z axis by theta/2 radians, followed
 | 
|---|
 | 653 |     // by c2 about x axis, then reflection through yz plane
 | 
|---|
 | 654 |     //
 | 
|---|
 | 655 |     // for odd n, the irreps are A1g, A2g, A1u, A2u, E1g...E(nir/2-2)g,
 | 
|---|
 | 656 |     //                                               E1u...E(nir/2-2)u
 | 
|---|
 | 657 |     // for even n, the irreps are A1, A2, B1, B2, E1...E(nir-4)
 | 
|---|
 | 658 |     //
 | 
|---|
 | 659 | 
 | 
|---|
 | 660 |     if (nt%2) {
 | 
|---|
 | 661 |       gamma_[0].init(g,1,"A1g");
 | 
|---|
 | 662 |       gamma_[1].init(g,1,"A2g");
 | 
|---|
 | 663 | 
 | 
|---|
 | 664 |       for (gi=0; gi < g; gi++) {
 | 
|---|
 | 665 |         gamma_[0].rep[gi][0][0] = 1.0;
 | 
|---|
 | 666 |         gamma_[1].rep[gi][0][0] = (gi/nt==0 || gi/nt==2) ? 1.0 : -1.0;
 | 
|---|
 | 667 |       }
 | 
|---|
 | 668 |       
 | 
|---|
 | 669 |       i=nirrep_/2;
 | 
|---|
 | 670 |       j=i+1;
 | 
|---|
 | 671 |       gamma_[i].init(g,1,"A1u");
 | 
|---|
 | 672 |       gamma_[j].init(g,1,"A2u");
 | 
|---|
 | 673 | 
 | 
|---|
 | 674 |       for (gi=0; gi < g/2; gi++) {
 | 
|---|
 | 675 |         gamma_[i].rep[gi][0][0] = gamma_[0].rep[gi][0][0];
 | 
|---|
 | 676 |         gamma_[j].rep[gi][0][0] = gamma_[1].rep[gi][0][0];
 | 
|---|
 | 677 | 
 | 
|---|
 | 678 |         gamma_[i].rep[gi+g/2][0][0] = -gamma_[0].rep[gi][0][0];
 | 
|---|
 | 679 |         gamma_[j].rep[gi+g/2][0][0] = -gamma_[1].rep[gi][0][0];
 | 
|---|
 | 680 |       }
 | 
|---|
 | 681 | 
 | 
|---|
 | 682 |       ei=1;
 | 
|---|
 | 683 |     
 | 
|---|
 | 684 |       for (i=2; i < nirrep_/2 ; i++, ei++) {
 | 
|---|
 | 685 |         IrreducibleRepresentation& ir1 = gamma_[i];
 | 
|---|
 | 686 |         IrreducibleRepresentation& ir2 = gamma_[i+nirrep_/2];
 | 
|---|
 | 687 |         
 | 
|---|
 | 688 |         if (nt==3) {
 | 
|---|
 | 689 |           ir1.init(g,2,"Eg");
 | 
|---|
 | 690 |           ir2.init(g,2,"Eu");
 | 
|---|
 | 691 |         } else {
 | 
|---|
 | 692 |           sprintf(label,"E%dg",ei);
 | 
|---|
 | 693 |           ir1.init(g,2,label);
 | 
|---|
 | 694 |           sprintf(label,"E%du",ei);
 | 
|---|
 | 695 |           ir2.init(g,2,label);
 | 
|---|
 | 696 |         }
 | 
|---|
 | 697 | 
 | 
|---|
 | 698 |         // identity
 | 
|---|
 | 699 |         ir1.rep[0].E();
 | 
|---|
 | 700 |         
 | 
|---|
 | 701 |         // Cn
 | 
|---|
 | 702 |         ir1.rep[1].rotation(ei*theta);
 | 
|---|
 | 703 |         
 | 
|---|
 | 704 |         for (j=2; j < nt; j++)
 | 
|---|
 | 705 |           ir1.rep[j] = ir1.rep[j-1].operate(ir1.rep[1]);
 | 
|---|
 | 706 |         
 | 
|---|
 | 707 |         // C2(x)
 | 
|---|
 | 708 |         ir1.rep[nt].c2_y();
 | 
|---|
 | 709 |         
 | 
|---|
 | 710 |         for (j=nt+1; j < 2*nt; j++)
 | 
|---|
 | 711 |           ir1.rep[j] = ir1.rep[j-1].transform(ir1.rep[1]);
 | 
|---|
 | 712 |         
 | 
|---|
 | 713 |         for (j=0; j < 2*nt; j++)
 | 
|---|
 | 714 |           ir2.rep[j] = ir1.rep[j];
 | 
|---|
 | 715 |         
 | 
|---|
 | 716 |         // Sn and sigma d
 | 
|---|
 | 717 |         SymRep sr(2);
 | 
|---|
 | 718 |         sr.i();
 | 
|---|
 | 719 |         
 | 
|---|
 | 720 |         for (j=2*nt; j < g; j++) {
 | 
|---|
 | 721 |           ir1.rep[j] = ir1.rep[j-2*nt];
 | 
|---|
 | 722 |           ir2.rep[j] = ir2.rep[j-2*nt].operate(sr);
 | 
|---|
 | 723 |         }
 | 
|---|
 | 724 |       }
 | 
|---|
 | 725 | 
 | 
|---|
 | 726 |       // identity
 | 
|---|
 | 727 |       symop[0].E();
 | 
|---|
 | 728 | 
 | 
|---|
 | 729 |       // Cn
 | 
|---|
 | 730 |       symop[1].rotation(theta);
 | 
|---|
 | 731 | 
 | 
|---|
 | 732 |       for (i=2; i < nt; i++)
 | 
|---|
 | 733 |         symop[i] = symop[i-1].operate(symop[1]);
 | 
|---|
 | 734 | 
 | 
|---|
 | 735 |       // C2(x)
 | 
|---|
 | 736 |       symop[nt].c2_y();
 | 
|---|
 | 737 | 
 | 
|---|
 | 738 |       for (i=nt+1; i < 2*nt; i++)
 | 
|---|
 | 739 |         symop[i] = symop[i-1].transform(symop[1]);
 | 
|---|
 | 740 |       
 | 
|---|
 | 741 |       // i + n-1 S2n + n sigma
 | 
|---|
 | 742 |       so.i();
 | 
|---|
 | 743 |       for (i=2*nt; i < g; i++)
 | 
|---|
 | 744 |         symop[i] = symop[i-2*nt].operate(so);
 | 
|---|
 | 745 |       
 | 
|---|
 | 746 |       for (i=0; i < g; i++) {
 | 
|---|
 | 747 |         trans[i] = symop[i].trace();
 | 
|---|
 | 748 |         rot[i] = (i < g/2) ? trans[i] : -trans[i];
 | 
|---|
 | 749 |       }
 | 
|---|
 | 750 | 
 | 
|---|
 | 751 |     } else { // even nt
 | 
|---|
 | 752 | 
 | 
|---|
 | 753 |       gamma_[0].init(g,1,"A1");
 | 
|---|
 | 754 |       gamma_[1].init(g,1,"A2");
 | 
|---|
 | 755 |       gamma_[2].init(g,1,"B1");
 | 
|---|
 | 756 |       gamma_[3].init(g,1,"B2");
 | 
|---|
 | 757 | 
 | 
|---|
 | 758 |       for (gi=0; gi < 2*nt; gi++) {
 | 
|---|
 | 759 |         // Sn
 | 
|---|
 | 760 |         gamma_[0].rep[gi][0][0] = 1.0;
 | 
|---|
 | 761 |         gamma_[1].rep[gi][0][0] = 1.0;
 | 
|---|
 | 762 |         gamma_[2].rep[gi][0][0] = (gi%2) ? -1.0 : 1.0;
 | 
|---|
 | 763 |         gamma_[3].rep[gi][0][0] = (gi%2) ? -1.0 : 1.0;
 | 
|---|
 | 764 | 
 | 
|---|
 | 765 |         // n C2's and n sigma's
 | 
|---|
 | 766 |         gamma_[0].rep[gi+2*nt][0][0] =  1.0;
 | 
|---|
 | 767 |         gamma_[1].rep[gi+2*nt][0][0] = -1.0;
 | 
|---|
 | 768 |         gamma_[2].rep[gi+2*nt][0][0] = (gi%2) ? -1.0 : 1.0;
 | 
|---|
 | 769 |         gamma_[3].rep[gi+2*nt][0][0] = (gi%2) ? 1.0 : -1.0;
 | 
|---|
 | 770 |       }
 | 
|---|
 | 771 | 
 | 
|---|
 | 772 |       ei=1;
 | 
|---|
 | 773 |       for (i=4; i < nirrep_; i++, ei++) {
 | 
|---|
 | 774 |         IrreducibleRepresentation& ir = gamma_[i];
 | 
|---|
 | 775 | 
 | 
|---|
 | 776 |         if (nt==2)
 | 
|---|
 | 777 |           sprintf(label,"E");
 | 
|---|
 | 778 |         else
 | 
|---|
 | 779 |           sprintf(label,"E%d",ei);
 | 
|---|
 | 780 | 
 | 
|---|
 | 781 |         ir.init(g,2,label);
 | 
|---|
 | 782 | 
 | 
|---|
 | 783 |         // identity
 | 
|---|
 | 784 |         ir.rep[0].E();
 | 
|---|
 | 785 |         
 | 
|---|
 | 786 |         // S2n
 | 
|---|
 | 787 |         ir.rep[1].rotation(ei*theta/2.0);
 | 
|---|
 | 788 |         
 | 
|---|
 | 789 |         for (j=2; j < 2*nt; j++)
 | 
|---|
 | 790 |           ir.rep[j] = ir.rep[j-1].operate(ir.rep[1]);
 | 
|---|
 | 791 |         
 | 
|---|
 | 792 |         // C2(x) + sigma_d
 | 
|---|
 | 793 |         ir.rep[2*nt].c2_y();
 | 
|---|
 | 794 |         
 | 
|---|
 | 795 |         for (j=2*nt+1; j < g; j++)
 | 
|---|
 | 796 |           ir.rep[j] = ir.rep[j-1].operate(ir.rep[1]);
 | 
|---|
 | 797 |       }
 | 
|---|
 | 798 | 
 | 
|---|
 | 799 |       // identity
 | 
|---|
 | 800 |       symop[0].E();
 | 
|---|
 | 801 |       
 | 
|---|
 | 802 |       // Sn's
 | 
|---|
 | 803 |       symop[1].rotation(theta/2.0);
 | 
|---|
 | 804 |       symop[1][2][2] = -1.0;
 | 
|---|
 | 805 |       
 | 
|---|
 | 806 |       for (i=2; i < 2*nt; i++)
 | 
|---|
 | 807 |         symop[i] = symop[i-1].operate(symop[1]);
 | 
|---|
 | 808 | 
 | 
|---|
 | 809 |       // C2(x)
 | 
|---|
 | 810 |       symop[2*nt].c2_y();
 | 
|---|
 | 811 | 
 | 
|---|
 | 812 |       for (i=2*nt+1; i < g; i++)
 | 
|---|
 | 813 |         symop[i] = symop[i-1].operate(symop[1]);
 | 
|---|
 | 814 |       
 | 
|---|
 | 815 |       for (i=0; i < g; i++) {
 | 
|---|
 | 816 |         trans[i] = symop[i].trace();
 | 
|---|
 | 817 |         rot[i] = (i%2) ? -trans[i] : trans[i];
 | 
|---|
 | 818 |       }
 | 
|---|
 | 819 |     }
 | 
|---|
 | 820 | 
 | 
|---|
 | 821 |     break;
 | 
|---|
 | 822 | 
 | 
|---|
 | 823 |   case DNH:
 | 
|---|
 | 824 |     // clockwise rotation and rotation-reflection about z axis,
 | 
|---|
 | 825 |     // followed by c2 about x axis and then reflection
 | 
|---|
 | 826 |     // through xz 
 | 
|---|
 | 827 | 
 | 
|---|
 | 828 |     i=nirrep_/2; j=i+1;
 | 
|---|
 | 829 | 
 | 
|---|
 | 830 |     if (nt%2) {
 | 
|---|
 | 831 |       gamma_[0].init(g,1,"A1'");
 | 
|---|
 | 832 |       gamma_[1].init(g,1,"A2'");
 | 
|---|
 | 833 |       gamma_[i].init(g,1,"A1\"");
 | 
|---|
 | 834 |       gamma_[j].init(g,1,"A2\"");
 | 
|---|
 | 835 |     } else {
 | 
|---|
 | 836 |       if (nt==2) {
 | 
|---|
 | 837 |         gamma_[0].init(g,1,"Ag");
 | 
|---|
 | 838 |         gamma_[1].init(g,1,"B1g");
 | 
|---|
 | 839 |         gamma_[4].init(g,1,"Au");
 | 
|---|
 | 840 |         gamma_[5].init(g,1,"B1u");
 | 
|---|
 | 841 |       } else {
 | 
|---|
 | 842 |         gamma_[0].init(g,1,"A1g");
 | 
|---|
 | 843 |         gamma_[1].init(g,1,"A2g");
 | 
|---|
 | 844 |         gamma_[i].init(g,1,"A1u");
 | 
|---|
 | 845 |         gamma_[j].init(g,1,"A2u");
 | 
|---|
 | 846 |       }
 | 
|---|
 | 847 |     }
 | 
|---|
 | 848 | 
 | 
|---|
 | 849 |     for (gi=0; gi < nt; gi++) {
 | 
|---|
 | 850 |       // E + n-1 Cn's
 | 
|---|
 | 851 |       gamma_[0].rep[gi][0][0] = gamma_[1].rep[gi][0][0] =
 | 
|---|
 | 852 |         gamma_[i].rep[gi][0][0] = gamma_[j].rep[gi][0][0] = 1.0;
 | 
|---|
 | 853 | 
 | 
|---|
 | 854 |       // n C2's
 | 
|---|
 | 855 |       gamma_[0].rep[gi+nt][0][0] = gamma_[i].rep[gi+nt][0][0] =  1.0;
 | 
|---|
 | 856 |       gamma_[1].rep[gi+nt][0][0] = gamma_[j].rep[gi+nt][0][0] = -1.0;
 | 
|---|
 | 857 | 
 | 
|---|
 | 858 |       // i + n-1 S2n's
 | 
|---|
 | 859 |       gamma_[0].rep[gi+2*nt][0][0] = gamma_[1].rep[gi+2*nt][0][0] =  1.0;
 | 
|---|
 | 860 |       gamma_[i].rep[gi+2*nt][0][0] = gamma_[j].rep[gi+2*nt][0][0] = -1.0;
 | 
|---|
 | 861 | 
 | 
|---|
 | 862 |       // n sigma's
 | 
|---|
 | 863 |       gamma_[0].rep[gi+3*nt][0][0] = gamma_[j].rep[gi+3*nt][0][0] =  1.0;
 | 
|---|
 | 864 |       gamma_[i].rep[gi+3*nt][0][0] = gamma_[1].rep[gi+3*nt][0][0] = -1.0;
 | 
|---|
 | 865 |     }
 | 
|---|
 | 866 | 
 | 
|---|
 | 867 |     if (!(nt%2)) {
 | 
|---|
 | 868 |       if (nt==2) {
 | 
|---|
 | 869 |         gamma_[2].init(g,1,"B2g");
 | 
|---|
 | 870 |         gamma_[3].init(g,1,"B3g");
 | 
|---|
 | 871 |         gamma_[6].init(g,1,"B2u");
 | 
|---|
 | 872 |         gamma_[7].init(g,1,"B3u");
 | 
|---|
 | 873 |       } else {
 | 
|---|
 | 874 |         gamma_[2].init(g,1,"B1g");
 | 
|---|
 | 875 |         gamma_[3].init(g,1,"B2g");
 | 
|---|
 | 876 |         gamma_[i+2].init(g,1,"B1u");
 | 
|---|
 | 877 |         gamma_[j+2].init(g,1,"B2u");
 | 
|---|
 | 878 |       }
 | 
|---|
 | 879 | 
 | 
|---|
 | 880 |       for (gi=0; gi < nt; gi++) {
 | 
|---|
 | 881 |         // E + n-1 Cn's
 | 
|---|
 | 882 |         gamma_[2].rep[gi][0][0] = gamma_[3].rep[gi][0][0] =
 | 
|---|
 | 883 |           gamma_[i+2].rep[gi][0][0] = gamma_[j+2].rep[gi][0][0] =
 | 
|---|
 | 884 |           (gi%2) ? -1.0 : 1.0;
 | 
|---|
 | 885 | 
 | 
|---|
 | 886 |         // n C2's
 | 
|---|
 | 887 |         gamma_[2].rep[gi+nt][0][0] = gamma_[i+2].rep[gi+nt][0][0] =
 | 
|---|
 | 888 |           (gi%2) ? -1.0 : 1.0;
 | 
|---|
 | 889 |         gamma_[3].rep[gi+nt][0][0] = gamma_[j+2].rep[gi+nt][0][0] =
 | 
|---|
 | 890 |           (gi%2) ? 1.0 : -1.0;
 | 
|---|
 | 891 | 
 | 
|---|
 | 892 |         // i + n-1 S2n's
 | 
|---|
 | 893 |         gamma_[2].rep[gi+2*nt][0][0] = gamma_[3].rep[gi+2*nt][0][0] =
 | 
|---|
 | 894 |           (gi%2) ? -1.0 : 1.0;
 | 
|---|
 | 895 |         gamma_[i+2].rep[gi+2*nt][0][0] = gamma_[j+2].rep[gi+2*nt][0][0] =
 | 
|---|
 | 896 |           (gi%2) ? 1.0 : -1.0;
 | 
|---|
 | 897 | 
 | 
|---|
 | 898 |         // n sigma's
 | 
|---|
 | 899 |         gamma_[2].rep[gi+3*nt][0][0] = gamma_[j+2].rep[gi+3*nt][0][0] =
 | 
|---|
 | 900 |           (gi%2) ? -1.0 : 1.0;
 | 
|---|
 | 901 |         gamma_[i+2].rep[gi+3*nt][0][0] = gamma_[3].rep[gi+3*nt][0][0] =
 | 
|---|
 | 902 |           (gi%2) ? 1.0 : -1.0;
 | 
|---|
 | 903 |       }
 | 
|---|
 | 904 |     }
 | 
|---|
 | 905 |       
 | 
|---|
 | 906 |     ei=1;
 | 
|---|
 | 907 |     for (i = (nt%2) ? 2 : 4; i < nirrep_/2 ; i++, ei++) {
 | 
|---|
 | 908 |       IrreducibleRepresentation& ir1 = gamma_[i];
 | 
|---|
 | 909 |       IrreducibleRepresentation& ir2 = gamma_[i+nirrep_/2];
 | 
|---|
 | 910 |       
 | 
|---|
 | 911 |       if (nt==3) {
 | 
|---|
 | 912 |         ir1.init(g,2,"E'");
 | 
|---|
 | 913 |         ir2.init(g,2,"E\"");
 | 
|---|
 | 914 |       } else if (nt==4) {
 | 
|---|
 | 915 |         ir1.init(g,2,"Eg");
 | 
|---|
 | 916 |         ir2.init(g,2,"Eu");
 | 
|---|
 | 917 |       } else {
 | 
|---|
 | 918 |         sprintf(label,"E%d%s", ei, (nt%2) ? "'" : "g");
 | 
|---|
 | 919 |         ir1.init(g,2,label);
 | 
|---|
 | 920 | 
 | 
|---|
 | 921 |         sprintf(label,"E%d%s", ei, (nt%2) ? "\"" : "u");
 | 
|---|
 | 922 |         ir2.init(g,2,label);
 | 
|---|
 | 923 |       }
 | 
|---|
 | 924 | 
 | 
|---|
 | 925 |       // identity
 | 
|---|
 | 926 |       ir1.rep[0].E();
 | 
|---|
 | 927 |         
 | 
|---|
 | 928 |       // n-1 Cn's
 | 
|---|
 | 929 |       ir1.rep[1].rotation(ei*theta);
 | 
|---|
 | 930 | 
 | 
|---|
 | 931 |       for (j=2; j < nt; j++)
 | 
|---|
 | 932 |         ir1.rep[j] = ir1.rep[j-1].operate(ir1.rep[1]);
 | 
|---|
 | 933 |         
 | 
|---|
 | 934 |       // n C2's
 | 
|---|
 | 935 |       ir1.rep[nt].c2_y();
 | 
|---|
 | 936 |         
 | 
|---|
 | 937 |       SymRep sr(2);
 | 
|---|
 | 938 |       sr.rotation(ei*theta/2.0);
 | 
|---|
 | 939 |       
 | 
|---|
 | 940 |       for (j=nt+1; j < 2*nt; j++)
 | 
|---|
 | 941 |         ir1.rep[j] = ir1.rep[j-1].transform(sr);
 | 
|---|
 | 942 |         
 | 
|---|
 | 943 |       sr.i();
 | 
|---|
 | 944 |       for (j=0; j < 2*nt; j++) {
 | 
|---|
 | 945 |         ir1.rep[j+2*nt] = ir1.rep[j];
 | 
|---|
 | 946 |         ir2.rep[j] = ir1.rep[j];
 | 
|---|
 | 947 |         ir2.rep[j+2*nt] = ir1.rep[j].operate(sr);
 | 
|---|
 | 948 |       }
 | 
|---|
 | 949 |     }
 | 
|---|
 | 950 | 
 | 
|---|
 | 951 |     // identity
 | 
|---|
 | 952 |     symop[0].E();
 | 
|---|
 | 953 | 
 | 
|---|
 | 954 |     // n-1 Cn's
 | 
|---|
 | 955 |     symop[1].rotation(theta);
 | 
|---|
 | 956 |     
 | 
|---|
 | 957 |     for (i=2; i < nt; i++)
 | 
|---|
 | 958 |       symop[i] = symop[i-1].operate(symop[1]);
 | 
|---|
 | 959 |     
 | 
|---|
 | 960 |     // n C2's
 | 
|---|
 | 961 |     symop[nt].c2_y();
 | 
|---|
 | 962 | 
 | 
|---|
 | 963 |     so.rotation(theta/2.0);
 | 
|---|
 | 964 |     for (i=nt+1; i < 2*nt; i++)
 | 
|---|
 | 965 |       symop[i] = symop[i-1].transform(so);
 | 
|---|
 | 966 | 
 | 
|---|
 | 967 |     if (nt%2)
 | 
|---|
 | 968 |       so.sigma_h();
 | 
|---|
 | 969 |     else
 | 
|---|
 | 970 |       so.i();
 | 
|---|
 | 971 | 
 | 
|---|
 | 972 |     for (i=2*nt; i < g; i++)
 | 
|---|
 | 973 |       symop[i] = symop[i-2*nt].operate(so);
 | 
|---|
 | 974 |     
 | 
|---|
 | 975 |     for (i=0,j=2*nt; i < 2*nt ; i++,j++) {
 | 
|---|
 | 976 |       rot[i] = trans[i] = symop[i].trace();
 | 
|---|
 | 977 |       trans[j] = symop[j].trace();
 | 
|---|
 | 978 |       rot[j] = -trans[j];
 | 
|---|
 | 979 |     }
 | 
|---|
 | 980 | 
 | 
|---|
 | 981 |     break;
 | 
|---|
 | 982 | 
 | 
|---|
 | 983 |   case T:
 | 
|---|
 | 984 |     t();
 | 
|---|
 | 985 |     break;
 | 
|---|
 | 986 | 
 | 
|---|
 | 987 |   case TH:
 | 
|---|
 | 988 |     th();
 | 
|---|
 | 989 |     break;
 | 
|---|
 | 990 | 
 | 
|---|
 | 991 |   case TD:
 | 
|---|
 | 992 |     td();
 | 
|---|
 | 993 |     break;
 | 
|---|
 | 994 | 
 | 
|---|
 | 995 |   case O:
 | 
|---|
 | 996 |     o();
 | 
|---|
 | 997 |     break;
 | 
|---|
 | 998 | 
 | 
|---|
 | 999 |   case OH:
 | 
|---|
 | 1000 |     oh();
 | 
|---|
 | 1001 |     break;
 | 
|---|
 | 1002 | 
 | 
|---|
 | 1003 |   case I:
 | 
|---|
 | 1004 |     this->i();
 | 
|---|
 | 1005 |     break;
 | 
|---|
 | 1006 | 
 | 
|---|
 | 1007 |   case IH:
 | 
|---|
 | 1008 |     ih();
 | 
|---|
 | 1009 |     break;
 | 
|---|
 | 1010 | 
 | 
|---|
 | 1011 |   default:
 | 
|---|
 | 1012 |     return -1;
 | 
|---|
 | 1013 | 
 | 
|---|
 | 1014 |   }
 | 
|---|
 | 1015 |     
 | 
|---|
 | 1016 |   /* ok, we have the reducible representation of the rotations and
 | 
|---|
 | 1017 |    * translations, now let's use projection operators to find out how many
 | 
|---|
 | 1018 |    * rotations and translations there are in each irrep
 | 
|---|
 | 1019 |    */
 | 
|---|
 | 1020 | 
 | 
|---|
 | 1021 |   if (pg != C1 && pg != CI && pg != CS && pg != T && pg != TD && pg != TH &&
 | 
|---|
 | 1022 |       pg != O && pg != OH && pg != I && pg != IH) {
 | 
|---|
 | 1023 | 
 | 
|---|
 | 1024 |     for (i=0; i < nirrep_; i++) {
 | 
|---|
 | 1025 |       double nr=0; double nt=0;
 | 
|---|
 | 1026 | 
 | 
|---|
 | 1027 |       for (j=0; j < gamma_[i].g; j++) {
 | 
|---|
 | 1028 |         nr += rot[j]*gamma_[i].character(j);
 | 
|---|
 | 1029 |         nt += trans[j]*gamma_[i].character(j);
 | 
|---|
 | 1030 |       }
 | 
|---|
 | 1031 | 
 | 
|---|
 | 1032 |       gamma_[i].nrot_ = (int) ((nr+0.5)/gamma_[i].g);
 | 
|---|
 | 1033 |       gamma_[i].ntrans_ = (int) ((nt+0.5)/gamma_[i].g);
 | 
|---|
 | 1034 |     }
 | 
|---|
 | 1035 |   }
 | 
|---|
 | 1036 | 
 | 
|---|
 | 1037 |   delete[] rot;
 | 
|---|
 | 1038 |   delete[] trans;
 | 
|---|
 | 1039 |   
 | 
|---|
 | 1040 |   // now find the inverse of each symop
 | 
|---|
 | 1041 |   for (gi=0; gi < g; gi++) {
 | 
|---|
 | 1042 |     int gj;
 | 
|---|
 | 1043 |     for (gj=0; gj < g; gj++) {
 | 
|---|
 | 1044 |       so = symop[gi].operate(symop[gj]);
 | 
|---|
 | 1045 | 
 | 
|---|
 | 1046 |       // is so a unit matrix?
 | 
|---|
 | 1047 |       if (fabs(1.0-so[0][0]) < 1.0e-8 &&
 | 
|---|
 | 1048 |           fabs(1.0-so[1][1]) < 1.0e-8 &&
 | 
|---|
 | 1049 |           fabs(1.0-so[2][2]) < 1.0e-8) break;
 | 
|---|
 | 1050 |     }
 | 
|---|
 | 1051 | 
 | 
|---|
 | 1052 |     if (gj==g) {
 | 
|---|
 | 1053 |       ExEnv::err0() << indent
 | 
|---|
 | 1054 |            << "make_table: uh oh, can't find inverse of " << gi << endl;
 | 
|---|
 | 1055 |       abort();
 | 
|---|
 | 1056 |     }
 | 
|---|
 | 1057 | 
 | 
|---|
 | 1058 |     _inv[gi] = gj;
 | 
|---|
 | 1059 |   }
 | 
|---|
 | 1060 |     
 | 
|---|
 | 1061 |   return 0;
 | 
|---|
 | 1062 | }
 | 
|---|
 | 1063 | 
 | 
|---|
 | 1064 | /////////////////////////////////////////////////////////////////////////////
 | 
|---|
 | 1065 | 
 | 
|---|
 | 1066 | // Local Variables:
 | 
|---|
 | 1067 | // mode: c++
 | 
|---|
 | 1068 | // c-file-style: "ETS"
 | 
|---|
 | 1069 | // End:
 | 
|---|