Memosa-FVM  0.2
Kspace.h
Go to the documentation of this file.
1 // This file os part of FVM
2 // Copyright (c) 2012 FVM Authors
3 // See LICENSE file for terms.
4 
5 #ifndef _KSPACE_H_
6 #define _KSPACE_H_
7 
8 #ifdef FVM_PARALLEL
9 #include <mpi.h>
10 #endif
11 
12 #include <iostream>
13 #include <fstream>
14 #include<string>
15 #include <vector>
16 #include <math.h>
17 #include "Vector.h"
18 #include "pmode.h"
19 #include "kvol.h"
20 #include "SquareTensor.h"
21 #include "ScatteringKernel.h"
22 #include "RelaxationTimeFunction.h"
23 
24 template<class T>
25 class DensityOfStates;
26 
27 template<class T>
28 class Kspace
29 {
30 
31  public:
32 
33  typedef Kspace<T> Tkspace;
34  typedef vector<Tkspace*> TkspList;
35  typedef Array<T> TArray;
36  typedef shared_ptr<TArray> TArrPtr;
37  typedef Vector<T,3> Tvec;
40  typedef pmode<T> Tmode;
41  typedef shared_ptr<Tmode> Tmodeptr;
42  typedef vector<Tmodeptr> Modes;
43  typedef kvol<T> Tkvol;
44  typedef shared_ptr<Tkvol> Kvolptr;
45  typedef vector<Kvolptr> Volvec;
47  typedef typename Tmode::Reflection Reflection;
48  typedef typename Tmode::Reflptr Reflptr;
49  typedef typename Tmode::Refl_pair Refl_pair;
50  typedef typename Tmode::Refl_Map Refl_Map;
51  typedef pair<TArray*, TArray*> BinAndTrans;
52  typedef map<Tkspace*,pair<TArray*,TArray*> > TransmissionMap;
53  typedef typename Tkspace::TransmissionMap::iterator TransIt;
54  typedef pair<const StorageSite*, const StorageSite*> EntryIndex;
55  typedef map<EntryIndex, shared_ptr<ArrayBase> > GhostArrayMap;
56 
57  Kspace(T a, T tau, T vgmag, T omega, int ntheta, int nphi, const bool full) :
58  _length(ntheta*nphi),
59  _Kmesh(),
60  _totvol(0.),
61  _freqArray(0)
62  { //makes gray, isotropic kspace
63 
64  const long double pi=3.141592653589793238462643383279502884197169399;
65  //long double sumX(0);
66  //long double sumY(0);
67  //long double sumZ(0);
68  long double theta;
69  long double phi;
70  long double dtheta=pi/T(ntheta)/2.;
71  long double dphi=2.*pi/T(nphi);
72  long double dk3;
73  const long double Kmax=pi/a;
74  const long double Ktot=pi*pow(Kmax,3.)*4./3./pow((2.*pi),3.);
75  Tvec vg;
76  int count=1;
77  T W=2.;
78 
79  if(full)
80  {
81  W=1.;
82  dtheta*=2;
83  }
84 
85  _freqArray.resize(ntheta*nphi);
86  _freqArray=omega;
87  for(int t=0;t<ntheta;t++)
88  {
89  theta=dtheta*(T(t)+.5);
90  for(int p=0;p<nphi;p++)
91  {
92  phi=dphi*(T(p)+.5);
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;
98  //vg[0]=vgmag*sin(theta)*sin(phi);
99  //vg[1]=vgmag*sin(theta)*cos(phi);
100  //vg[2]=vgmag*cos(theta);
101  Tmodeptr modeptr=shared_ptr<Tmode>(new Tmode(vg,omega,tau));
102  modeptr->setIndex(count);
103  count++;
104  Kvolptr volptr=shared_ptr<Tkvol>(new Tkvol(modeptr,dk3));
105  volptr->setkvec(vg);
106  _Kmesh.push_back(volptr);
107  _totvol+=dk3;
108  }
109  }
110  makeFreqArray();
111  }
112 
114  _freqArray(0),
115  _coarseKspace(NULL)
116  {}
117 
118  void setCp(const T cp)
119  {//input the total specific heat in eV/m^3/K
120 
121  for(int k=0;k<_length;k++)
122  {
123  Tkvol& kv=getkvol(k);
124  const int modenum=kv.getmodenum();
125  for(int m=0;m<modenum;m++)
126  {
127  Tmode& mode=kv.getmode(m);
128  mode.getcpRef()=cp/_totvol;
129  }
130  }
131  }
132 
133  void setCpNonGray(const T Tl)
134  {
135  for(int k=0;k<_length;k++)
136  {
137  Tkvol& kv=getkvol(k);
138  const int modenum=kv.getmodenum();
139  for(int m=0;m<modenum;m++)
140  {
141  Tmode& mode=kv.getmode(m);
142  const T omega=mode.getomega();
143  const T hbar=6.582119e-16; // (eV s)
144  const T kb=8.617343e-5; // (eV/K)
145 
146  mode.getcpRef()=kb*pow((hbar*omega/kb/Tl),2)*
147  exp(hbar*omega/kb/Tl)/pow((exp(hbar*omega/kb/Tl)-1),2);
148  }
149  }
150  }
151 
152  void makeDegenerate(const int m)
153  {
154  for(int k=0;k<_length;k++)
155  {
156  Tkvol& kv=getkvol(k);
157  const int modenum=kv.getmodenum();
158  Tmode& mode=kv.getmode(m);
159  mode.getcpRef()*=2.;
160  }
161  }
162 
164  {
166  int count=0;
167  for(int k=0;k<_length;k++)
168  {
169  Tkvol& kv=getkvol(k);
170  const int modenum=kv.getmodenum();
171  for(int m=0;m<modenum;m++)
172  {
173  Tmode& mode=kv.getmode(m);
174  const T omega=mode.getomega();
175  _freqArray[count]=omega;
176  count++;
177  }
178  }
179  }
180 
181  Kspace(const char* filename,const int dimension):
182  _freqArray(0),
183  _coarseKspace(NULL)
184  {
185  ifstream fp_in;
186  fp_in.open(filename,ifstream::in);
187 
188  int modeNum;
189  int kPoints;
190  int directions;
191 
192  cout<<endl<<"Reading BZ file"<<endl;
193  fp_in>>modeNum;
194  cout<<"Number of Polarizations: "<<modeNum<<endl;
195  fp_in>>kPoints;
196  cout<<"Number of Wave Vector Magnitude Discretizations: "<<kPoints<<endl;
197  fp_in>>directions;
198  cout<<"Number of Angular Discretizations: "<<directions<<endl;
199  cout<<"Total Number of K-Space Points: "<<modeNum*kPoints*directions<<endl;
200 
201  _length=kPoints*directions;
202  int count=1;
203 
204  for(int k=0;k<_length;k++)
205  {
206  Kvolptr volptr=shared_ptr<Tkvol>(new Tkvol(modeNum));
207  Modes& modes=volptr->getModes();
208 
209  for(int m=0;m<modeNum;m++)
210  {
211  T Tdummy(0.);
212  T omega(0.);
213  T tau(0.);
214  Tvec vg;
215  Tvec K;
216  T weight(0.);
217  Tmodeptr modeptr=shared_ptr<Tmode>(new Tmode());
218  fp_in>>Tdummy;
219  fp_in>>weight;
220  fp_in>>omega;
221  fp_in>>Tdummy;
222  K[0]=Tdummy;
223 
224  if(dimension==2)
225  {
226  fp_in>>Tdummy;
227  K[1]=Tdummy;
228  K[2]=0.;
229  }
230 
231  if(dimension==3)
232  {
233  fp_in>>Tdummy;
234  K[1]=Tdummy;
235  fp_in>>Tdummy;
236  K[2]=Tdummy;
237  }
238 
239  fp_in>>Tdummy;
240  vg[0]=Tdummy;
241 
242  if(dimension==2)
243  {
244  fp_in>>Tdummy;
245  vg[1]=Tdummy;
246  vg[2]=0.;
247  }
248 
249  if(dimension==3)
250  {
251  fp_in>>Tdummy;
252  vg[1]=Tdummy;
253  fp_in>>Tdummy;
254  vg[2]=Tdummy;
255  }
256 
257  fp_in>>tau;
258 
259  modeptr->getVRef()=vg;
260  modeptr->getTauRef()=tau;
261  modeptr->getOmegaRef()=omega;
262  modeptr->setIndex(count);
263  count++;
264  modes.push_back(modeptr);
265  volptr->setkvec(K);
266  volptr->setdk3(weight);
267  }
268  _Kmesh.push_back(volptr);
269  }
270 
271  fp_in.close();
272  calcDK3();
273  makeFreqArray();
274  }
275 
276  Kspace(const char* filename,const int dimension,const bool normal):
277  _freqArray(0),
278  _coarseKspace(NULL)
279  {
280  ifstream fp_in;
281  fp_in.open(filename,ifstream::in);
282 
283  int modeNum;
284  int kPoints;
285  int directions;
286 
287  cout<<endl<<"Using Shifted Normal Scattering"<<endl;
288  cout<<"Reading BZ file"<<endl;
289  fp_in>>modeNum;
290  cout<<"Number of Polarizations: "<<modeNum<<endl;
291  fp_in>>kPoints;
292  cout<<"Number of Wave Vector Magnitude Discretizations: "<<kPoints<<endl;
293  fp_in>>directions;
294  cout<<"Number of Angular Discretizations: "<<directions<<endl;
295  cout<<"Total Number of K-Space Points: "<<modeNum*kPoints*directions<<endl;
296 
297  _length=kPoints*directions;
298  int count=1;
299 
300  for(int k=0;k<_length;k++)
301  {
302  Kvolptr volptr=shared_ptr<Tkvol>(new Tkvol(modeNum));
303  Modes& modes=volptr->getModes();
304 
305  for(int m=0;m<modeNum;m++)
306  {
307  T Tdummy(0.);
308  T omega(0.);
309  T tau(0.);
310  T tauN(0.);
311  Tvec vg;
312  Tvec K;
313  T weight(0.);
314  Tmodeptr modeptr=shared_ptr<Tmode>(new Tmode());
315  fp_in>>Tdummy;
316  fp_in>>weight;
317  fp_in>>omega;
318  fp_in>>Tdummy;
319  K[0]=Tdummy;
320 
321  if(dimension==2)
322  {
323  fp_in>>Tdummy;
324  K[1]=Tdummy;
325  K[2]=0.;
326  }
327 
328  if(dimension==3)
329  {
330  fp_in>>Tdummy;
331  K[1]=Tdummy;
332  fp_in>>Tdummy;
333  K[2]=Tdummy;
334  }
335 
336  fp_in>>Tdummy;
337  vg[0]=Tdummy;
338 
339  if(dimension==2)
340  {
341  fp_in>>Tdummy;
342  vg[1]=Tdummy;
343  vg[2]=0.;
344  }
345 
346  if(dimension==3)
347  {
348  fp_in>>Tdummy;
349  vg[1]=Tdummy;
350  fp_in>>Tdummy;
351  vg[2]=Tdummy;
352  }
353 
354  fp_in>>tau;
355  fp_in>>tauN;
356 
357  modeptr->getVRef()=vg;
358  modeptr->getTauRef()=tau;
359  modeptr->getTauNRef()=tauN;
360  modeptr->getOmegaRef()=omega;
361  modeptr->setIndex(count);
362  count++;
363  modes.push_back(modeptr);
364  volptr->setkvec(K);
365  volptr->setdk3(weight);
366  }
367  _Kmesh.push_back(volptr);
368  }
369 
370  fp_in.close();
371  calcDK3();
372 
374 
375  for(int k=0;k<_length;k++)
376  {
377  Tkvol& kv=getkvol(k);
378  const int modenum=kv.getmodenum();
379  for(int m=0;m<modenum;m++)
380  {
381  Tmode& mode=kv.getmode(m);
382  const int index=mode.getIndex()-1;
383  _freqArray[index]=mode.getomega();
384  }
385  }
386 
387  }
388 
389  //void setvol(int n,Tkvol k) {*_Kmesh[n]=k;}
390  Tkvol& getkvol(int n) const {return *_Kmesh[n];}
391  int getlength() const {return _length;}
392  T gethbar() {return 6.582119e-16;}
394  {
395  return (_Kmesh[0]->getmodenum())*_length;
396  }
398  {
399  T r(0.0);
400  for(int k=0;k<_length;k++)
401  {
402  Tkvol& kv=getkvol(k);
403  r+=kv.getdk3();
404  }
405  _totvol=r;
406  return r;
407  }
408  T getDK3() const {return _totvol;}
410  { // returns sum(dk3/tau)
411  T tauTot=0.;
412  for(int k=0;k<_length;k++)
413  {
414  Tkvol& kv=getkvol(k);
415  const int modenum=kv.getmodenum();
416  T dk3=kv.getdk3();
417  for(int m=0;m<modenum;m++)
418  {
419  Tmode& mode=kv.getmode(m);
420  tauTot+=dk3/mode.gettau();
421  }
422  }
423  return tauTot;
424  }
425  void NewtonSolve(T& guess, const T e_sum)
426  {
427  T e0_tau;
428  T de0_taudT;
429  T deltaT=1.;
430  T newguess;
431  int iters=0;
432  while((deltaT>1e-6)&&(iters<10))
433  {
434  gete0_tau(guess,e0_tau,de0_taudT);
435  deltaT=(e0_tau-e_sum)/de0_taudT;
436  newguess=guess-deltaT;
437  deltaT=fabs(deltaT/guess);
438  guess=newguess;
439  iters++;
440  }
441  }
442 
443  void calcTemp(T& guess, const T e_sum, const Tvec An)
444  {
445  T e0;
446  T de0dT;
447  T deltaT=1.;
448  T newguess;
449  int iters=0;
450  while((deltaT>1e-6)&&(iters<10))
451  {
452  gete0v(guess, e0, de0dT,An);
453  deltaT=e0/de0dT-e_sum/de0dT;
454  newguess=guess-deltaT;
455  deltaT=fabs(deltaT/guess);
456  guess=newguess;
457  iters++;
458  }
459  }
460 
461  T calcLatTemp(const int c)
462  {
463  int cInd(getGlobalIndex(c,0));
464  T esum(0);
465  T guess(300);
466  for(int k=0;k<_length;k++)
467  {
468  Tkvol& kv=getkvol(k);
469  const int modenum=kv.getmodenum();
470  T dk3=kv.getdk3();
471  for(int m=0;m<modenum;m++)
472  {
473  esum+=(*_e)[cInd]*dk3/_totvol;
474  cInd++;
475  }
476  }
477  esum*=_totvol;
478  calcTemp(guess,esum);
479  return guess;
480 
481  }
482 
483  void calcTemp(T& guess, const T e_sum)
484  {
485  T e0;
486  T de0dT;
487  T deltaT=1.;
488  T newguess;
489  int iters=0;
490  while((deltaT>1e-20)&&(iters<100))
491  {
492  gete0(guess, e0, de0dT);
493  deltaT=e0/de0dT-e_sum/de0dT;
494  newguess=guess-deltaT;
495  deltaT=fabs(deltaT/guess);
496  guess=newguess;
497  iters++;
498  }
499  }
500 
501  T calcModeTemp(T guess, const T e_sum, const T m)
502  {
503  T e0;
504  T de0dT;
505  T deltaT=1.;
506  T newguess;
507  int iters=0;
508  while((deltaT>1e-6)&&(iters<10))
509  {
510  gete0(guess, e0, de0dT,m);
511  deltaT=(e0-e_sum)/de0dT;
512  newguess=guess-deltaT;
513  deltaT=fabs(deltaT/guess);
514  guess=newguess;
515  iters++;
516  }
517  return guess;
518  }
519 
520  T calcPhononTemp(const int c, const int index, T guess)
521  {
522  const int modenum=getkvol(0).getmodenum();
523  const int m=index%modenum;
524  const int k=floor(index/modenum);
525  Tkvol& kv=getkvol(k);
526  Tmode& mode=kv.getmode(m);
527  const T e=gete(c,index);
528  T deltaT=1.;
529  int iters=0;
530  T inguess=guess;
531 
532  while((deltaT>1e-6)&&(iters<10))
533  {
534  T e0=mode.calce0(inguess);
535  T de0dT=mode.calcde0dT(inguess);
536  deltaT=(e0-e)/de0dT;
537  inguess=guess-deltaT;
538  deltaT=fabs(deltaT/guess);
539  guess=inguess;
540  iters++;
541  }
542  return guess;
543 
544  }
545 
546  void gete0_tau(T& Tguess, T& e0tau, T& de0taudT)
547  {
548  e0tau=0.;
549  de0taudT=0.;
550  for(int k=0;k<_length;k++)
551  {
552  Tkvol& kv=getkvol(k);
553  const int modenum=kv.getmodenum();
554  T dk3=kv.getdk3();
555  for(int m=0;m<modenum;m++)
556  {
557  Tmode& mode=kv.getmode(m);
558  e0tau+=mode.calce0tau(Tguess)*dk3;
559  de0taudT+=mode.calcde0taudT(Tguess)*dk3;
560  }
561  }
562  }
563 
564  void gete0(const T Tguess, T& e0, T& de0dT, const Tvec An)
565  {
566  e0=0.;
567  de0dT=0.;
568  for(int k=0;k<_length;k++)
569  {
570  Tkvol& kv=getkvol(k);
571  const int modenum=kv.getmodenum();
572  T dk3=kv.getdk3();
573  for(int m=0;m<modenum;m++)
574  {
575  Tmode& mode=kv.getmode(m);
576  Tvec vg=mode.getv();
577  T vdota=vg[0]*An[0]+vg[1]*An[1]+vg[2]*An[2];
578  if(vdota>0)
579  {
580  e0+=mode.calce0(Tguess)*dk3/_totvol;
581  de0dT+=mode.calcde0dT(Tguess)*dk3/_totvol;
582  }
583  }
584  }
585  e0*=_totvol;
586  de0dT*=_totvol;
587  }
588 
589  void gete0v(const T Tguess, T& e0, T& de0dT, const Tvec An)
590  {
591  e0=0.;
592  de0dT=0.;
593  for(int k=0;k<_length;k++)
594  {
595  Tkvol& kv=getkvol(k);
596  const int modenum=kv.getmodenum();
597  T dk3=kv.getdk3();
598  for(int m=0;m<modenum;m++)
599  {
600  Tmode& mode=kv.getmode(m);
601  Tvec vg=mode.getv();
602  T vdota=vg[0]*An[0]+vg[1]*An[1]+vg[2]*An[2];
603  if(vdota>0)
604  {
605  e0+=mode.calce0(Tguess)*dk3/_totvol*vdota;
606  de0dT+=mode.calcde0dT(Tguess)*dk3/_totvol*vdota;
607  }
608  }
609  }
610  e0*=_totvol;
611  de0dT*=_totvol;
612  }
613 
614  void gete0(const T Tguess, T& e0, T& de0dT)
615  {
616  e0=0.;
617  de0dT=0.;
618  for(int k=0;k<_length;k++)
619  {
620  Tkvol& kv=getkvol(k);
621  const int modenum=kv.getmodenum();
622  T dk3=kv.getdk3();
623  for(int m=0;m<modenum;m++)
624  {
625  Tmode& mode=kv.getmode(m);
626  e0+=mode.calce0(Tguess)*dk3;
627  de0dT+=mode.calcde0dT(Tguess)*dk3;
628  }
629  }
630  }
631 
632  void gete0(const T Tguess, T& e0, T& de0dT, const T m)
633  {
634  e0=0.;
635  de0dT=0.;
636  for(int k=0;k<_length;k++)
637  {
638  Tkvol& kv=getkvol(k);
639  T dk3=kv.getdk3();
640  Tmode& mode=kv.getmode(m);
641  e0+=mode.calce0(Tguess)*dk3;
642  de0dT+=mode.calcde0dT(Tguess)*dk3;
643  }
644  }
645 
646  T getde0taudT(const int c, T Tl)
647  {
648  const T hbar=6.582119e-16; // (eV s)
649 
650  T de0taudT=0.;
651  int index=getGlobalIndex(c,0);
652  for(int k=0;k<_length;k++)
653  {
654  Tkvol& kv=getkvol(k);
655  const int modenum=kv.getmodenum();
656  T dk3=kv.getdk3();
657  for(int m=0;m<modenum;m++)
658  {
659  Tmode& mode=kv.getmode(m);
660  //T energy=hbar*mode.getomega();
661  de0taudT+=mode.calcde0dT(Tl)*dk3/_totvol/(*_Tau)[index];
662  index++;
663  }
664  }
665  return de0taudT;
666  }
667 
669  {
670  T r(0.0);
671  for(int k=0;k<_length;k++)
672  {
673  Tkvol& kv=getkvol(k);
674  const int modenum=kv.getmodenum();
675  T dk3=kv.getdk3();
676  for(int m=0;m<modenum;m++)
677  {
678  Tmode& mode=kv.getmode(m);
679  r+=mode.calcde0dT(Tl)*dk3;
680  }
681  }
682  return r;
683  }
684 
685  T calcSpecificHeat(T Tl,const int m)
686  {
687  T r(0.0);
688  for(int k=0;k<_length;k++)
689  {
690  Tkvol& kv=getkvol(k);
691  T dk3=kv.getdk3();
692  Tmode& mode=kv.getmode(m);
693  r+=mode.calcde0dT(Tl)*dk3;
694  }
695  return r;
696  }
697 
698  T findKnStats(const T length)
699  {
700  T AveKn(0.0);
701  T maxKn(0.0);
702  T minKn;
703 
704  Tvec vg1=getkvol(0).getmode(0).getv();
705  T vmag1=sqrt(pow(vg1[0],2)+pow(vg1[1],2)+pow(vg1[2],2));
706  T tau1=getkvol(0).getmode(0).gettau();
707  T npol(getkvol(0).getmodenum());
708  minKn=vmag1*tau1;
709 
710  for(int k=0;k<_length;k++)
711  {
712  Tkvol& kv=getkvol(k);
713  const int modenum=kv.getmodenum();
714  T dk3=kv.getdk3();
715  for(int m=0;m<modenum;m++)
716  {
717  Tmode& mode=kv.getmode(m);
718  Tvec vg=mode.getv();
719  T vmag=sqrt(pow(vg[0],2)+pow(vg[1],2)+pow(vg[2],2));
720  T tau=mode.gettau();
721  AveKn+=vmag*tau*dk3/_totvol;
722  if(vmag*tau>maxKn)
723  maxKn=vmag*tau;
724  if(vmag*tau<minKn)
725  minKn=vmag*tau;
726 
727  }
728  }
729  AveKn/=length;
730  AveKn/=npol;
731  maxKn/=length;
732  minKn/=length;
733 
734  cout<<"Average Kn: "<<AveKn<<endl;
735  cout<<"Maximum Kn: "<<maxKn<<endl;
736  cout<<"Minimum Kn: "<<minKn<<endl;
737 
738  return AveKn;
739 
740  }
741 
742  void findSpecs(const Tvec n, const int m, const int k, Refl_pair& refls)
743  {
744 
745  Tkvol& kvol=getkvol(k);
746  Tmode& mode=kvol.getmode(m);
747  Tvec kvec=mode.getv();
748  const T kmag=pow(kvec[0]*kvec[0]+
749  kvec[1]*kvec[1]+kvec[2]*kvec[2],.5);
750  Tvec nk(kvec);
751  nk/=kmag;
752 
753  const T kdotn(kvec[0]*n[0]+kvec[1]*n[1]+kvec[2]*n[2]);
754 
755  Tvec target=kvec-n*(2.*kdotn);
756  T minDif(1e50);
757  int m1;
758 
759  for(int k1=0;k1<_length;k1++)
760  {
761  Tkvol& kvol1=getkvol(k1);
762  Tmode& mode1=kvol1.getmode(m);
763  const Tvec kvec1=mode1.getv();
764  const Tvec dif(target-kvec1);
765  const T difMag=pow(dif[0]*dif[0]+dif[1]*dif[1]+dif[2]*dif[2],.5);
766 
767  if(difMag<minDif)
768  {
769  m1=k1;
770  minDif=difMag;
771  }
772 
773  }
774 
775  refls.first.first=1.;
776  refls.second.first=1.;
777  refls.first.second=m1; //refls.first-- to whom the mode dumps energy
778  refls.second.second=-1; //refls.second-- from whom the mode receices energy
779  }
780 
781  void CopyKspace(Tkspace& copyFromKspace)
782  {
783  _length=copyFromKspace.getlength();
784  _totvol=copyFromKspace.getDK3();
785  _Kmesh.clear();
786  for(int i=0;i<_length;i++)
787  {
788  Kvolptr newKvol=Kvolptr(new Tkvol());
789  newKvol->copyKvol(copyFromKspace.getkvol(i));
790  _Kmesh.push_back(newKvol);
791  }
792 
793  setDOS(*copyFromKspace.getDOSptr());
794 
795  }
796 
797  T FindBallisticHeatRate(const Tvec An,const T T1,const T T2)
798  {
799  T q=0.;
800  for(int k=0;k<_length;k++)
801  {
802  Tkvol& kvol=getkvol(k);
803  const T dk3=kvol.getdk3();
804  const int modes=kvol.getmodenum();
805  for(int m=0;m<modes;m++)
806  {
807  Tmode& mode=kvol.getmode(m);
808  Tvec vg=mode.getv();
809  T flux=vg[0]*An[0]+vg[1]*An[1]+vg[2]*An[2];
810  T e0;
811  if(flux>0.)
812  e0=mode.calce0(T2);
813  else
814  e0=mode.calce0(T1);
815  q+=flux*e0*dk3;
816  }
817  }
818  return q;
819  }
820 
822  {
823  const int allModes=gettotmodes();
824  TvecArray* Velocities=new TvecArray(allModes);
825 
826  for(int k=0;k<_length;k++)
827  {
828  Tkvol& kvol=getkvol(k);
829  const int modes=kvol.getmodenum();
830  for(int m=0;m<modes;m++)
831  {
832  const int count=kvol.getmode(m).getIndex()-1;
833  (*Velocities)[count]=kvol.getmode(m).getv();
834  }
835  }
836  return Velocities;
837  }
838 
840  {
841  const int allModes=gettotmodes();
842  v.resize(allModes);
843  v.zero();
844 
845  for(int k=0;k<_length;k++)
846  {
847  Tkvol& kvol=getkvol(k);
848  const int modes=kvol.getmodenum();
849  for(int m=0;m<modes;m++)
850  {
851  const int count=kvol.getmode(m).getIndex()-1;
852  v[count]=kvol.getmode(m).getv();
853  }
854  }
855  }
856 
857  ArrayBase* getVelocities(const int M)
858  {
859  TvecArray* Velocities=new TvecArray(_length);
860  int count(0);
861  for(int k=0;k<_length;k++)
862  {
863  Tkvol& kvol=getkvol(k);
864  //const int modes=kvol.getmodenum();
865  (*Velocities)[count]=kvol.getmode(M).getv();
866  count++;
867  }
868  return Velocities;
869  }
870 
871  ArrayBase* getReflectionArray(const Mesh& mesh, const int FgId)
872  {
873  const int allModes=gettotmodes();
874  IntArray* reflInd=new IntArray(allModes);
875 
876  for(int k=0;k<_length;k++)
877  {
878  Tkvol& kvol=getkvol(k);
879  const int modes=kvol.getmodenum();
880  for(int m=0;m<modes;m++)
881  {
882  Tmode& mode=kvol.getmode(m);
883  const int count=mode.getIndex()-1;
884  Refl_pair& refls=mode.getReflpair(FgId);
885  if(refls.second.second!=-1) //v dot A < 0
886  {
887  const int kk=refls.second.second;
888  Tmode& FromMode=getkvol(kk).getmode(m);
889  const int indx=FromMode.getIndex();
890  (*reflInd)[count]=indx;
891  }
892  else if(refls.first.second!=-1)//v dot A > 0
893  {
894  const int kk=refls.first.second;
895  Tmode& ToMode=getkvol(kk).getmode(m);
896  const int indx=ToMode.getIndex();
897  (*reflInd)[count]=indx;
898  }
899  else
900  throw CException("Not a reflecting wall!");
901  }
902  }
903  return reflInd;
904  }
905 
907  {//returns the thermal conductivity tensor in row major order
908  T3Tensor KTensor;
909  T3Tensor Dummy;
910  KTensor.zero();
911  Dummy.zero();
912 
913  for(int k=0;k<_length;k++)
914  {
915  Tkvol& kvol=getkvol(k);
916  const T dk3=kvol.getdk3();
917  const int numModes=kvol.getmodenum();
918  for(int m=0;m<numModes;m++)
919  {
920  Tmode& mode=kvol.getmode(m);
921  Tvec vg=mode.getv();
922  T tau=mode.gettau();
923  T de0dT=mode.calcde0dT(Tl);
924  outerProduct(vg, vg, Dummy);
925  KTensor+=Dummy*tau*de0dT*dk3;
926  Dummy.zero();
927  }
928  }
929 
930  TArray* Kptr=new TArray(9);
931  int count=0;
932  for(int j=0;j<3;j++)
933  {
934  for(int i=0;i<3;i++)
935  {
936  (*Kptr)[count]=KTensor(i,j);
937  count++;
938  }
939  }
940 
941  return Kptr;
942  }
943 
945  {
946  TArray* Kptr=new TArray(gettotmodes());
947  TArray& K=*Kptr;
948 
949  int count=0;
950  for(int k=0;k<_length;k++)
951  {
952  Tkvol& kvol=getkvol(k);
953  const T dk3=kvol.getdk3();
954  const int numModes=kvol.getmodenum();
955  for(int m=0;m<numModes;m++)
956  {
957  Tmode& mode=kvol.getmode(m);
958  Tvec vg=mode.getv();
959  T tau=mode.gettau();
960  T de0dT=mode.calcde0dT(Tl);
961  K[count]=vg[0]*vg[0]*tau*de0dT*dk3;
962  count++;
963  }
964  }
965 
966  return Kptr;
967  }
968 
970  {
971  TArray* Kptr=new TArray(gettotmodes());
972  TArray& K=*Kptr;
973 
974  int count=0;
975  for(int k=0;k<_length;k++)
976  {
977  Tkvol& kvol=getkvol(k);
978  const T dk3=kvol.getdk3();
979  const int numModes=kvol.getmodenum();
980  for(int m=0;m<numModes;m++)
981  {
982  Tmode& mode=kvol.getmode(m);
983  Tvec vg=mode.getv();
984  T de0dT=mode.calcde0dT(Tl);
985  K[count]=vg[0]*de0dT*dk3;
986  count++;
987  }
988  }
989 
990  return Kptr;
991  }
992 
993  void outerProduct(const Tvec& v1, const Tvec& v2, T3Tensor& out)
994  {
995  for(int i=0;i<3;i++)
996  for(int j=0;j<3;j++)
997  out(i,j)=v1[i]*v2[j];
998  }
999 
1000  void setTransmission(Tkspace& toKspace, ArrayBase* freqBins, ArrayBase* transArray)
1001  {
1002  BinAndTrans* BTPtr=new BinAndTrans;
1003  BTPtr->first=dynamic_cast<TArray*>(freqBins);
1004  BTPtr->second=dynamic_cast<TArray*>(transArray);
1005  _transMap[&toKspace]=*BTPtr;
1006  }
1007 
1008  T findTransmission(Tkspace& toKspace, const T freq)
1009  {
1010  TArray& freqBins=*_transMap[&toKspace].first;
1011  TArray& trans=*_transMap[&toKspace].second;
1012 
1013  int minInd=0;
1014  int maxInd=freqBins.getLength()-1;
1015 
1016  if(freq<freqBins[minInd] || freq>freqBins[maxInd])
1017  throw CException("Frequency not in the given range!");
1018 
1019  while(1)
1020  {
1021  int mid=floor((minInd+maxInd)/2.);
1022  T midFreq=freqBins[mid];
1023 
1024  if(freq>midFreq)
1025  {
1026  minInd=mid;
1027  if(freq<=freqBins[minInd+1])
1028  return trans[minInd];
1029  }
1030  else
1031  {
1032  maxInd=mid;
1033  if(freq>freqBins[maxInd-1])
1034  return trans[maxInd-1];
1035  }
1036  }
1037 
1038  }
1039 
1041  {
1042  typename TransmissionMap::const_iterator pos=_transMap.find(&toKspace);
1043  if(pos!=_transMap.end())
1044  return *((pos->second).second);
1045  else
1046  throw CException("getTransArray: Transmission not set!");
1047  }
1048 
1049  T calcBallisticInterface(Tkspace& kspace1, const Tvec& An, const T T0, const T T1)
1050  {
1051  T heatRate0(0.);
1052  T heatRate1(0.);
1053  const int k1len=kspace1.getlength();
1054  const T DK0=getDK3();
1055 
1056  for(int k=0;k<_length;k++)
1057  {
1058  Tkvol& kvol=getkvol(k);
1059  T dk3=kvol.getdk3();
1060  const int numModes=kvol.getmodenum();
1061  for(int m=0;m<numModes;m++)
1062  {
1063  Tmode& mode=kvol.getmode(m);
1064  Tvec vg=mode.getv();
1065  const T VdotA=An[0]*vg[0]+An[1]*vg[1]+An[2]*vg[2];
1066 
1067  if(VdotA>0.)
1068  {
1069  const T e0=mode.calce0(T0);
1070  const T t01=findTransmission(kspace1,mode.getomega());
1071  heatRate0+=t01*VdotA*dk3*e0/DK0;
1072  }
1073  }
1074  }
1075 
1076  for(int k=0;k<k1len;k++)
1077  {
1078  Tkvol& kvol=kspace1.getkvol(k);
1079  T dk3=kvol.getdk3();
1080  const int numModes=kvol.getmodenum();
1081  for(int m=0;m<numModes;m++)
1082  {
1083  Tmode& mode=kvol.getmode(m);
1084  Tvec vg=mode.getv();
1085  const T VdotA=An[0]*vg[0]+An[1]*vg[1]+An[2]*vg[2];
1086 
1087  if(VdotA<0.)
1088  {
1089  const T e0=mode.calce0(T1);
1090  const T t10=kspace1.findTransmission(*this,mode.getomega());
1091  heatRate1+=t10*VdotA*dk3*e0/DK0;
1092  }
1093  }
1094  }
1095 
1096  heatRate1/=heatRate0;
1097  heatRate1=1+heatRate1;
1098  heatRate1*=heatRate0*DK0;
1099 
1100  return heatRate1;
1101  }
1102 
1103  T calcBandTemp(const T guess, const T eSum, const IntArray& kpts, const IntArray& mpts)
1104  {
1105  T newguess(guess);
1106  T deltaT=1.;
1107  int iters=0;
1108  if(kpts.getLength()>0)
1109  {
1110  while((deltaT>1e-6)&&(iters<10))
1111  {
1112  T e0sum(0);
1113  T de0sum(0);
1114  for(int i=0;i<kpts.getLength();i++)
1115  {
1116  const int k=kpts[i];
1117  const int m=mpts[i];
1118  T dk3=getkvol(k).getdk3();
1119  Tmode& mode=getkvol(k).getmode(m);
1120  e0sum+=mode.calce0(newguess)*dk3;
1121  de0sum+=mode.calcde0dT(newguess)*dk3;
1122  }
1123  deltaT=(e0sum-eSum)/de0sum;
1124  newguess-=deltaT;
1125  deltaT=fabs(deltaT)/newguess;
1126  iters++;
1127  }
1128  return newguess;
1129  }
1130  else
1131  return 0;
1132  }
1133 
1134  T calcDiffuseE(Tkspace& kspace1, const Tvec& An, const T T0, const T T1)
1135  {
1136  T heatRate0(0.);
1137  T heatRate1(0.);
1138  const int k1len=kspace1.getlength();
1139  const T DK0=getDK3();
1140 
1141  for(int k=0;k<_length;k++)
1142  {
1143  Tkvol& kvol=getkvol(k);
1144  T dk3=kvol.getdk3();
1145  const int numModes=kvol.getmodenum();
1146  for(int m=0;m<numModes;m++)
1147  {
1148  Tmode& mode=kvol.getmode(m);
1149  Tvec vg=mode.getv();
1150  const T VdotA=An[0]*vg[0]+An[1]*vg[1]+An[2]*vg[2];
1151 
1152  if(VdotA>0.)
1153  {
1154  const T e0=mode.calce0(T0);
1155  const T t01=findTransmission(kspace1,mode.getomega());
1156  heatRate0+=t01*VdotA*dk3*e0/DK0;
1157  }
1158  }
1159  }
1160 
1161  T sumVdotA(0.);
1162 
1163  for(int k=0;k<k1len;k++)
1164  {
1165  Tkvol& kvol=kspace1.getkvol(k);
1166  T dk3=kvol.getdk3();
1167  const int numModes=kvol.getmodenum();
1168  for(int m=0;m<numModes;m++)
1169  {
1170  Tmode& mode=kvol.getmode(m);
1171  Tvec vg=mode.getv();
1172  const T VdotA=An[0]*vg[0]+An[1]*vg[1]+An[2]*vg[2];
1173 
1174  if(VdotA<0.)
1175  {
1176  const T e0=mode.calce0(T1);
1177  const T t10=kspace1.findTransmission(*this,mode.getomega());
1178  heatRate1-=(1.-t10)*VdotA*dk3*e0/DK0;
1179  }
1180  else
1181  sumVdotA+=VdotA*dk3/DK0;
1182  }
1183  }
1184 
1185  heatRate1=heatRate0/sumVdotA+heatRate1/sumVdotA;
1186 
1187  return heatRate1;
1188  }
1189 
1191  {
1192  TransmissionMap& coarseTrans=_coarseKspace->getTransMap();
1193 
1194  for(TransIt it=_transMap.begin();it!=_transMap.end();it++)
1195  {
1196  Tkspace* fineToKspace=it->first;
1197  if(fineToKspace!=NULL)
1198  {
1199  Tkspace* coarseToKspace=fineToKspace->getCoarseKspace();
1200  coarseTrans[coarseToKspace]=(it->second);
1201  }
1202  }
1203  }
1204 
1205  void setDOS(DensityOfStates<T>& DOS) {_DOS=&DOS;}
1211  T& gete(const int cell, const int count) {return (*_e)[cell*gettotmodes()+count];}
1212  T& gete0(const int cell, const int count) {return (*_e0)[cell*gettotmodes()+count];}
1213  T& getInj(const int cell, const int count) {return (*_injected)[cell*gettotmodes()+count];}
1214  T& getRes(const int cell, const int count) {return (*_residual)[cell*gettotmodes()+count];}
1215  T& getFas(const int cell, const int count) {return (*_FASCorrection)[cell*gettotmodes()+count];}
1216  int getGlobalIndex(const int cell, const int count) {return cell*gettotmodes()+count;}
1217  void seteArray(TArrPtr ePtr) {_e=ePtr;}
1218  void sete0Array(TArrPtr e0Ptr) {_e0=e0Ptr;}
1219  void setSourceArray(TArrPtr SPtr) {_Source=SPtr;}
1220  void setInjArray(TArrPtr InjPtr) {_injected=InjPtr;}
1221  void setResArray(TArrPtr ResPtr) {_residual=ResPtr;}
1222  void setFASArray(TArrPtr FASPtr) {_FASCorrection=FASPtr;}
1223  void setTauArray(TArrPtr TauPtr) {_Tau=TauPtr;}
1224  TArray& geteArray() {return *_e;}
1225  TArray& gete0Array() {return *_e0;}
1230  TArray& getTauArray() {return *_Tau;}
1231  const T getTau(const int index) {return (*_Tau)[index];}
1232  void geteCellVals(const int c, TArray& o)
1233  {
1234  int start=getGlobalIndex(c,0);
1235  int end=start+gettotmodes();
1236  for(int i=start; i<end; i++)
1237  o[i-start]=(*_e)[i];
1238  }
1239 
1240  void gete0CellVals(const int c, TArray& o)
1241  {
1242  int start=getGlobalIndex(c,0);
1243  int end=start+gettotmodes();
1244  for(int i=start; i<end; i++)
1245  o[i-start]=(*_e0)[i];
1246  }
1247 
1248  void getnCellVals(const int c, TArray& o)
1249  {
1250  const T hbar(6.582119e-16);
1251  int start=getGlobalIndex(c,0);
1252  int end=start+gettotmodes();
1253  for(int i=start; i<end; i++)
1254  o[i-start]=(*_e)[i]/hbar/_freqArray[i-start];
1255  }
1256 
1257  void seteCellVals(const int c, const TArray& o)
1258  {
1259  int start=getGlobalIndex(c,0);
1260  int end=start+gettotmodes();
1261  for(int i=start; i<end; i++)
1262  (*_e)[i]=o[i-start];
1263  }
1264 
1265  void setResidCell(const int c, const TArray& o)
1266  {
1267  int start=getGlobalIndex(c,0);
1268  int end=start+gettotmodes();
1269  for(int i=start; i<end; i++)
1270  (*_residual)[i]=o[i-start];
1271  }
1272 
1273  void addFAS(const int c, TArray& Bvec)
1274  {
1275  int start=getGlobalIndex(c,0);
1276  int end=start+gettotmodes();
1277  for(int i=start; i<end; i++)
1278  Bvec[i-start]-=(*_FASCorrection)[i];
1279  }
1280 
1281  void addFASint(const int c, TArray& Bvec)
1282  {
1283  int start=getGlobalIndex(c,0);
1284  int end=start+gettotmodes();
1285  for(int i=start; i<end; i++)
1286  Bvec[i-start]+=(*_FASCorrection)[i];
1287  }
1288 
1289  void makeFAS() {(*_FASCorrection)-=(*_residual);}
1290 
1291  void syncLocal(const StorageSite& site)
1292  {
1293  //package values to be sent/received
1294  syncScatter(site);
1295  createSyncGather(site);
1296 
1297 #ifdef FVM_PARALLEL
1298  //SENDING
1299  MPI::Request request_send[get_request_size(site)];
1300  MPI::Request request_recv[get_request_size(site)];
1301  int indxSend = 0;
1302  int indxRecv = 0;
1303 
1304  const StorageSite::ScatterMap& scatterMap = site.getScatterMap();
1305  foreach(const StorageSite::ScatterMap::value_type& mpos, scatterMap)
1306  {
1307  const StorageSite& oSite = *mpos.first;
1308  //checking if storage site is only site or ghost site, we only communicate ghost site ( oSite.getCount() == -1 )
1309  EntryIndex e(&site,&oSite);
1310  ArrayBase& sendArray = *_ghostArrays[e];
1311  int to_where = oSite.getGatherProcID();
1312  if ( to_where != -1 )
1313  {
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 );
1317  }
1318  }
1319 
1320  //RECIEVING
1321  //getting values from other meshes to fill g
1322  const StorageSite::GatherMap& gatherMap = site.getGatherMap();
1323  foreach(const StorageSite::GatherMap::value_type& mpos, gatherMap)
1324  {
1325  const StorageSite& oSite = *mpos.first;
1326  //checking if storage site is only site or ghost site, we only communicate ghost site ( oSite.getCount() == -1 )
1327  EntryIndex e(&oSite,&site);
1328  ArrayBase& recvArray = *_ghostArrays[e];
1329  int from_where = oSite.getGatherProcID();
1330  if ( from_where != -1 )
1331  {
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 );
1335  }
1336  }
1337 
1338 
1339  int count = get_request_size(site);
1340  MPI::Request::Waitall( count, request_recv );
1341  MPI::Request::Waitall( count, request_send );
1342 #endif
1343 
1344  syncGather(site);
1345 
1346  }
1347 
1348  void syncScatter(const StorageSite& site)
1349  {
1350  const StorageSite::ScatterMap& scatterMap = site.getScatterMap();
1351 
1352  const int totModes=gettotmodes();
1353 
1354  foreach(const StorageSite::ScatterMap::value_type& mpos, scatterMap)
1355  {
1356  const StorageSite& oSite = *mpos.first;
1357  EntryIndex e(&site, &oSite);
1358  const Array<int>& fromIndices = *(mpos.second);
1359 
1360  if (_ghostArrays.find(e) == _ghostArrays.end())
1361  _ghostArrays[e] = _e->newSizedClone( fromIndices.getLength()*totModes);
1362 
1363  const int cellCount = fromIndices.getLength();
1364  TArray& ghostArray = dynamic_cast<TArray&>(*_ghostArrays[e]);
1365 
1366  int ghostIndex(0);
1367  for(int index=0;index<cellCount;index++)
1368  {
1369  const int c=fromIndices[index];
1370  for(int cKindex=getGlobalIndex(c,0);
1371  cKindex<getGlobalIndex(c,0)+totModes;
1372  cKindex++)
1373  {
1374  ghostArray[ghostIndex]=(*_e)[cKindex];
1375  ghostIndex++;
1376  }
1377  }
1378 
1379  }
1380  }
1381 
1382  void createSyncGather(const StorageSite& site)
1383  {
1384  const StorageSite::GatherMap& gatherMap = site.getGatherMap();
1385 
1386  foreach(const StorageSite::GatherMap::value_type& mpos, gatherMap)
1387  {
1388  const StorageSite& oSite = *mpos.first;
1389  EntryIndex e(&oSite, &site);
1390  const Array<int>& toIndices = *(mpos.second);
1391  if (_ghostArrays.find(e) == _ghostArrays.end())
1392  _ghostArrays[e] = _e->newSizedClone(toIndices.getLength()*gettotmodes());
1393  }
1394 
1395  }
1396 
1397  void syncGather(const StorageSite& site)
1398  {
1399  const StorageSite::GatherMap& gatherMap = site.getGatherMap();
1400 
1401  const int totModes=gettotmodes();
1402 
1403  foreach(const StorageSite::GatherMap::value_type& mpos, gatherMap)
1404  {
1405  const StorageSite& oSite = *mpos.first;
1406  const Array<int>& toIndices = *(mpos.second);
1407  EntryIndex e(&oSite, &site);
1408 
1409  if (_ghostArrays.find(e) == _ghostArrays.end())
1410  {
1411  ostringstream err;
1412  err << "Kspace::syncScatter: ghost array not found for"
1413  << &oSite << endl;
1414  throw CException(err.str());
1415  }
1416 
1417  const TArray& ghostArray=dynamic_cast<const TArray&>(*_ghostArrays[e]);
1418  const int cellCount=toIndices.getLength();
1419 
1420  int ghostIndex(0);
1421  for(int index=0;index<cellCount;index++)
1422  {
1423  const int c=toIndices[index];
1424  for(int cKindex=getGlobalIndex(c,0);
1425  cKindex<getGlobalIndex(c,0)+totModes;
1426  cKindex++)
1427  {
1428  (*_e)[cKindex]=ghostArray[ghostIndex];
1429  ghostIndex++;
1430  }
1431  }
1432 
1433  }
1434 
1435  }
1436 
1438  {
1439  int indx(0);
1440  const StorageSite::ScatterMap& scatterMap = site.getScatterMap();
1441  foreach(const StorageSite::ScatterMap::value_type& mpos, scatterMap)
1442  {
1443  const StorageSite& oSite = *mpos.first;
1444  //checking if storage site is only site or ghost site, we only communicate ghost site ( oSite.getCount() == -1 )
1445  if ( oSite.getGatherProcID() != -1 )
1446  indx++;
1447  }
1448  return indx++;
1449  }
1450 
1451  void getEquilibriumArray(TArray& vals, const T Tl)
1452  {
1453  for(int k=0;k<_length;k++)
1454  {
1455  Tkvol& kv=getkvol(k);
1456  const int modenum=kv.getmodenum();
1457  for(int m=0;m<modenum;m++)
1458  {
1459  Tmode& mode=kv.getmode(m);
1460  const int index=mode.getIndex()-1;
1461  vals[index]=mode.calce0(Tl);
1462  }
1463  }
1464  }
1465 
1467 
1468  void getSourceTerm(const int c, TArray& s, TArray& ds)
1469  {
1470 
1471 
1472  _ScattKernel->updateSource2(c,s,ds);
1473 
1474  }
1475 
1476  void ScatterPhonons(const int c, const int totIts, TArray& C,
1477  TArray& B, const TArray& V, TArray& newE, const T cv)
1478  {
1479  _ScattKernel->scatterPhonons(c, totIts, C, B, V, newE, cv);
1480  seteCellVals(c,newE);
1481  }
1482 
1483  void setRelTimeFunction(const T A, const T B, const T C)
1484  {
1485  _relFun._A=A;
1486  _relFun._B=B;
1487  _relFun._C=C;
1488  _relFun._constTau=false;
1489  }
1490 
1491  void updateTau(const int c, const T Tl)
1492  {
1493  const int beg=getGlobalIndex(c,0);
1494  const int fin=getGlobalIndex(c+1,0);
1495  int index(0);
1496  for(int i=beg;i<fin;i++)
1497  {
1498  _relFun.update(_freqArray[index],Tl,(*_Tau)[i]);
1499  index++;
1500  }
1501 
1502  }
1503 
1504  ArrayBase* getRTAsources(const int c)
1505  {
1506  TArray* S=new TArray(gettotmodes());
1507  int ind=getGlobalIndex(c,0);
1508  int cnt(0);
1509 
1510  for(int k=0;k<_length;k++)
1511  {
1512  Tkvol& kvol=getkvol(k);
1513  const int modes=kvol.getmodenum();
1514  const T dk3=kvol.getdk3();
1515  for(int m=0;m<modes;m++)
1516  {
1517  Tmode& mode=kvol.getmode(m);
1518  T tau=mode.gettau();
1519  (*S)[cnt]=((*_e0)[ind]-(*_e)[ind])/tau*(dk3/_totvol);
1520  cnt++;
1521  ind++;
1522  }
1523  }
1524  return S;
1525 
1526  }
1527 
1529  {
1530  TArray* S=new TArray(gettotmodes());
1531  TArray ds(gettotmodes());
1532  _ScattKernel->updateSource2(c,*S,ds);
1533  weightArray(*S);
1534  return S;
1535  }
1536 
1537  ArrayBase* getIsources(const int c, const bool correct)
1538  {
1539  TArray* S=new TArray(gettotmodes());
1540  TArray ds(gettotmodes());
1541  _ScattKernel->getTypeIsource(c,*S,ds,correct);
1542  weightArray(*S);
1543  return S;
1544  }
1545 
1546  ArrayBase* getIIsources(const int c, const bool correct)
1547  {
1548  TArray* S=new TArray(gettotmodes());
1549  TArray ds(gettotmodes());
1550  _ScattKernel->getTypeIIsource(c,*S,ds,correct);
1551  weightArray(*S);
1552  return S;
1553  }
1554 
1556  {
1557  TArray s(gettotmodes());
1558  TArray* ds=new TArray(gettotmodes());
1559  _ScattKernel->updateSource2(c,s,*ds);
1560  weightArray(*ds);
1561  return ds;
1562  }
1563 
1565  {
1566  TvecArray* Kpts=new TvecArray(_length);
1567  for(int k=0;k<_length;k++)
1568  {
1569  Tkvol& kvol=getkvol(k);
1570  (*Kpts)[k]=kvol.getkvec();
1571  }
1572  return Kpts;
1573  }
1574 
1576  {
1577  TArray* e=new TArray(gettotmodes());
1578  geteCellVals(c,*e);
1579  weightArray(*e);
1580  return e;
1581  }
1582 
1583  ArrayBase* gete0CellVars(const int c)
1584  {
1585  TArray* e=new TArray(gettotmodes());
1586  int cnt=getGlobalIndex(c,0);
1587  int index=0;
1588  for(int k=0;k<_length;k++)
1589  {
1590  Tkvol& kv=getkvol(k);
1591  const T dk3=kv.getdk3();
1592  const int modenum=kv.getmodenum();
1593  for(int m=0;m<modenum;m++)
1594  {
1595  (*e)[index]=(*_e0)[cnt]*(dk3/_totvol);
1596  index++;
1597  cnt++;
1598  }
1599  }
1600  return e;
1601  }
1602 
1604  {
1605  TArray* e=new TArray(gettotmodes());
1606  getEquilibriumArray(*e,Tl);
1607  weightArray(*e);
1608  return e;
1609  }
1610 
1612  {
1613  TArray* e=new TArray(gettotmodes());
1614  (*e)=_freqArray;
1615  return e;
1616  }
1617 
1619  {
1620  TArray* e=new TArray(gettotmodes());
1621  int index(0);
1622  for(int k=0;k<_length;k++)
1623  {
1624  Tkvol& kv=getkvol(k);
1625  //const T dk3=kv.getdk3();
1626  const int modenum=kv.getmodenum();
1627  for(int m=0;m<modenum;m++)
1628  {
1629  Tmode& mode=kv.getmode(m);
1630  (*e)[index]=mode.gettau();
1631  index++;
1632  }
1633  }
1634  return e;
1635  }
1636 
1638  {
1639  if(e.getLength()==gettotmodes())
1640  {
1641  int cnt=0;
1642  for(int k=0;k<_length;k++)
1643  {
1644  Tkvol& kv=getkvol(k);
1645  const T dk3=kv.getdk3();
1646  const int modenum=kv.getmodenum();
1647  for(int m=0;m<modenum;m++)
1648  {
1649  e[cnt]*=dk3/_totvol;
1650  cnt++;
1651  }
1652 
1653  }
1654  }
1655  else
1656  throw CException("Array not same length: weightArray");
1657  }
1658 
1660  {
1661  TArray& e=dynamic_cast<TArray&>(*ep);
1662  int cnt=0;
1663  for(int k=0;k<_length;k++)
1664  {
1665  Tkvol& kv=getkvol(k);
1666  const T dk3=kv.getdk3();
1667  const int modenum=kv.getmodenum();
1668  for(int m=0;m<modenum;m++)
1669  {
1670  e[cnt]*=dk3/_totvol;
1671  cnt++;
1672  }
1673  }
1674  }
1675 
1676  ArrayBase* getEmptyArray(const int length)
1677  {return new TArray(length);}
1678 
1679  void setTref(const T Tref)
1680  {
1681  for(int k=0;k<_length;k++)
1682  {
1683  Tkvol& kv=getkvol(k);
1684  const int modenum=kv.getmodenum();
1685  for(int m=0;m<modenum;m++)
1686  kv.getmode(m).setTref(Tref);
1687  }
1688  }
1689 
1691  {return _Source.get();}
1692 
1693  void addSource(const int c, TArray& BVec, const T cv)
1694  {
1695  if(!(_Source==NULL))
1696  {
1697  const int beg=getGlobalIndex(c,0);
1698  const int fin=getGlobalIndex(c+1,0);
1699  int index(0);
1700  for(int i=beg;i<fin;i++)
1701  {
1702  BVec[index]+=(*_Source)[i]*cv;
1703  index++;
1704  }
1705  }
1706  }
1707 
1708  private:
1709 
1710  Kspace(const Kspace&);
1711  //num volumes
1712  int _length;
1714  T _totvol; //total Kspace volume
1729 
1730 };
1731 
1732 
1733 #endif
T & getFas(const int cell, const int count)
Definition: Kspace.h:1215
Array< int > IntArray
Definition: Kspace.h:39
void geteCellVals(const int c, TArray &o)
Definition: Kspace.h:1232
shared_ptr< Reflection > Reflptr
Definition: pmode.h:28
Tkspace::TransmissionMap::iterator TransIt
Definition: Kspace.h:53
void gete0(const T Tguess, T &e0, T &de0dT, const T m)
Definition: Kspace.h:632
pair< Reflection, Reflection > Refl_pair
Definition: pmode.h:29
T calcSpecificHeat(T Tl, const int m)
Definition: Kspace.h:685
void getnCellVals(const int c, TArray &o)
Definition: Kspace.h:1248
virtual void zero()
Definition: Array.h:281
Refl_pair & getReflpair(int i)
Definition: pmode.h:71
TArrPtr _e
Definition: Kspace.h:1719
virtual int getDataSize() const =0
void createSyncGather(const StorageSite &site)
Definition: Kspace.h:1382
void setFASArray(TArrPtr FASPtr)
Definition: Kspace.h:1222
void NewtonSolve(T &guess, const T e_sum)
Definition: Kspace.h:425
Kspace< T > Tkspace
Definition: Kspace.h:33
void setCoarseKspace(Tkspace *cK)
Definition: Kspace.h:1208
int _length
Definition: Kspace.h:1712
Tmode::Refl_Map Refl_Map
Definition: Kspace.h:50
void syncLocal(const StorageSite &site)
Definition: Kspace.h:1291
void syncScatter(const StorageSite &site)
Definition: Kspace.h:1348
void gete0CellVals(const int c, TArray &o)
Definition: Kspace.h:1240
ArrayBase * getFreqArrayPy()
Definition: Kspace.h:1611
Tvec getv()
Definition: pmode.h:59
void gete0_tau(T &Tguess, T &e0tau, T &de0taudT)
Definition: Kspace.h:546
Definition: Kspace.h:28
TArray & getFreqArray()
Definition: Kspace.h:1466
void findSpecs(const Tvec n, const int m, const int k, Refl_pair &refls)
Definition: Kspace.h:742
void setCpNonGray(const T Tl)
Definition: Kspace.h:133
ArrayBase * getModewiseBallisticConductance(const T Tl)
Definition: Kspace.h:969
T calcde0taudT(T Tl)
Definition: pmode.h:112
T findTransmission(Tkspace &toKspace, const T freq)
Definition: Kspace.h:1008
TArray & getFASArray()
Definition: Kspace.h:1229
void updateTau(const int c, const T Tl)
Definition: Kspace.h:1491
T getde0taudT(const int c, T Tl)
Definition: Kspace.h:646
map< Tkspace *, pair< TArray *, TArray * > > TransmissionMap
Definition: Kspace.h:52
T gethbar()
Definition: Kspace.h:392
TArrPtr _FASCorrection
Definition: Kspace.h:1724
Tmode::Reflptr Reflptr
Definition: Kspace.h:48
Tmode::Reflection Reflection
Definition: Kspace.h:47
T calce0(T Tl)
Definition: pmode.h:88
void setTauArray(TArrPtr TauPtr)
Definition: Kspace.h:1223
void setCp(const T cp)
Definition: Kspace.h:118
Kspace()
Definition: Kspace.h:113
Tkvol & getkvol(int n) const
Definition: Kspace.h:390
Tmode & getmode(int n) const
Definition: kvol.h:44
void seteArray(TArrPtr ePtr)
Definition: Kspace.h:1217
TArray & getTransArray(Tkspace &toKspace)
Definition: Kspace.h:1040
vector< Tmodeptr > Modes
Definition: Kspace.h:42
int getlength() const
Definition: Kspace.h:391
void outerProduct(const Tvec &v1, const Tvec &v2, T3Tensor &out)
Definition: Kspace.h:993
Kspace(T a, T tau, T vgmag, T omega, int ntheta, int nphi, const bool full)
Definition: Kspace.h:57
T & getRes(const int cell, const int count)
Definition: Kspace.h:1214
ArrayBase * gete0CellVars(const int c)
Definition: Kspace.h:1583
Tkspace * getCoarseKspace()
Definition: Kspace.h:1209
T calcDK3()
Definition: Kspace.h:397
TArray & geteArray()
Definition: Kspace.h:1224
Definition: Mesh.h:49
int getmodenum()
Definition: kvol.h:43
T getDK3() const
Definition: Kspace.h:408
T calcLatTemp(const int c)
Definition: Kspace.h:461
Kspace(const char *filename, const int dimension)
Definition: Kspace.h:181
DensityOfStates< T > * _DOS
Definition: Kspace.h:1716
Kspace(const char *filename, const int dimension, const bool normal)
Definition: Kspace.h:276
void syncGather(const StorageSite &site)
Definition: Kspace.h:1397
shared_ptr< TArray > TArrPtr
Definition: Kspace.h:36
TArray _freqArray
Definition: Kspace.h:1727
T calce0tau(T Tl)
Definition: pmode.h:100
T calcDiffuseE(Tkspace &kspace1, const Tvec &An, const T T0, const T T1)
Definition: Kspace.h:1134
T & gete(const int cell, const int count)
Definition: Kspace.h:1211
void calcTemp(T &guess, const T e_sum, const Tvec An)
Definition: Kspace.h:443
void setTref(const T Tref)
Definition: Kspace.h:1679
Array< Tvec > TvecArray
Definition: Kspace.h:38
map< int, Refl_pair > Refl_Map
Definition: pmode.h:30
pair< const StorageSite *, const StorageSite * > EntryIndex
Definition: Kspace.h:54
Tangent sqrt(const Tangent &a)
Definition: Tangent.h:317
void addFAS(const int c, TArray &Bvec)
Definition: Kspace.h:1273
void setTransmission(Tkspace &toKspace, ArrayBase *freqBins, ArrayBase *transArray)
Definition: Kspace.h:1000
ArrayBase * getEmptyArray(const int length)
Definition: Kspace.h:1676
void setResArray(TArrPtr ResPtr)
Definition: Kspace.h:1221
ArrayBase * getWaveVectors()
Definition: Kspace.h:1564
void calcTemp(T &guess, const T e_sum)
Definition: Kspace.h:483
int getIndex()
Definition: pmode.h:73
int getGlobalIndex(const int cell, const int count)
Definition: Kspace.h:1216
int getTag() const
Definition: StorageSite.h:84
ArrayBase * getIIsources(const int c, const bool correct)
Definition: Kspace.h:1546
void setResidCell(const int c, const TArray &o)
Definition: Kspace.h:1265
T calcSpecificHeat(T Tl)
Definition: Kspace.h:668
int get_request_size(const StorageSite &site)
Definition: Kspace.h:1437
ArrayBase * getModewiseHollandConductivity(const T Tl)
Definition: Kspace.h:944
void resize(const int newLength)
Definition: Array.h:56
void gete0(const T Tguess, T &e0, T &de0dT, const Tvec An)
Definition: Kspace.h:564
Volvec _Kmesh
Definition: Kspace.h:1713
void giveTransmissions()
Definition: Kspace.h:1190
int getGatherProcID() const
Definition: StorageSite.h:83
Array< T > TArray
Definition: Kspace.h:35
ArrayBase * getRTAsources(const int c)
Definition: Kspace.h:1504
void getVelocities(TvecArray &v)
Definition: Kspace.h:839
TArrPtr _Tau
Definition: Kspace.h:1725
ArrayBase * getFullsources(const int c)
Definition: Kspace.h:1528
void setTref(const T Tref)
Definition: pmode.h:80
TransmissionMap _transMap
Definition: Kspace.h:1715
T calcTauTot()
Definition: Kspace.h:409
Tangent sin(const Tangent &a)
Definition: Tangent.h:307
TArray & getResArray()
Definition: Kspace.h:1228
map< EntryIndex, shared_ptr< ArrayBase > > GhostArrayMap
Definition: Kspace.h:55
T calcBallisticInterface(Tkspace &kspace1, const Tvec &An, const T T0, const T T1)
Definition: Kspace.h:1049
T & getcpRef()
Definition: pmode.h:68
void gete0(const T Tguess, T &e0, T &de0dT)
Definition: Kspace.h:614
T calcModeTemp(T guess, const T e_sum, const T m)
Definition: Kspace.h:501
ArrayBase * geteCellValsPy(const int c)
Definition: Kspace.h:1575
void setDOS(DensityOfStates< T > &DOS)
Definition: Kspace.h:1205
const T getTau(const int index)
Definition: Kspace.h:1231
ArrayBase * getReflectionArray(const Mesh &mesh, const int FgId)
Definition: Kspace.h:871
ArrayBase * getSourceDeriv(const int c)
Definition: Kspace.h:1555
void weightArray(TArray &e)
Definition: Kspace.h:1637
T calcPhononTemp(const int c, const int index, T guess)
Definition: Kspace.h:520
Tmode::Refl_pair Refl_pair
Definition: Kspace.h:49
ArrayBase * getVelocities(const int M)
Definition: Kspace.h:857
vector< Tkspace * > TkspList
Definition: Kspace.h:34
ArrayBase * getHollandConductivity(const T Tl)
Definition: Kspace.h:906
ArrayBase * getIsources(const int c, const bool correct)
Definition: Kspace.h:1537
ArrayBase * getTauArrayPy()
Definition: Kspace.h:1618
TArray & getSourceArray()
Definition: Kspace.h:1226
T & getInj(const int cell, const int count)
Definition: Kspace.h:1213
T _totvol
Definition: Kspace.h:1714
const ScatterMap & getScatterMap() const
Definition: StorageSite.h:58
TArray & getInjArray()
Definition: Kspace.h:1227
map< const StorageSite *, shared_ptr< Array< int > > > ScatterMap
Definition: StorageSite.h:23
SquareTensor< T, 3 > T3Tensor
Definition: Kspace.h:46
DensityOfStates< T > * getDOSptr()
Definition: Kspace.h:1207
vector< Kvolptr > Volvec
Definition: Kspace.h:45
void getEquilibriumArray(TArray &vals, const T Tl)
Definition: Kspace.h:1451
Tangent fabs(const Tangent &a)
Definition: Tangent.h:312
Definition: Array.h:14
TArrPtr _injected
Definition: Kspace.h:1722
void CopyKspace(Tkspace &copyFromKspace)
Definition: Kspace.h:781
T findKnStats(const T length)
Definition: Kspace.h:698
void ScatterPhonons(const int c, const int totIts, TArray &C, TArray &B, const TArray &V, TArray &newE, const T cv)
Definition: Kspace.h:1476
ScatteringKernel< T > * _ScattKernel
Definition: Kspace.h:1717
TArray & gete0Array()
Definition: Kspace.h:1225
T FindBallisticHeatRate(const Tvec An, const T T1, const T T2)
Definition: Kspace.h:797
void setRelTimeFunction(const T A, const T B, const T C)
Definition: Kspace.h:1483
const GatherMap & getGatherMap() const
Definition: StorageSite.h:59
ArrayBase * getSourceArrayPy()
Definition: Kspace.h:1690
shared_ptr< Tkvol > Kvolptr
Definition: Kspace.h:44
T calcde0dT(T Tl)
Definition: pmode.h:126
int gettotmodes()
Definition: Kspace.h:393
void addSource(const int c, TArray &BVec, const T cv)
Definition: Kspace.h:1693
Tkspace * _coarseKspace
Definition: Kspace.h:1718
T getomega()
Definition: pmode.h:63
virtual void * getData() const =0
TArrPtr _Source
Definition: Kspace.h:1721
shared_ptr< Tmode > Tmodeptr
Definition: Kspace.h:41
void makeDegenerate(const int m)
Definition: Kspace.h:152
pair< T, int > Reflection
Definition: pmode.h:27
map< const StorageSite *, shared_ptr< Array< int > > > GatherMap
Definition: StorageSite.h:24
void setScattKernel(ScatteringKernel< T > &Sk)
Definition: Kspace.h:1206
void makeFAS()
Definition: Kspace.h:1289
void makeFreqArray()
Definition: Kspace.h:163
Tvec getkvec()
Definition: kvol.h:39
T & gete0(const int cell, const int count)
Definition: Kspace.h:1212
T calcBandTemp(const T guess, const T eSum, const IntArray &kpts, const IntArray &mpts)
Definition: Kspace.h:1103
void setSourceArray(TArrPtr SPtr)
Definition: Kspace.h:1219
Definition: pmode.h:18
void getSourceTerm(const int c, TArray &s, TArray &ds)
Definition: Kspace.h:1468
TArray & getTauArray()
Definition: Kspace.h:1230
ArrayBase * gete0CellValsPy(const T Tl)
Definition: Kspace.h:1603
ArrayBase * getVelocities()
Definition: Kspace.h:821
Definition: kvol.h:14
T gettau()
Definition: pmode.h:61
Vector< T, 3 > Tvec
Definition: Kspace.h:37
pmode< T > Tmode
Definition: Kspace.h:40
GhostArrayMap _ghostArrays
Definition: Kspace.h:1726
TArrPtr _e0
Definition: Kspace.h:1720
void seteCellVals(const int c, const TArray &o)
Definition: Kspace.h:1257
TArrPtr _residual
Definition: Kspace.h:1723
pair< TArray *, TArray * > BinAndTrans
Definition: Kspace.h:51
void sete0Array(TArrPtr e0Ptr)
Definition: Kspace.h:1218
TransmissionMap & getTransMap()
Definition: Kspace.h:1210
kvol< T > Tkvol
Definition: Kspace.h:43
RelTimeFun< T > _relFun
Definition: Kspace.h:1728
void gete0v(const T Tguess, T &e0, T &de0dT, const Tvec An)
Definition: Kspace.h:589
void weightArray(ArrayBase *ep)
Definition: Kspace.h:1659
void setInjArray(TArrPtr InjPtr)
Definition: Kspace.h:1220
T getdk3()
Definition: kvol.h:42
void addFASint(const int c, TArray &Bvec)
Definition: Kspace.h:1281
int getLength() const
Definition: Array.h:87