State * Grammar::getNextState( void ) { Config *bp; State *state; myCurConfigList.sortBasis(); bp = myCurConfigList.getBasis(); state = StateTable::get()->find( bp ); if ( state ) { Config *sbp, *tbp; for ( sbp = state->getBasis(), tbp = bp; sbp && tbp; sbp = sbp->getNextBasis(), tbp = tbp->getNextBasis() ) { sbp->mergePropLinks( tbp ); } myCurConfigList.deleteConfigs(); } else { myCurConfigList.computeClosure(); myCurConfigList.sort(); state = new State( bp, myCurConfigList.getConfig() ); myCurConfigList.resetPointers(); StateTable::get()->add( state ); // Cause things to recurse around (if necessary) buildShifts( state ); } return state; }
void Pbc::setBox(const Tensor&b){ box=b; // detect type: const double epsilon=1e-28; type=unset; double det=box.determinant(); if(det*det<epsilon) return; bool cxy=false; bool cxz=false; bool cyz=false; if(box(0,1)*box(0,1)<epsilon && box(1,0)*box(1,0)<epsilon) cxy=true; if(box(0,2)*box(0,2)<epsilon && box(2,0)*box(2,0)<epsilon) cxz=true; if(box(1,2)*box(1,2)<epsilon && box(2,1)*box(2,1)<epsilon) cyz=true; invBox=box.inverse(); if(cxy && cxz && cyz) type=orthorombic; else type=generic; if(type==orthorombic){ reduced=box; invReduced=inverse(reduced); for(unsigned i=0;i<3;i++){ diag[i]=box[i][i]; hdiag[i]=0.5*box[i][i]; mdiag[i]=-0.5*box[i][i]; } } else { reduced=box; LatticeReduction::reduce(reduced); invReduced=inverse(reduced); buildShifts(shifts); } }