Exemple #1
0
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;
}
Exemple #2
0
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);
}

}