示例#1
0
//----------------------------------------------------------------------
void Average_ekt::write_summary(Average_return &avg,Average_return &err, ostream & os) { 

  Array2 <dcomplex> obdm_up(nmo,nmo),obdm_down(nmo,nmo), 
         obdm_up_err(nmo,nmo),obdm_down_err(nmo,nmo), 
         cndc_up(nmo, nmo), cndc_down(nmo, nmo),
         vlnc_up(nmo, nmo), vlnc_down(nmo, nmo), 
         cndc_up_err(nmo, nmo), cndc_down_err(nmo, nmo), 
         vlnc_up_err(nmo, nmo), vlnc_down_err(nmo, nmo); 
  //Array4 <dcomplex>
  //       tbdm_uu(nmo,nmo),tbdm_uu_err(nmo,nmo),
  //      tbdm_ud(nmo,nmo),tbdm_ud_err(nmo,nmo),
  //      tbdm_du(nmo,nmo),tbdm_du_err(nmo,nmo),
  //      tbdm_dd(nmo,nmo),tbdm_dd_err(nmo,nmo);

  os << "EKT: nmo " << nmo << endl;
  os << "EKT: states { ";
  for(int i=0; i< nmo; i++) { 
    os << occupations[0][i]+1 << " " ;
  }
  os << " } \n";
  os << "Orbital normalization " << endl;
  for(int i=0; i< nmo; i++) { 
    os << avg.vals(i) << " +/- " << err.vals(i) << endl;
  }

  // for(int i=0; i < nmo; i++) { 
  //   avg.vals(i)=1.0/nmo; //assume that the orbitals are normalized.
  // }

  if (eval_obdm) {
    dcomplex i_c(0.,1.);
    int place=0;
    for(int i=0; i < nmo; i++) { 
      for(int j=0; j < nmo; j++)  { 
        doublevar norm=sqrt(avg.vals(i)*avg.vals(j));
        int index=nmo + place;
        obdm_up(i,j)=dcomplex(avg.vals(index),avg.vals(index+1))/norm;
        obdm_up_err(i,j)=dcomplex(err.vals(index),err.vals(index+1))/norm;

        index+=2*nmo*nmo;
        obdm_down(i,j)=dcomplex(avg.vals(index),avg.vals(index+1))/norm;
        obdm_down_err(i,j)=dcomplex(err.vals(index),err.vals(index+1))/norm;
        place+=2;
      }
    }

    os << "One-body density matrix " << endl;
    int colwidth=40;
    if(!complex_orbitals) colwidth=20;
    os << setw(10) << " " << setw(10) << " "
      << setw(colwidth) << "up" << setw(colwidth) << "up err"
      << setw(colwidth) << "down" << setw(colwidth) << "down err"
      << endl;
    for(int i=0; i< nmo ; i++) { 
      for(int j=0; j<nmo; j++) { 
        if(complex_orbitals) { 
          os << setw(10) << i << setw(10) << j
            << setw(colwidth) << obdm_up(i,j) << setw(colwidth) << obdm_up_err(i,j)
            << setw(colwidth) << obdm_down(i,j) << setw(colwidth) << obdm_down_err(i,j)
            << endl;
        }
        else { 
          os << setw(10) << i << setw(10) << j
            << setw(colwidth) << obdm_up(i,j).real() 
            << setw(colwidth) << obdm_up_err(i,j).real()
            << setw(colwidth) << obdm_down(i,j).real() 
            << setw(colwidth) << obdm_down_err(i,j).real()
            << endl;

        }
      }

    }
  }

  if (eval_valence) {
    dcomplex i_c(0.,1.);
    int place=0;
    for(int i=0; i < nmo; i++) { 
      for(int j=0; j < nmo; j++)  { 
        doublevar norm=sqrt(avg.vals(i)*avg.vals(j));
        int index=nmo+4*nmo*nmo + place;
        vlnc_up(i,j)=dcomplex(avg.vals(index),avg.vals(index+1))/norm;
        vlnc_up_err(i,j)=dcomplex(err.vals(index),err.vals(index+1))/norm;

        index+=2*nmo*nmo;
        vlnc_down(i,j)=dcomplex(avg.vals(index),avg.vals(index+1))/norm;
        vlnc_down_err(i,j)=dcomplex(err.vals(index),err.vals(index+1))/norm;
        place+=2;
      }
    }

    os << "Valence band matrix " << endl;
    int colwidth=40;
    if(!complex_orbitals) colwidth=20;
    os << setw(10) << " " << setw(10) << " "
      << setw(colwidth) << "up" << setw(colwidth) << "up err"
      << setw(colwidth) << "down" << setw(colwidth) << "down err"
      << endl;
    for(int i=0; i< nmo ; i++) { 
      for(int j=0; j<nmo; j++) { 
        if(complex_orbitals) { 
          os << setw(10) << i << setw(10) << j
            << setw(colwidth) << vlnc_up(i,j) << setw(colwidth) << vlnc_up_err(i,j)
            << setw(colwidth) << vlnc_down(i,j) << setw(colwidth) << vlnc_down_err(i,j)
            << endl;
        }
        else { 
          os << setw(10) << i << setw(10) << j
            << setw(colwidth) << vlnc_up(i,j).real() 
            << setw(colwidth) << vlnc_up_err(i,j).real()
            << setw(colwidth) << vlnc_down(i,j).real() 
            << setw(colwidth) << vlnc_down_err(i,j).real()
            << endl;

        }
      }

    }
  }

  if (eval_conduction) {
    dcomplex i_c(0.,1.);
    int place=0;
    for(int i=0; i < nmo; i++) { 
      for(int j=0; j < nmo; j++)  { 
        doublevar norm=sqrt(avg.vals(i)*avg.vals(j));
        int index=nmo + 8*nmo*nmo + place;
        cndc_up(i,j)=dcomplex(avg.vals(index),avg.vals(index+1))/norm;
        cndc_up_err(i,j)=dcomplex(err.vals(index),err.vals(index+1))/norm;

        index+=2*nmo*nmo;
        cndc_down(i,j)=dcomplex(avg.vals(index),avg.vals(index+1))/norm;
        cndc_down_err(i,j)=dcomplex(err.vals(index),err.vals(index+1))/norm;
        place+=2;
      }
    }

    os << "Conduction band matrix " << endl;
    int colwidth=40;
    if(!complex_orbitals) colwidth=20;
    os << setw(10) << " " << setw(10) << " "
      << setw(colwidth) << "up" << setw(colwidth) << "up err"
      << setw(colwidth) << "down" << setw(colwidth) << "down err"
      << endl;
    for(int i=0; i< nmo ; i++) { 
      for(int j=0; j<nmo; j++) { 
        if(complex_orbitals) { 
          os << setw(10) << i << setw(10) << j
            << setw(colwidth) << cndc_up(i,j) << setw(colwidth) << cndc_up_err(i,j)
            << setw(colwidth) << cndc_down(i,j) << setw(colwidth) << cndc_down_err(i,j)
            << endl;
        }
        else { 
          os << setw(10) << i << setw(10) << j
            << setw(colwidth) << cndc_up(i,j).real() 
            << setw(colwidth) << cndc_up_err(i,j).real()
            << setw(colwidth) << cndc_down(i,j).real() 
            << setw(colwidth) << cndc_down_err(i,j).real()
            << endl;

        }
      }

    }
  }
  /*
     totnelectrons = 2; 
     cout << "Ntot: " << totnelectrons << endl; 
     for(int i=0; i < totnelectrons; i++) { 
     cout << "Kin: " << i << " " << avg.vals(nmo + 12*nmo*nmo + i) << "+/-" << err.vals(nmo + 12*nmo*nmo + i) << endl; 
     cout << "Pot: " << i << " " << avg.vals(nmo + 12*nmo*nmo + totnelectrons + i) << "+/-" << err.vals(nmo + 12*nmo*nmo + totnelectrons + i) << endl; 
     }*/


  dcomplex trace=0;
  for(int i=0;i< nmo; i++) trace+=obdm_up(i,i);
  os << "Trace of the obdm: up: " << trace;
  trace=0;
  for(int i=0; i< nmo; i++) trace+=obdm_down(i,i);
  os << " down: " << trace << endl;
}
示例#2
0
void Average_ekt::jsonOutput(Average_return &avg,Average_return &err, ostream & os) {
    
  Array2 <dcomplex> obdm_up(nmo,nmo),obdm_down(nmo,nmo),
         obdm_up_err(nmo,nmo),obdm_down_err(nmo,nmo),
         cndc_up(nmo, nmo), cndc_down(nmo, nmo),
         vlnc_up(nmo, nmo), vlnc_down(nmo, nmo),
         cndc_up_err(nmo, nmo), cndc_down_err(nmo, nmo),
         vlnc_up_err(nmo, nmo), vlnc_down_err(nmo, nmo);
    
  os <<"\""<< avg.type << "\":{" << endl;
  os << "\"nmo\":" << nmo <<","<< endl;
  os << "\"states\":[";
  for(int i=0; i< nmo; i++) {
    if(i==nmo-1) os << occupations[0][i]+1 ;
    else os << occupations[0][i]+1 << "," ;
  }
  os << "]," << endl;
  os << "\"normalization\":{" << endl;
  os << "\"value\":[";
  for(int i=0; i< nmo; i++) {
    if(i< nmo-1) os << avg.vals(i) << ",";
    else os << avg.vals(i);
  }
  os << "],"<< endl;
  os << "\"error\":[";
  for(int i=0; i< nmo; i++) {
    if(i< nmo-1) os << err.vals(i) << ",";
    else os << err.vals(i);
  }
  os << "]"<< endl;
  os << "}," << endl;
  
  if(eval_obdm) {
    dcomplex i_c(0.,1.);
    int place=0;
    for(int i=0; i < nmo; i++) {
      for(int j=0; j < nmo; j++)  {
        doublevar norm=sqrt(avg.vals(i)*avg.vals(j));
        int index=nmo + place;
        obdm_up(i,j)=dcomplex(avg.vals(index),avg.vals(index+1))/norm;
        obdm_up_err(i,j)=dcomplex(err.vals(index),err.vals(index+1))/norm;
                
        index+=2*nmo*nmo;
        obdm_down(i,j)=dcomplex(avg.vals(index),avg.vals(index+1))/norm;
        obdm_down_err(i,j)=dcomplex(err.vals(index),err.vals(index+1))/norm;
        place+=2;
        }
    }
    os << "\"obdm\":{" << endl;
    int colwidth=40;
    if(!complex_orbitals) colwidth=20;
    os << "\"up\":["<< endl;
    for(int i=0; i< nmo ; i++) {
      os << "[";
      for(int j=0; j<nmo; j++) {
        if(complex_orbitals) {
          if(j==nmo-1) os << "["<< obdm_up(i,j).real() <<","<< obdm_up(i,j).imag()<<"]";
          else  os << "["<< obdm_up(i,j).real() <<","<< obdm_up(i,j).imag()<<"],";
        }
        else {
          if(j==nmo-1) os << obdm_up(i,j).real();
          else os << obdm_up(i,j).real() << ",";
        }
      }
      if(i==nmo-1) os << "]" << endl;
      else os <<"]," << endl;
    }
    os << "]," << endl;
    
    os << "\"up_err\":["<< endl;
    for(int i=0; i< nmo ; i++) {
      os << "[";
      for(int j=0; j<nmo; j++) {
        if(complex_orbitals) {
          if(j==nmo-1) os <<"["<<obdm_up_err(i,j).real() <<","<< obdm_up_err(i,j).imag()<<"]";
          else os <<"["<< obdm_up_err(i,j).real() <<","<< obdm_up_err(i,j).imag()<<"],";
        }
        else {
          if(j==nmo-1) os << obdm_up_err(i,j).real();
          else os << obdm_up_err(i,j).real() << ",";
        }
      }
      if(i==nmo-1) os << "]" << endl;
      else os <<"]," << endl;
    }
    os << "]," << endl;
    
    os << "\"down\":["<< endl;
    for(int i=0; i< nmo ; i++) {
      os << "[";
      for(int j=0; j<nmo; j++) {
        if(complex_orbitals) {
          if(j==nmo-1) os << "["<< obdm_down(i,j).real() <<","<< obdm_down(i,j).imag()<<"]";
          else  os << "["<< obdm_down(i,j).real() <<","<< obdm_down(i,j).imag()<<"],";
        }
        else {
          if(j==nmo-1) os << obdm_down(i,j).real();
          else os << obdm_down(i,j).real() << ",";
        }
      }
      if(i==nmo-1) os << "]" << endl;
      else os <<"]," << endl;
    }
    os << "]," << endl;
    
    os << "\"down_err\":["<< endl;
    for(int i=0; i< nmo ; i++) {
      os << "[";
      for(int j=0; j<nmo; j++) {
        if(complex_orbitals) {
          if(j==nmo-1) os <<"["<< obdm_down_err(i,j).real() <<","<< obdm_down_err(i,j).imag()<<"]";
          else os << "[" << obdm_down_err(i,j).real() <<","<< obdm_down_err(i,j).imag()<<"],";
        }
        else {
          if(j==nmo-1) os << obdm_down_err(i,j).real();
          else os << obdm_down_err(i,j).real() << ",";
        }
      }
      if(i==nmo-1) os << "]" << endl;
      else os <<"]," << endl;
    }
    os << "]" << endl;
    os << "}," << endl;
  }
    
  if (eval_valence) {
    dcomplex i_c(0.,1.);
    int place=0;
    for(int i=0; i < nmo; i++) {
      for(int j=0; j < nmo; j++)  {
        doublevar norm=sqrt(avg.vals(i)*avg.vals(j));
        int index=nmo+4*nmo*nmo + place;
        vlnc_up(i,j)=dcomplex(avg.vals(index),avg.vals(index+1))/norm;
        vlnc_up_err(i,j)=dcomplex(err.vals(index),err.vals(index+1))/norm;
                
        index+=2*nmo*nmo;
        vlnc_down(i,j)=dcomplex(avg.vals(index),avg.vals(index+1))/norm;
        vlnc_down_err(i,j)=dcomplex(err.vals(index),err.vals(index+1))/norm;
        place+=2;
        }
    }
        
    os << "\"valence\":{" << endl;
    int colwidth=40;
    if(!complex_orbitals) colwidth=20;
    
    os << "\"up\":["<< endl;
    for(int i=0; i< nmo ; i++) {
      os << "[";
      for(int j=0; j<nmo; j++) {
        if(complex_orbitals) {
          if(j==nmo-1) os << "["<< vlnc_up(i,j).real() <<","<< vlnc_up(i,j).imag()<<"]";
          else  os << "["<< vlnc_up(i,j).real() <<","<< vlnc_up(i,j).imag()<<"],";
        }
        else {
          if(j==nmo-1) os << vlnc_up(i,j).real();
          else os << vlnc_up(i,j).real() << ",";
        }
      }
      if(i==nmo-1) os << "]" << endl;
      else os <<"]," << endl;
    }
    os << "]," << endl;
    
    os << "\"up_err\":["<< endl;
    for(int i=0; i< nmo ; i++) {
      os << "[";
      for(int j=0; j<nmo; j++) {
        if(complex_orbitals) {
          if(j==nmo-1) os <<"["<<vlnc_up_err(i,j).real() <<","<< vlnc_up_err(i,j).imag()<<"]";
          else os <<"["<< vlnc_up_err(i,j).real() <<","<< vlnc_up_err(i,j).imag()<<"],";
        }
        else {
          if(j==nmo-1) os << vlnc_up_err(i,j).real();
          else os << vlnc_up_err(i,j).real() << ",";
        }
      }
      if(i==nmo-1) os << "]" << endl;
      else os <<"]," << endl;
    }
    os << "]," << endl;
        
    os << "\"down\":["<< endl;
    for(int i=0; i< nmo ; i++) {
      os << "[";
      for(int j=0; j<nmo; j++) {
        if(complex_orbitals) {
          if(j==nmo-1) os << "["<< vlnc_down(i,j).real() <<","<< vlnc_down(i,j).imag()<<"]";
          else  os << "["<< vlnc_down(i,j).real() <<","<< vlnc_down(i,j).imag()<<"],";
        }
        else {
          if(j==nmo-1) os << vlnc_down(i,j).real();
          else os << vlnc_down(i,j).real() << ",";
        }
      }
      if(i==nmo-1) os << "]" << endl;
      else os <<"]," << endl;
    }
    os << "]," << endl;
        
    os << "\"down_err\":["<< endl;
    for(int i=0; i< nmo ; i++) {
      os << "[";
      for(int j=0; j<nmo; j++) {
        if(complex_orbitals) {
          if(j==nmo-1) os <<"["<< vlnc_down_err(i,j).real() <<","<< vlnc_down_err(i,j).imag()<<"]";
          else os << "[" << vlnc_down_err(i,j).real() <<","<< vlnc_down_err(i,j).imag()<<"],";
        }
        else {
          if(j==nmo-1) os << vlnc_down_err(i,j).real();
          else os << vlnc_down_err(i,j).real() << ",";
        }
      }
      if(i==nmo-1) os << "]" << endl;
      else os <<"]," << endl;
    }
    os << "]" << endl;
    os << "}," << endl;
  }
    
  if (eval_conduction) {
    dcomplex i_c(0.,1.);
    int place=0;
    for(int i=0; i < nmo; i++) {
      for(int j=0; j < nmo; j++)  {
        doublevar norm=sqrt(avg.vals(i)*avg.vals(j));
        int index=nmo + 8*nmo*nmo + place;
        cndc_up(i,j)=dcomplex(avg.vals(index),avg.vals(index+1))/norm;
        cndc_up_err(i,j)=dcomplex(err.vals(index),err.vals(index+1))/norm;
                
        index+=2*nmo*nmo;
        cndc_down(i,j)=dcomplex(avg.vals(index),avg.vals(index+1))/norm;
        cndc_down_err(i,j)=dcomplex(err.vals(index),err.vals(index+1))/norm;
        place+=2;
        }
    }
        
    os << "\"conduction\":{" << endl;
    int colwidth=40;
    if(!complex_orbitals) colwidth=20;
       
    os << "\"up\":["<< endl;
    for(int i=0; i< nmo ; i++) {
      os << "[";
      for(int j=0; j<nmo; j++) {
        if(complex_orbitals) {
          if(j==nmo-1) os << "["<< cndc_up(i,j).real() <<","<< cndc_up(i,j).imag()<<"]";
          else  os << "["<< cndc_up(i,j).real() <<","<< cndc_up(i,j).imag()<<"],";
        }
        else {
          if(j==nmo-1) os << cndc_up(i,j).real();
          else os << cndc_up(i,j).real() << ",";
        }
      }
      if(i==nmo-1) os << "]" << endl;
      else os <<"]," << endl;
    }
    os << "]," << endl;
        
    os << "\"up_err\":["<< endl;
    for(int i=0; i< nmo ; i++) {
      os << "[";
      for(int j=0; j<nmo; j++) {
        if(complex_orbitals) {
          if(j==nmo-1) os <<"["<<cndc_up_err(i,j).real() <<","<< cndc_up_err(i,j).imag()<<"]";
          else os <<"["<< cndc_up_err(i,j).real() <<","<< cndc_up_err(i,j).imag()<<"],";
        }
        else {
          if(j==nmo-1) os << cndc_up_err(i,j).real();
          else os << cndc_up_err(i,j).real() << ",";
        }
      }
      if(i==nmo-1) os << "]" << endl;
      else os <<"]," << endl;
    }
    os << "]," << endl;
        
        
    os << "\"down\":["<< endl;
    for(int i=0; i< nmo ; i++) {
      os << "[";
      for(int j=0; j<nmo; j++) {
        if(complex_orbitals) {
          if(j==nmo-1) os << "["<< cndc_down(i,j).real() <<","<< cndc_down(i,j).imag()<<"]";
          else  os << "["<< cndc_down(i,j).real() <<","<< cndc_down(i,j).imag()<<"],";
        }
        else {
          if(j==nmo-1) os << cndc_down(i,j).real();
          else os << cndc_down(i,j).real() << ",";
        }
      }
      if(i==nmo-1) os << "]" << endl;
      else os <<"]," << endl;
    }
    os << "]," << endl;
    
    os << "\"down_err\":["<< endl;
    for(int i=0; i< nmo ; i++) {
      os << "[";
      for(int j=0; j<nmo; j++) {
        if(complex_orbitals) {
          if(j==nmo-1) os <<"["<< cndc_down_err(i,j).real() <<","<< cndc_down_err(i,j).imag()<<"]";
          else os << "[" << cndc_down_err(i,j).real() <<","<< cndc_down_err(i,j).imag()<<"],";
        }
        else {
          if(j==nmo-1) os << cndc_down_err(i,j).real();
          else os << cndc_down_err(i,j).real() << ",";
        }
      }
      if(i==nmo-1) os << "]" << endl;
      else os <<"]," << endl;
    }
    os << "]" << endl;
    os << "}" << endl;
  }
 
  //dcomplex trace=0;
  //for(int i=0;i< nmo; i++) trace+=obdm_up(i,i);
  //os << "\"Trace of the obdm\":{" << endl;
  //os << "\"up\":[" << trace.real()<< "," << trace.imag()<<"]" << "," << endl;
  //trace=0;
  //for(int i=0; i< nmo; i++) trace+=obdm_down(i,i);
  //os << "\"down\":[" << trace.real()<< "," << trace.imag()<<"]" << endl;
  //os << "}" << endl;
  os << "}" << endl;
}
	color physicalsky_color(const vector & ray_dir)
	{
		scalar haze_val = max(i_haze() + 2.0f, 2.0f);
		vector sun_dir_val(i_sun_direction());
		color sky_color(0.0f);
		int i_type = 0;
		switch ( i_type )
		{
		case 0:
			{
				sky_color = 0.0001f * get_haze_driven_sky_color(ray_dir, sun_dir_val, haze_val);
			}
			break;
		case 1:
			{
				sky_color = get_cie_standard_sky_color(ray_dir, sun_dir_val, color(i_zenith_luminance()), i_a(), i_b(), i_c(), i_d(), i_e());
			}
			break;
		default:
			{
				return color(0.0f);
			}
		}
		
		return i_multiplier() * sky_color * get_sun_intensity(ray_dir, sun_dir_val, haze_val, i_sun_disk_scale(), i_sun_disk_intensity(), 1.0f/*sun_glow_size()*/, i_sun_glow_intensity(), 5.0f/*sun_glow_falloff()*/);
	}