53 typedef typename Tkspace::TransmissionMap::iterator
TransIt;
54 typedef pair<const StorageSite*, const StorageSite*>
EntryIndex;
57 Kspace(T a, T tau, T vgmag, T omega,
int ntheta,
int nphi,
const bool full) :
64 const long double pi=3.141592653589793238462643383279502884197169399;
70 long double dtheta=pi/T(ntheta)/2.;
71 long double dphi=2.*pi/T(nphi);
73 const long double Kmax=pi/a;
74 const long double Ktot=pi*pow(Kmax,3.)*4./3./pow((2.*pi),3.);
87 for(
int t=0;t<ntheta;t++)
89 theta=dtheta*(T(t)+.5);
90 for(
int p=0;p<nphi;p++)
93 const T xyFac=dtheta-cos(2*theta)*
sin(dtheta);
94 dk3=(
sin(theta)*
sin(dtheta/2.)*(dphi/pi/2.))*Ktot*W;
95 vg[0]=vgmag*xyFac*
sin(phi)*
sin(dphi/2.)/dk3*pow(Kmax,3.)/3./pow((2.*pi),3.)*W;
96 vg[1]=vgmag*xyFac*cos(phi)*
sin(dphi/2.)/dk3*pow(Kmax,3.)/3./pow((2.*pi),3.)*W;
97 vg[2]=vgmag*dphi/2.*
sin(2*theta)*
sin(dphi)/dk3*pow(Kmax,3.)/3./pow((2.*pi),3.)*W;
102 modeptr->setIndex(count);
104 Kvolptr volptr=shared_ptr<Tkvol>(
new Tkvol(modeptr,dk3));
125 for(
int m=0;m<modenum;m++)
139 for(
int m=0;m<modenum;m++)
143 const T hbar=6.582119e-16;
144 const T kb=8.617343e-5;
146 mode.
getcpRef()=kb*pow((hbar*omega/kb/Tl),2)*
147 exp(hbar*omega/kb/Tl)/pow((exp(hbar*omega/kb/Tl)-1),2);
171 for(
int m=0;m<modenum;m++)
181 Kspace(
const char* filename,
const int dimension):
186 fp_in.open(filename,ifstream::in);
192 cout<<endl<<
"Reading BZ file"<<endl;
194 cout<<
"Number of Polarizations: "<<modeNum<<endl;
196 cout<<
"Number of Wave Vector Magnitude Discretizations: "<<kPoints<<endl;
198 cout<<
"Number of Angular Discretizations: "<<directions<<endl;
199 cout<<
"Total Number of K-Space Points: "<<modeNum*kPoints*directions<<endl;
207 Modes& modes=volptr->getModes();
209 for(
int m=0;m<modeNum;m++)
259 modeptr->getVRef()=vg;
260 modeptr->getTauRef()=tau;
261 modeptr->getOmegaRef()=omega;
262 modeptr->setIndex(count);
264 modes.push_back(modeptr);
266 volptr->setdk3(weight);
276 Kspace(
const char* filename,
const int dimension,
const bool normal):
281 fp_in.open(filename,ifstream::in);
287 cout<<endl<<
"Using Shifted Normal Scattering"<<endl;
288 cout<<
"Reading BZ file"<<endl;
290 cout<<
"Number of Polarizations: "<<modeNum<<endl;
292 cout<<
"Number of Wave Vector Magnitude Discretizations: "<<kPoints<<endl;
294 cout<<
"Number of Angular Discretizations: "<<directions<<endl;
295 cout<<
"Total Number of K-Space Points: "<<modeNum*kPoints*directions<<endl;
303 Modes& modes=volptr->getModes();
305 for(
int m=0;m<modeNum;m++)
357 modeptr->getVRef()=vg;
358 modeptr->getTauRef()=tau;
359 modeptr->getTauNRef()=tauN;
360 modeptr->getOmegaRef()=omega;
361 modeptr->setIndex(count);
363 modes.push_back(modeptr);
365 volptr->setdk3(weight);
379 for(
int m=0;m<modenum;m++)
417 for(
int m=0;m<modenum;m++)
420 tauTot+=dk3/mode.
gettau();
432 while((deltaT>1e-6)&&(iters<10))
435 deltaT=(e0_tau-e_sum)/de0_taudT;
436 newguess=guess-deltaT;
437 deltaT=
fabs(deltaT/guess);
450 while((deltaT>1e-6)&&(iters<10))
452 gete0v(guess, e0, de0dT,An);
453 deltaT=e0/de0dT-e_sum/de0dT;
454 newguess=guess-deltaT;
455 deltaT=
fabs(deltaT/guess);
471 for(
int m=0;m<modenum;m++)
490 while((deltaT>1e-20)&&(iters<100))
492 gete0(guess, e0, de0dT);
493 deltaT=e0/de0dT-e_sum/de0dT;
494 newguess=guess-deltaT;
495 deltaT=
fabs(deltaT/guess);
508 while((deltaT>1e-6)&&(iters<10))
510 gete0(guess, e0, de0dT,m);
511 deltaT=(e0-e_sum)/de0dT;
512 newguess=guess-deltaT;
513 deltaT=
fabs(deltaT/guess);
523 const int m=index%modenum;
524 const int k=floor(index/modenum);
527 const T e=
gete(c,index);
532 while((deltaT>1e-6)&&(iters<10))
534 T e0=mode.
calce0(inguess);
537 inguess=guess-deltaT;
538 deltaT=
fabs(deltaT/guess);
555 for(
int m=0;m<modenum;m++)
564 void gete0(
const T Tguess, T& e0, T& de0dT,
const Tvec An)
573 for(
int m=0;m<modenum;m++)
577 T vdota=vg[0]*An[0]+vg[1]*An[1]+vg[2]*An[2];
598 for(
int m=0;m<modenum;m++)
602 T vdota=vg[0]*An[0]+vg[1]*An[1]+vg[2]*An[2];
614 void gete0(
const T Tguess, T& e0, T& de0dT)
623 for(
int m=0;m<modenum;m++)
626 e0+=mode.
calce0(Tguess)*dk3;
632 void gete0(
const T Tguess, T& e0, T& de0dT,
const T m)
641 e0+=mode.
calce0(Tguess)*dk3;
648 const T hbar=6.582119e-16;
657 for(
int m=0;m<modenum;m++)
676 for(
int m=0;m<modenum;m++)
705 T vmag1=
sqrt(pow(vg1[0],2)+pow(vg1[1],2)+pow(vg1[2],2));
707 T npol(
getkvol(0).getmodenum());
715 for(
int m=0;m<modenum;m++)
719 T vmag=
sqrt(pow(vg[0],2)+pow(vg[1],2)+pow(vg[2],2));
734 cout<<
"Average Kn: "<<AveKn<<endl;
735 cout<<
"Maximum Kn: "<<maxKn<<endl;
736 cout<<
"Minimum Kn: "<<minKn<<endl;
748 const T kmag=pow(kvec[0]*kvec[0]+
749 kvec[1]*kvec[1]+kvec[2]*kvec[2],.5);
753 const T kdotn(kvec[0]*n[0]+kvec[1]*n[1]+kvec[2]*n[2]);
755 Tvec target=kvec-n*(2.*kdotn);
764 const Tvec dif(target-kvec1);
765 const T difMag=pow(dif[0]*dif[0]+dif[1]*dif[1]+dif[2]*dif[2],.5);
775 refls.first.first=1.;
776 refls.second.first=1.;
777 refls.first.second=m1;
778 refls.second.second=-1;
789 newKvol->copyKvol(copyFromKspace.
getkvol(i));
790 _Kmesh.push_back(newKvol);
803 const T dk3=kvol.
getdk3();
805 for(
int m=0;m<modes;m++)
809 T flux=vg[0]*An[0]+vg[1]*An[1]+vg[2]*An[2];
830 for(
int m=0;m<modes;m++)
849 for(
int m=0;m<modes;m++)
880 for(
int m=0;m<modes;m++)
885 if(refls.second.second!=-1)
887 const int kk=refls.second.second;
890 (*reflInd)[count]=indx;
892 else if(refls.first.second!=-1)
894 const int kk=refls.first.second;
897 (*reflInd)[count]=indx;
916 const T dk3=kvol.
getdk3();
918 for(
int m=0;m<numModes;m++)
925 KTensor+=Dummy*tau*de0dT*dk3;
936 (*Kptr)[count]=KTensor(i,j);
953 const T dk3=kvol.
getdk3();
955 for(
int m=0;m<numModes;m++)
961 K[count]=vg[0]*vg[0]*tau*de0dT*dk3;
978 const T dk3=kvol.
getdk3();
980 for(
int m=0;m<numModes;m++)
985 K[count]=vg[0]*de0dT*dk3;
997 out(i,j)=v1[i]*v2[j];
1003 BTPtr->first=
dynamic_cast<TArray*
>(freqBins);
1004 BTPtr->second=
dynamic_cast<TArray*
>(transArray);
1016 if(freq<freqBins[minInd] || freq>freqBins[maxInd])
1017 throw CException(
"Frequency not in the given range!");
1021 int mid=floor((minInd+maxInd)/2.);
1022 T midFreq=freqBins[mid];
1027 if(freq<=freqBins[minInd+1])
1028 return trans[minInd];
1033 if(freq>freqBins[maxInd-1])
1034 return trans[maxInd-1];
1042 typename TransmissionMap::const_iterator pos=
_transMap.find(&toKspace);
1044 return *((pos->second).second);
1046 throw CException(
"getTransArray: Transmission not set!");
1061 for(
int m=0;m<numModes;m++)
1065 const T VdotA=An[0]*vg[0]+An[1]*vg[1]+An[2]*vg[2];
1069 const T e0=mode.
calce0(T0);
1071 heatRate0+=t01*VdotA*dk3*e0/DK0;
1076 for(
int k=0;k<k1len;k++)
1081 for(
int m=0;m<numModes;m++)
1085 const T VdotA=An[0]*vg[0]+An[1]*vg[1]+An[2]*vg[2];
1089 const T e0=mode.
calce0(T1);
1091 heatRate1+=t10*VdotA*dk3*e0/DK0;
1096 heatRate1/=heatRate0;
1097 heatRate1=1+heatRate1;
1098 heatRate1*=heatRate0*DK0;
1110 while((deltaT>1e-6)&&(iters<10))
1116 const int k=kpts[i];
1117 const int m=mpts[i];
1120 e0sum+=mode.
calce0(newguess)*dk3;
1123 deltaT=(e0sum-eSum)/de0sum;
1125 deltaT=
fabs(deltaT)/newguess;
1146 for(
int m=0;m<numModes;m++)
1150 const T VdotA=An[0]*vg[0]+An[1]*vg[1]+An[2]*vg[2];
1154 const T e0=mode.
calce0(T0);
1156 heatRate0+=t01*VdotA*dk3*e0/DK0;
1163 for(
int k=0;k<k1len;k++)
1168 for(
int m=0;m<numModes;m++)
1172 const T VdotA=An[0]*vg[0]+An[1]*vg[1]+An[2]*vg[2];
1176 const T e0=mode.
calce0(T1);
1178 heatRate1-=(1.-t10)*VdotA*dk3*e0/DK0;
1181 sumVdotA+=VdotA*dk3/DK0;
1185 heatRate1=heatRate0/sumVdotA+heatRate1/sumVdotA;
1196 Tkspace* fineToKspace=it->first;
1197 if(fineToKspace!=NULL)
1200 coarseTrans[coarseToKspace]=(it->second);
1236 for(
int i=start; i<end; i++)
1237 o[i-start]=(*
_e)[i];
1244 for(
int i=start; i<end; i++)
1245 o[i-start]=(*
_e0)[i];
1250 const T hbar(6.582119e-16);
1253 for(
int i=start; i<end; i++)
1261 for(
int i=start; i<end; i++)
1262 (*
_e)[i]=o[i-start];
1269 for(
int i=start; i<end; i++)
1277 for(
int i=start; i<end; i++)
1285 for(
int i=start; i<end; i++)
1305 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap)
1312 if ( to_where != -1 )
1314 int mpi_tag = oSite.
getTag();
1315 request_send[indxSend++] =
1316 MPI::COMM_WORLD.Isend( sendArray.
getData(), sendArray.
getDataSize(), MPI::BYTE, to_where, mpi_tag );
1323 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap)
1330 if ( from_where != -1 )
1332 int mpi_tag = oSite.
getTag();
1333 request_recv[indxRecv++] =
1334 MPI::COMM_WORLD.Irecv( recvArray.
getData(), recvArray.
getDataSize(), MPI::BYTE, from_where, mpi_tag );
1340 MPI::Request::Waitall( count, request_recv );
1341 MPI::Request::Waitall( count, request_send );
1354 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap)
1358 const Array<int>& fromIndices = *(mpos.second);
1363 const int cellCount = fromIndices.
getLength();
1367 for(
int index=0;index<cellCount;index++)
1369 const int c=fromIndices[index];
1374 ghostArray[ghostIndex]=(*_e)[cKindex];
1386 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap)
1390 const Array<int>& toIndices = *(mpos.second);
1403 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap)
1406 const Array<int>& toIndices = *(mpos.second);
1412 err <<
"Kspace::syncScatter: ghost array not found for"
1418 const int cellCount=toIndices.
getLength();
1421 for(
int index=0;index<cellCount;index++)
1423 const int c=toIndices[index];
1428 (*_e)[cKindex]=ghostArray[ghostIndex];
1441 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap)
1457 for(
int m=0;m<modenum;m++)
1461 vals[index]=mode.
calce0(Tl);
1479 _ScattKernel->scatterPhonons(c, totIts, C, B, V, newE, cv);
1496 for(
int i=beg;i<fin;i++)
1514 const T dk3=kvol.
getdk3();
1515 for(
int m=0;m<modes;m++)
1519 (*S)[cnt]=((*_e0)[ind]-(*_e)[ind])/tau*(dk3/
_totvol);
1593 for(
int m=0;m<modenum;m++)
1595 (*e)[index]=(*_e0)[cnt]*(dk3/
_totvol);
1627 for(
int m=0;m<modenum;m++)
1630 (*e)[index]=mode.
gettau();
1647 for(
int m=0;m<modenum;m++)
1656 throw CException(
"Array not same length: weightArray");
1668 for(
int m=0;m<modenum;m++)
1677 {
return new TArray(length);}
1685 for(
int m=0;m<modenum;m++)
1700 for(
int i=beg;i<fin;i++)
1702 BVec[index]+=(*_Source)[i]*cv;
T & getFas(const int cell, const int count)
void geteCellVals(const int c, TArray &o)
shared_ptr< Reflection > Reflptr
Tkspace::TransmissionMap::iterator TransIt
void gete0(const T Tguess, T &e0, T &de0dT, const T m)
pair< Reflection, Reflection > Refl_pair
T calcSpecificHeat(T Tl, const int m)
void getnCellVals(const int c, TArray &o)
Refl_pair & getReflpair(int i)
virtual int getDataSize() const =0
void createSyncGather(const StorageSite &site)
void setFASArray(TArrPtr FASPtr)
void NewtonSolve(T &guess, const T e_sum)
void setCoarseKspace(Tkspace *cK)
void syncLocal(const StorageSite &site)
void syncScatter(const StorageSite &site)
void gete0CellVals(const int c, TArray &o)
ArrayBase * getFreqArrayPy()
void gete0_tau(T &Tguess, T &e0tau, T &de0taudT)
void findSpecs(const Tvec n, const int m, const int k, Refl_pair &refls)
void setCpNonGray(const T Tl)
ArrayBase * getModewiseBallisticConductance(const T Tl)
T findTransmission(Tkspace &toKspace, const T freq)
void updateTau(const int c, const T Tl)
T getde0taudT(const int c, T Tl)
map< Tkspace *, pair< TArray *, TArray * > > TransmissionMap
Tmode::Reflection Reflection
void setTauArray(TArrPtr TauPtr)
Tkvol & getkvol(int n) const
Tmode & getmode(int n) const
void seteArray(TArrPtr ePtr)
TArray & getTransArray(Tkspace &toKspace)
void outerProduct(const Tvec &v1, const Tvec &v2, T3Tensor &out)
Kspace(T a, T tau, T vgmag, T omega, int ntheta, int nphi, const bool full)
T & getRes(const int cell, const int count)
ArrayBase * gete0CellVars(const int c)
Tkspace * getCoarseKspace()
T calcLatTemp(const int c)
Kspace(const char *filename, const int dimension)
DensityOfStates< T > * _DOS
Kspace(const char *filename, const int dimension, const bool normal)
void syncGather(const StorageSite &site)
shared_ptr< TArray > TArrPtr
T calcDiffuseE(Tkspace &kspace1, const Tvec &An, const T T0, const T T1)
T & gete(const int cell, const int count)
void calcTemp(T &guess, const T e_sum, const Tvec An)
void setTref(const T Tref)
map< int, Refl_pair > Refl_Map
pair< const StorageSite *, const StorageSite * > EntryIndex
Tangent sqrt(const Tangent &a)
void addFAS(const int c, TArray &Bvec)
void setTransmission(Tkspace &toKspace, ArrayBase *freqBins, ArrayBase *transArray)
ArrayBase * getEmptyArray(const int length)
void setResArray(TArrPtr ResPtr)
ArrayBase * getWaveVectors()
void calcTemp(T &guess, const T e_sum)
int getGlobalIndex(const int cell, const int count)
ArrayBase * getIIsources(const int c, const bool correct)
void setResidCell(const int c, const TArray &o)
int get_request_size(const StorageSite &site)
ArrayBase * getModewiseHollandConductivity(const T Tl)
void resize(const int newLength)
void gete0(const T Tguess, T &e0, T &de0dT, const Tvec An)
int getGatherProcID() const
ArrayBase * getRTAsources(const int c)
void getVelocities(TvecArray &v)
ArrayBase * getFullsources(const int c)
void setTref(const T Tref)
TransmissionMap _transMap
Tangent sin(const Tangent &a)
map< EntryIndex, shared_ptr< ArrayBase > > GhostArrayMap
T calcBallisticInterface(Tkspace &kspace1, const Tvec &An, const T T0, const T T1)
void gete0(const T Tguess, T &e0, T &de0dT)
T calcModeTemp(T guess, const T e_sum, const T m)
ArrayBase * geteCellValsPy(const int c)
void setDOS(DensityOfStates< T > &DOS)
const T getTau(const int index)
ArrayBase * getReflectionArray(const Mesh &mesh, const int FgId)
ArrayBase * getSourceDeriv(const int c)
void weightArray(TArray &e)
T calcPhononTemp(const int c, const int index, T guess)
Tmode::Refl_pair Refl_pair
ArrayBase * getVelocities(const int M)
vector< Tkspace * > TkspList
ArrayBase * getHollandConductivity(const T Tl)
ArrayBase * getIsources(const int c, const bool correct)
ArrayBase * getTauArrayPy()
TArray & getSourceArray()
T & getInj(const int cell, const int count)
const ScatterMap & getScatterMap() const
map< const StorageSite *, shared_ptr< Array< int > > > ScatterMap
SquareTensor< T, 3 > T3Tensor
DensityOfStates< T > * getDOSptr()
void getEquilibriumArray(TArray &vals, const T Tl)
Tangent fabs(const Tangent &a)
void CopyKspace(Tkspace ©FromKspace)
T findKnStats(const T length)
void ScatterPhonons(const int c, const int totIts, TArray &C, TArray &B, const TArray &V, TArray &newE, const T cv)
ScatteringKernel< T > * _ScattKernel
T FindBallisticHeatRate(const Tvec An, const T T1, const T T2)
void setRelTimeFunction(const T A, const T B, const T C)
const GatherMap & getGatherMap() const
ArrayBase * getSourceArrayPy()
shared_ptr< Tkvol > Kvolptr
void addSource(const int c, TArray &BVec, const T cv)
virtual void * getData() const =0
shared_ptr< Tmode > Tmodeptr
void makeDegenerate(const int m)
pair< T, int > Reflection
map< const StorageSite *, shared_ptr< Array< int > > > GatherMap
void setScattKernel(ScatteringKernel< T > &Sk)
T & gete0(const int cell, const int count)
T calcBandTemp(const T guess, const T eSum, const IntArray &kpts, const IntArray &mpts)
void setSourceArray(TArrPtr SPtr)
void getSourceTerm(const int c, TArray &s, TArray &ds)
ArrayBase * gete0CellValsPy(const T Tl)
ArrayBase * getVelocities()
GhostArrayMap _ghostArrays
void seteCellVals(const int c, const TArray &o)
pair< TArray *, TArray * > BinAndTrans
void sete0Array(TArrPtr e0Ptr)
TransmissionMap & getTransMap()
void gete0v(const T Tguess, T &e0, T &de0dT, const Tvec An)
void weightArray(ArrayBase *ep)
void setInjArray(TArrPtr InjPtr)
void addFASint(const int c, TArray &Bvec)