Esempio n. 1
0
void rotate(snapshot *snap, string *tags, string *vecs, char axis,
	    real thetax, real thetay, real thetaz)
{
  matrix rmat;
  bodyptr bp;

  switch (tolower(axis)) {
    case 'x':
      xmatrix(rmat, thetax);
      break;
    case 'y':
      ymatrix(rmat, thetay);
      break;
    case 'z':
      zmatrix(rmat, thetaz);
      break;
    default:
      error("%s: unknown axis %c\n", getargv0(), axis);
  }
  if (set_member(tags, PosTag) && set_member(vecs, PosTag))
    for_all_bodies(bp, *snap)
      rotatevec(Pos(bp), rmat);
  if (set_member(tags, VelTag) && set_member(vecs, VelTag))
    for_all_bodies(bp, *snap)
      rotatevec(Vel(bp), rmat);
  if (set_member(tags, AccTag) && set_member(vecs, AccTag))
    for_all_bodies(bp, *snap)
      rotatevec(Acc(bp), rmat);
  if (set_member(tags, AuxVecTag) && set_member(vecs, AuxVecTag))
    for_all_bodies(bp, *snap)
      rotatevec(AuxVec(bp), rmat);
}
Esempio n. 2
0
void kTpemHamiltonian (Geometry const &geometry, DynVars const &dynVars,
		 tpem_sparse *matrix,Parameters const &ether,Aux &aux,int type)
{
	int	row, col, volume, i = 0, p;
	double	a=aux.varTpem_a, b=aux.varTpem_b, tmp;
	int	j,k,dir;
	volume = ether.linSize;
	int level,gamma1,gamma2;
	vector<MatType> jmatrix(36,0), ymatrix(36,0);
        
	  if (ether.isSet("adjusttpembounds")) {
                a=1.0; b=0.0;
        }

	row=0;
	for (gamma1=0;gamma1<6;gamma1++) {
			for (p = 0; p < volume; p++, row++) {
			
			auxCreateJmatrix(jmatrix,dynVars,ether,p),auxCreateYmatrix(ymatrix,dynVars,ether,p);

	
			matrix->rowptr[row] = i;
			matrix->colind[i] = row;		
			tmp =real(jmatrix[gamma1+6*gamma1])*double(ether.modulus[p]) + ether.potential[p]+real(ymatrix[gamma1+6*gamma1]);
//                        tmp =real(jmatrix[gamma1+6*gamma1])*double(ether.modulus[p]) + ether.potential[p];
  			
			matrix->values[i] = (tmp-b)/a; /* -b because it's diagonal */
			i++;
			
				
			for (j = 0; j <  geometry.z(p); j++) {	
				k = geometry.neighbor(p,j);
				dir = geometry.scalarDirection(p,k,j);
//                               for (gamma1=0;gamma1<ether.numberOfOrbitals;gamma1++) {
				for (gamma2=0;gamma2<6;gamma2++) {
					matrix->colind[i]=k+gamma2*volume;
					matrix->values[i]=ether.bandHoppings[gamma1+gamma2*6+36*dir]/a;
					i++;
				}
//			}
			
                     }
			
			for (gamma2=0;gamma2<6;gamma2++) {
				if (gamma1==gamma2) continue;
				matrix->colind[i]=p + gamma2*volume;
				matrix->values[i]=jmatrix[gamma1+6*gamma2]*double(ether.modulus[p])/a;
				i++;
			}
			
		}
	}
						
				
			
	if (i!=ether.nonzero) {
		cerr<<"i="<<i<<" but nonzero="<<ether.nonzero<<endl;
		cerr<<"At this point: "<<__FILE__<<" "<<__LINE__<<endl;
		exit(1);
	}
	
		
}