//---------------------------------------------------------------------- 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; }
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()*/); }