int paw_get_orbital_index(int prin_n, int orb_l) { int i; int index; int orbital_found; index = -1; orbital_found = False; for (i=0; i <= Ntotal-1;i++) { if ( n[i]==prin_n && l[i]==orb_l) { index = i; orbital_found = True; break; } } if ( !(orbital_found)) { printf("while generating paw basis \n"); printf("the all electron orbital %d%s could not be located \n",prin_n,paw_spd_Name(orb_l)); printf("please check your <orbitals> section \n"); exit(1); } return index; }
void paw_print_basis_information(FILE *fp) { int i; fprintf(fp,"\n"); fprintf(fp," Basis information :\n"); fprintf(fp,"\n"); fprintf(fp," nodal constraint = %s\n", nodal_constraint); fprintf(fp," projector method = %s\n", projector_method); fprintf(fp,"\n"); fprintf(fp," nl e fill dEkin\n"); for (i=0; i<nbasis; ++i) { fprintf(fp," %d%s %le %f %d%s\n",prin_n[i],paw_spd_Name(orb_l[i]), e_ps[i],fill[i],delta_ekin[i],"%"); } fprintf(fp,"\n\n"); }
/**************************************** Function name : paw_solve_pseudo_orbitals Description : Return type : void Author : Marat Valiev Date & Time : 5/15/00 ****************************************/ void paw_solve_pseudo_orbitals() { int i; int k; int i_end_point; int Ngrid; double scale; double *rgrid; Ngrid = paw_N_LogGrid(); rgrid = paw_r_LogGrid(); for (i=0;i<= nbasis-1;i++) { i_end_point = paw_get_grid_index(1.2*r_orbital[i]); paw_solve_paw_scattering(orb_l[i], 3*r_orbital[i], e_ps[i], psi_ps[i],psi_ps_prime[i]); if (paw_debug()) printf("%d%s log derivative %le %le \n",prin_n[i],paw_spd_Name(orb_l[i]), psi_ps_prime[i][i_end_point]/(psi_ps[i][i_end_point]*rgrid[i_end_point]*paw_log_amesh_LogGrid()), phi0_prime[i][i_end_point]/(phi0[i][i_end_point]*rgrid[i_end_point]*paw_log_amesh_LogGrid())); /*rescale the orbitals*/ scale = phi_ps0[i][i_r_orbital[i]]/psi_ps[i][i_r_orbital[i]]; for (k=0;k<=i_end_point;++k) { psi_ps[i][k] = psi_ps[i][k]*scale; psi_ps_prime[i][k] = psi_ps_prime[i][k]*scale; } for (k=i_end_point+1;k<=Ngrid-1;++k) { psi_ps[i][k] = phi_ps0[i][k]; psi_ps_prime[i][k] = phi_ps0_prime[i][k]; } } }
/**************************************** Function name : paw_print_orbital_information Description : Return type : void Argument : FILE *fp Author : Marat Valiev Date & Time : 3/31/99 3:01:37 PM ****************************************/ void paw_print_orbital_information(FILE *fp) { int i; fprintf(fp,"\n************ ORBITALS ********\n"); fprintf(fp,"number of valence orbitals : %d\n",Nvalence); fprintf(fp,"number of virtual orbitals : %d\n",Nvirt); fprintf(fp,"number of scattering orbitals : %d\n\n",Nscat); fprintf(fp,"n\tl\tpopulation\tEigenvalue\tDescription\n"); for (i=0; i<Ntotal; ++i) { fprintf(fp,"%d\t%s\t%.2lf\t\t%f\t%s\n",n[i],paw_spd_Name(l[i]), fill[i],eigenvalue[i],paw_orbital_type_name(orb_type[i])); } fprintf(fp,"\n\n"); }
void paw_print_paw_potential_information(FILE *fp) { int i; int *n; int *l; fprintf(fp,"\n"); fprintf(fp," Paw potential information :\n"); fprintf(fp,"\n"); fprintf(fp," reference potential matching radius = %le\n", paw_get_potential_matching_radius()); fprintf(fp," reference potential rcut parameter = %le\n", rc_ref); fprintf(fp," lambda parameter = %le\n", lambda); fprintf(fp," potential tolerance = %le\n", pot_tolerance); fprintf(fp,"\n"); n = paw_get_pointer_paw_n_array(); l = paw_get_pointer_l_array(); fprintf(fp," nl c[i] rcut[i] \n"); for (i=0;i<=nbasis-1;i++) { fprintf(fp," %d%s %f %f \n",n[i],paw_spd_Name(l[i]),c[i], rc_pot[i]); } fprintf(fp,"\n\n"); }
void paw_print_paw_potential_to_file(char* atom_name) { int i; int j; int k; int Ngrid; int *prin_n; int * orb_l; double *rgrid; char data_filename[300]; char script_filename[300]; char nl_name[20]; FILE *fp; if (paw_debug()) { Ngrid = paw_N_LogGrid(); rgrid = paw_r_LogGrid(); prin_n = paw_get_pointer_paw_n_array(); orb_l = paw_get_pointer_paw_l_array(); sprintf(data_filename,"%s%s_pot.dat",paw_sdir(),atom_name); fp = fopen(data_filename,"w+"); for (k=0; k<=Ngrid-1; k++) { fprintf(fp,"%le\t%le\t%le", rgrid[k], V_ref[k], V_pseudo[k]); for (i=0; i<=nbasis-1; i++) fprintf(fp,"\t%le ",V_paw[i][k]); fprintf(fp,"\n"); } fclose(fp); sprintf(script_filename,"%s%s_ref_pot.plt",paw_sdir(),atom_name); fp = fopen(script_filename,"w+"); fprintf(fp,"set data style lines \n"); fprintf(fp,"set nolabel \n"); fprintf(fp,"set autoscale \n"); fprintf(fp,"set xr[0:%f] \n",2*r_ref); fprintf(fp,"set grid \n"); fprintf(fp,"set nokey \n"); fprintf(fp,"set nolabel \n"); fprintf(fp,"set xlabel \"r (a0)\" \n"); fprintf(fp,"set title \" %s reference potential\n",atom_name); fprintf(fp,"plot \"%s\" using 1:2 \n",data_filename); fprintf(fp,"\n"); fprintf(fp,"pause -1\n"); fclose(fp); sprintf(script_filename,"%s%s_loc_pot.plt",paw_sdir(),atom_name); fp = fopen(script_filename,"w+"); fprintf(fp,"set data style lines \n"); fprintf(fp,"set nolabel \n"); fprintf(fp,"set autoscale \n"); fprintf(fp,"set xr[0:%f] \n",2*r_ref); fprintf(fp,"set grid \n"); fprintf(fp,"set nokey \n"); fprintf(fp,"set nolabel \n"); fprintf(fp,"set xlabel \"r (a0)\" \n"); fprintf(fp,"set title \" %s local potential\n",atom_name); fprintf(fp,"plot \"%s\" using 1:3 \n",data_filename); fprintf(fp,"\n"); fprintf(fp,"pause -1\n"); fclose(fp); /*gnu script file */ for (i=0,j=4; i<=nbasis-1; i++,j=j+1) { sprintf(nl_name,"%d%s",prin_n[i],paw_spd_Name(orb_l[i])); sprintf(script_filename,"%s%s_%s_pot.plt",paw_sdir(),atom_name,nl_name); fp = fopen(script_filename,"w+"); fprintf(fp,"set data style lines \n"); fprintf(fp,"set nolabel \n"); fprintf(fp,"set autoscale \n"); fprintf(fp,"set xr[0:%f] \n",1.5*r_potential[i]); fprintf(fp,"set grid \n"); fprintf(fp,"set nokey \n"); fprintf(fp,"set nolabel \n"); fprintf(fp,"set xlabel \"r (a0)\" \n"); fprintf(fp,"set title \" %s paw potential for %s orbital\" \n", atom_name,nl_name); fprintf(fp,"plot \"%s\" using 1:%d \n",data_filename,j); fprintf(fp,"\n"); fprintf(fp,"pause -1\n"); fclose(fp); } } }
/**************************************** Function name : solve_pseudo_orbitals Description : Return type : void Author : Marat Valiev Date & Time : 4/7/99 2:31:16 PM ****************************************/ void paw_generate_pseudo_orbitals() { int i; int k; int Ngrid; int max_iter; int converged; int iteration; int match; int status; double log_amesh; double f1,f2; double *V; double *rgrid; double *f; double norm; char output[300]; FILE *fp; Ngrid = paw_N_LogGrid(); rgrid = paw_r_LogGrid(); log_amesh = paw_log_amesh_LogGrid(); /*set maximum number of iterations*/ max_iter = 600; for (i = 0; i <= nbasis-1; i++) { iteration = 0; converged = False; status = False; match = i_r_orbital[i]; /*Start the selfconsistent loop over given ps state */ while ((iteration <= max_iter) && (!converged)) { ++iteration; /* get pseudopotential*/ V = paw_get_paw_potential(i); /* if(orb_type[i]==bound || orb_type[i]==virt) { status = paw_R_Schrodinger(prin_n_ps[i], orb_l[i], V, &e_ps[i], phi_ps[i], phi_ps_prime[i]); } else if(orb_type[i]==scattering) { status = paw_R_Schrodinger_Fixed_Logderiv(prin_n_ps[i], orb_l[i], V, match, log_deriv[i], &e_ps[i], phi_ps[i], phi_ps_prime[i]); } else { printf("unknown orbital type\n"); exit(1); } */ status = paw_R_Schrodinger_Fixed_Logderiv(prin_n_ps[i], orb_l[i], V, match, log_deriv[i], &e_ps[i], phi_ps[i], phi_ps_prime[i]); /*Update pseudopotential potential*/ paw_update_paw_potential(&converged, i, e[i], e_ps[i],phi_ps[i]); } /*report on convergence status*/ if (converged && (status)) { if (paw_debug()) printf("\n%d%d pseudo orbital with the eigenvalue=%f has been found\n", prin_n[i], orb_l[i], e_ps[i]); } else { if (paw_debug()) printf("Unable to find %d%d orbital\n ", prin_n[i], orb_l[i]); } norm = phi[i][match]/phi_ps[i][match]; /*scale ps orbital */ for (k=0;k<=match;k++) { phi_ps[i][k]=phi_ps[i][k]*norm; phi_ps_prime[i][k]=phi_ps_prime[i][k]*norm; } for (k=match+1;k<=Ngrid-1;k++) { phi_ps[i][k]=phi[i][k]; phi_ps_prime[i][k]=phi_prime[i][k]; } } if (paw_debug()) { for (i = 0; i <= nbasis-1; ++i) { sprintf(output, "%s%s%d%d", paw_sdir(),"test",prin_n[i],orb_l[i]); fp = fopen(output, "w+"); for (k = 0; k < Ngrid; k++) { fprintf(fp, "%f\t%f\t%f\n", rgrid[k], phi[i][k],phi_ps[i][k]); } fclose(fp); } } pseudo_orbitals_done = True; /* save original basis functions */ for (i=0;i<=nbasis-1;i++) { for (k = 0; k <= Ngrid-1; k++) { phi0[i][k] = phi[i][k]; phi0_prime[i][k] = phi_prime[i][k]; phi_ps0[i][k] = phi_ps[i][k]; phi_ps0_prime[i][k] = phi_ps_prime[i][k]; } } /* calculate densities */ paw_Zero_LogGrid(rho); paw_Zero_LogGrid(rho_ps); for (i = 0; i <= nbasis-1; i++) { for (k = 0; k <= Ngrid-1; k++) { rho[k] += fill[i]*pow((phi0[i][k]/rgrid[k]),2.0); rho_ps[k] += fill[i]*pow((phi_ps0[i][k]/rgrid[k]),2.0); } } /*calculate kinetic energy*/ ekin = paw_get_kinetic_energy(nbasis, orb_l, fill, phi, phi_prime); f = paw_alloc_LogGrid(); for (i = 0; i <= nbasis-1; i++) { for (k=0; k<=Ngrid-1; k++) { f[k] = 0.5*phi_prime[i][k]/(rgrid[k]*log_amesh)* phi_prime[i][k]/(rgrid[k]*log_amesh) - 0.5*phi_ps_prime[i][k]/(rgrid[k]*log_amesh)* phi_ps_prime[i][k]/(rgrid[k]*log_amesh); } f1 = paw_Def_Integr(0.0,f,0.0,Ngrid-1); for (k=0; k<=Ngrid-1; k++) { f[k] = 0.5*phi_prime[i][k]/(rgrid[k]*log_amesh)* phi_prime[i][k]/(rgrid[k]*log_amesh); } f2 = paw_Def_Integr(0.0,f,0.0,Ngrid-1); delta_ekin[i] = (int)(100*f1/f2); if (paw_debug()) printf("kinetic energy of the %d%s orbital was reduced by %d%s\n", prin_n[i],paw_spd_Name(orb_l[i]),delta_ekin[i],"%"); } paw_dealloc_LogGrid(f); }
/**************************************** Function name : paw_solve_pseudo_orbitals Description : Return type : void Author : Marat Valiev Date & Time : 5/15/00 ****************************************/ void paw_scattering_test(double e1,double e2,int number_points ,int l, double r ) { int i; int k; int i_end_point; int Ngrid; double *rgrid; FILE *fp; double *V_ks; double *psi1; double *psi1_prime; double *psi; double *psi_prime; double *log_grid_ae; double *log_grid_paw; double de; double* e3; double e_test; double log_amesh; /*char output[30];*/ char data_filename[300]; char script_filename[300]; Ngrid = paw_N_LogGrid(); rgrid = paw_r_LogGrid(); log_amesh = paw_log_amesh_LogGrid(); psi1 = paw_alloc_LogGrid(); psi1_prime = paw_alloc_LogGrid(); psi = paw_alloc_LogGrid(); psi_prime = paw_alloc_LogGrid(); log_grid_ae = paw_alloc_1d_array(number_points); log_grid_paw = paw_alloc_1d_array(number_points); e3 = paw_alloc_1d_array(number_points); de = (e2-e1)/number_points; V_ks = paw_get_kohn_sham_potential(); i_end_point = paw_get_grid_index(r); for (i=0;i<= number_points-1;i++) { e_test = e1+de*i; e3[i] = e_test; paw_solve_paw_scattering(l, r, e_test, psi,psi_prime); paw_R_Schrodinger_Fixed_E( l, V_ks, i_end_point, e_test, psi1, psi1_prime ); log_grid_ae[i] = psi1_prime[i_end_point-1]/(psi1[i_end_point-1]*rgrid[i_end_point-1]*log_amesh); log_grid_paw[i] = psi_prime[i_end_point-1]/(psi[i_end_point-1]*rgrid[i_end_point-1]*log_amesh); } if (paw_debug()) { sprintf(data_filename,"%s%s_%s_scat_test.dat", paw_sdir(),paw_get_atom_name(),paw_spd_Name(l)); fp = fopen(data_filename,"w+"); for (k=0; k<=number_points-1; k++) { fprintf(fp,"%le\t%le\t%le\n", e3[k],log_grid_ae[k],log_grid_paw[k]); } fclose(fp); sprintf(script_filename,"%s%s_%s_scat_test.plt", paw_sdir(),paw_get_atom_name(),paw_spd_Name(l)); printf("script_filename: %s\n",script_filename); fp = fopen(script_filename,"w+"); fprintf(fp,"set style data lines \n"); fprintf(fp,"set nolabel \n"); fprintf(fp,"set autoscale \n"); fprintf(fp,"set xr[%f:%f] \n",e1,e2); fprintf(fp,"set grid \n"); fprintf(fp,"set nolabel \n"); fprintf(fp,"set xlabel \"e (Hartree)\" \n"); fprintf(fp,"set ylabel \"logarithmic derivative at r=%f\" \n",r); fprintf(fp,"set title \" %s %s channel scattering test\n",paw_get_atom_name(),paw_spd_Name(l)); fprintf(fp,"plot \"%s\" using 1:2 title \"all electron\",",data_filename); fprintf(fp,"\"\" using 1:3 title \"paw\" \n"); fprintf(fp,"\n"); fprintf(fp,"pause -1\n"); fclose(fp); } }
/**************************************** Function name : paw_print_basis_to_file Description : Return type : void Author : Marat Valiev Date & Time : 3/31/99 3:01:57 PM ****************************************/ void paw_print_basis_test_to_file(char* atom_name) { int i; int j; int k; int Ngrid; double *rgrid; char data_filename[300]; char script_filename[300]; char nl_name[20]; char title[20]; FILE *fp; Ngrid = paw_N_LogGrid(); rgrid = paw_r_LogGrid(); if (paw_debug()) { sprintf(data_filename,"%s%s_test.dat",paw_sdir(),atom_name); printf("data_filename: %s\n",data_filename); fp = fopen(data_filename,"w+"); for (k=0; k<=Ngrid-1; k++) { fprintf(fp,"%le", rgrid[k]); for (i=0; i<=nbasis-1; i++) fprintf(fp,"\t%le \t%le",phi_ps0[i][k],psi_ps[i][k]); fprintf(fp,"\n"); } fclose(fp); /*gnu script file */ for (i=0,j=2; i<=nbasis-1; i++,j=j+2) { sprintf(nl_name,"%d%s",prin_n[i],paw_spd_Name(orb_l[i])); sprintf(script_filename,"%s%s_%s_test.plt",paw_sdir(),atom_name,nl_name); printf("script_filename: %s \n",script_filename); fp = fopen(script_filename,"w+"); fprintf(fp,"set style data lines \n"); fprintf(fp,"set nolabel \n"); fprintf(fp,"set autoscale \n"); fprintf(fp,"set xr[0:%f] \n",1.5*r_orbital[i]); fprintf(fp,"set grid \n"); fprintf(fp,"set key \n"); fprintf(fp,"set nolabel \n"); fprintf(fp,"set xlabel \"r (a0)\" \n"); fprintf(fp,"set title \" %s paw_basis test for %s\\n (e=%f Hartree)\" \n", nl_name,atom_name,e_ps[i]); sprintf(title,"%s (%f)",nl_name,e_ps[i]); fprintf(fp,"plot \"%s\" using 1:%d title \" original pseudo orbital \" , ",data_filename,j); fprintf(fp,"\"%s\" using 1:%d title \" solution of PAW Hamiltonian \" with points\n",data_filename,j+1); fprintf(fp,"\n"); fprintf(fp,"pause -1\n"); fclose(fp); } } }
/**************************************** Function name : paw_print_basis_to_file Description : Return type : void Author : Marat Valiev Date & Time : 3/31/99 3:01:57 PM ****************************************/ void paw_print_basis_to_file(char* atom_name) { int i; int j; int k; int Ngrid; double *rgrid; char data_filename[300]; char script_filename[300]; char nl_name[20]; char title[20]; FILE *fp; Ngrid = paw_N_LogGrid(); rgrid = paw_r_LogGrid(); if (paw_debug()) { sprintf(data_filename,"%s%s_paw.dat",paw_sdir(),atom_name); fp = fopen(data_filename,"w+"); for (k=0; k<=Ngrid-1; k++) { fprintf(fp,"%le", rgrid[k]); for (i=0; i<=nbasis-1; i++) fprintf(fp,"\t%le \t%le \t%le ",phi[i][k],phi_ps[i][k],prj_ps[i][k]); fprintf(fp,"\n"); } fclose(fp); /* individual orbitals gnu script file */ for (i=0,j=2; i<=nbasis-1; i++,j=j+3) { sprintf(nl_name,"%d%s",prin_n[i],paw_spd_Name(orb_l[i])); sprintf(script_filename,"%s%s_%s_paw.plt",paw_sdir(),atom_name,nl_name); fp = fopen(script_filename,"w+"); fprintf(fp,"set style data lines \n"); fprintf(fp,"set nolabel \n"); fprintf(fp,"set autoscale \n"); fprintf(fp,"set xr[0:%f] \n",1.5*r_orbital[i]); fprintf(fp,"set grid \n"); fprintf(fp,"set key \n"); fprintf(fp,"set nolabel \n"); fprintf(fp,"set xlabel \"r (a0)\" \n"); fprintf(fp,"set title \" %s paw_basis for %s\\n (e=%f Hartree)\" \n", nl_name,atom_name,e_ps[i]); sprintf(title,"%s (%f)",nl_name,e_ps[i]); fprintf(fp,"plot \"%s\" using 1:%d title \" all-electron orbital \" , ",data_filename,j); fprintf(fp,"\"%s\" using 1:%d title \" pseudo orbital \" , ",data_filename,j+1); fprintf(fp,"\"%s\" using 1:%d title \" projector \" \n",data_filename,j+2); fprintf(fp,"\n"); fprintf(fp,"pause -1\n"); fclose(fp); } } }
/**************************************** Function name : paw_save_orbitals_to_file Description : Return type : void Author : Marat Valiev Date & Time : 3/31/99 3:01:57 PM ****************************************/ void paw_print_orbitals_to_file(char* atom_name) { int i; int k; int Ngrid; double *rgrid; char data_filename[300]; char script_filename[300]; char nl_name[20]; char title[20]; FILE *fp; Ngrid = paw_N_LogGrid(); rgrid = paw_r_LogGrid(); if (paw_debug()) { sprintf(data_filename,"%s%s_orb.dat",paw_sdir(),atom_name); fp = fopen(data_filename,"w+"); for (k=0; k<=Ngrid-1; k++) { fprintf(fp,"%le", rgrid[k]); for (i=0; i<=Ntotal-1; i++) { fprintf(fp,"\t%le",psi[i][k]); } fprintf(fp,"\n"); } fclose(fp); /* all orbitals gnu script file */ sprintf(script_filename,"%s%s_all_orb.plt",paw_sdir(),atom_name); fp = fopen(script_filename,"w+"); fprintf(fp, "set title \" Kohn-Sham bound states for %s \" \n", atom_name); fprintf(fp,"set nolabel \n"); fprintf(fp,"set key right top box\n"); fprintf(fp,"set grid \n"); fprintf(fp,"set xlabel \"r (a0)\" \n"); fprintf(fp,"set style data lines \n"); fprintf(fp,"set autoscale \n"); fprintf(fp,"set xr[0:5] \n"); i=0; sprintf(nl_name,"%d%s",n[i],paw_spd_Name(l[i])); sprintf(title,"%s (%f)",nl_name,eigenvalue[i]); fprintf(fp,"plot \"%s\" using 1:2 title \"%s\" ",data_filename,title); for (i=1; i<=Nbound-1; i++) { sprintf(nl_name,"%d%s",n[i],paw_spd_Name(l[i])); sprintf(title,"%s (%f)",nl_name,eigenvalue[i]); fprintf(fp,",\"\" using 1:%d title \"%s\" ",i+2,title); } fprintf(fp,"\n"); fprintf(fp,"pause -1\n"); fclose(fp); /* individual orbitals gnu script file */ for (i=0; i<=Ntotal-1; i++) { sprintf(nl_name,"%d%s",n[i],paw_spd_Name(l[i])); sprintf(script_filename,"%s%s_%s_orb.plt",paw_sdir(),atom_name,nl_name); fp = fopen(script_filename,"w+"); fprintf(fp,"set style data lines \n"); fprintf(fp,"set nolabel \n"); fprintf(fp,"set autoscale \n"); fprintf(fp,"set xr[0:%d] \n",n[i]+l[i]); fprintf(fp,"set xlabel \"r (a0)\" \n"); fprintf(fp,"set grid \n"); fprintf(fp,"set nokey \n"); fprintf(fp,"set title \" %s orbital for %s\\n (e=%f Hartree)\" \n", nl_name,atom_name,eigenvalue[i]); sprintf(title,"%s (%f)",nl_name,eigenvalue[i]); fprintf(fp,"plot \"%s\" using 1:%d title \"%s\" ",data_filename,i+2,title); fprintf(fp,"\n"); fprintf(fp,"pause -1\n"); fclose(fp); } } }