(large attachment removed, the pseudopotential file is Bi.pbe-dn-rrkjus_psl.0.2.2.UPF)
-------- Forwarded Message --------
Subject:        Problem with electric polarization calculation in quantum 
espresso
Date:   Thu, 14 Mar 2024 01:05:32 +0000
From:   Akshay Mahajan <akshaymah...@iisc.ac.in>
To:     users@lists.quantum-espresso.org <users@lists.quantum-espresso.org>


Dear QE Users,
I have been trying to calculate electric polarization for a 2D Bi monolayer (along the in-plane x-direction). I am using QE version 6.4.1.There are two issues that I am facing,

 1.
    The magnitude of the polarization changes significantly when the k_y
    values change (I am keeping k_z to 1 only since it is a 2D system).
    I expected it to reach some converged value but rather it keeps
    increasing on increasing the k_y value and then drops and then again
    starts increasing. The bash file is included in the email for this
    calculation. In the bash file (polarization_conv.sh) I am changing
    both k_x and k_y in the scf calculation and changing nppstr to 2*k_x
    and keeping k_x =nppstr in the nscf calculation. The result from
    running this bash script run is also included(pol_conv_Bi_mono). One
    can modify the script and check that only changing the k_y is
    causing this huge change in the polarization values.
 2.
    As per this paper
    (https://onlinelibrary.wiley.com/doi/full/10.1002/adfm.201707383
    <https://onlinelibrary.wiley.com/doi/full/10.1002/adfm.201707383>)
    the positive delta_h (refer to the paper for definition) should
    result in a positive polarization. While trying to calculate the
    variation of electric polarization with delta_h, I am getting
    negative polarization values for positive delta_h near the
    centrosymmetric structure (delta_h=0) and positive values for
    negative delta_h (again near the centrosymmetric structure
    (delta_h=0)). The bash script (polarization.sh) for this calculation
    and the result(pol_data_Bi_mono) are also attached.

I am also attaching the pseudopotential file for reference. Please let me know if anyone can determine the issue behind these incorrect results.
Thank you.
Regards,
*Akshay Mahajan*
*Ph.D. Student *
*Prime Minister Research Fellow (PMRF) *
*Solid State and Structural Chemistry Unit (SSCU) *
*Indian Institute of Science (IISc)*
*Bengaluru, India *

Attachment: pol_conv_Bi_mono
Description: Binary data

Attachment: pol_data_Bi_mono
Description: Binary data

#!/bin/bash

# Script to get the energy versus polarization and energy versus displacement plots
# Exclusive for Bi project (uses verticle dispalcement for polarization)

######### Energy conversion from Ry to eV parameter #########
Q=13.605703976
######### Intial values from relaxed FE structure #########
h_u_pol=18.419321249     # polar h displacement in upper layer
h_l_pol=15.420625873     # polar h displacement in lower layer
u_ref=17.790480876       # ref for polar h displacement in upper layer
l_ref=14.791753001       # ref for polar h displacement in lower layer
z_vacc=33.211090088      # Lattice parameter along the vaccum

######### Initializing the delta_h values for polar structure #########
delta_h_u_pol=`echo "scale=9; $h_u_pol - $u_ref" | bc`
delta_h_l_pol=`echo "scale=9; $h_l_pol - $l_ref" | bc`

######### Initializing the delta_h value of equally stable other polar structure #########
neg=-1
neg_delta_h_u_pol=`echo "scale=9; $delta_h_u_pol * $neg" | bc`
neg_delta_h_l_pol=`echo "scale=9; $delta_h_l_pol * $neg" | bc`

######### Intializing the outskirt of polar displacement for plotting W curves #########
## positive outskirt
#u_pos_max=`echo "scale=9; 2.5*$delta_h_u_pol" | bc`
#l_pos_max=`echo "scale=9; 2.5*$delta_h_l_pol" | bc`
## negative outskirt
#u_neg_max=`echo "scale=9; 2.5*$neg_delta_h_u_pol" | bc`
#l_neg_max=`echo "scale=9; 2.5*$neg_delta_h_l_pol" | bc`

######### Creating delta_h values for upper layer #########
#delta_h_u_list=($(seq $u_pos_max -0.15 $delta_h_u_pol))
#delta_h_u_list+=($(seq $delta_h_u_pol -0.05 0))
delta_u=`echo "scale=9; $delta_h_u_pol/10" | bc`
delta_u_lst=`echo "scale=9; $delta_u * $neg" | bc`
delta_h_u_list=($(seq $delta_h_u_pol $delta_u_lst 0))
## getting the negative displacements
u_neg_delta_list=()
for (( idx=${#delta_h_u_list[@]}-1 ; idx>=0 ; idx-- )); do
    u_neg_delta_list+=(`echo "scale=9; ${delta_h_u_list[$idx]} * $neg" | bc`)
done
## appending the negative displacements
delta_h_u_list+=(0)
delta_h_u_list+=(${u_neg_delta_list[@]})

######### Creating delta_h values for lower layer ######### 
#delta_h_l_list=($(seq $l_pos_max -0.15 $delta_h_l_pol))
#delta_h_l_list+=($(seq $delta_h_l_pol -0.05 0))
delta_l=`echo "scale=9; $delta_h_l_pol/10" | bc`
delta_l_lst=`echo "scale=9; $delta_l * $neg" | bc`
delta_h_l_list=($(seq $delta_h_l_pol $delta_l_lst 0))
## getting the negative displacements
l_neg_delta_list=()
for (( idx=${#delta_h_l_list[@]}-1 ; idx>=0 ; idx-- )); do
    l_neg_delta_list+=(`echo "scale=9; ${delta_h_l_list[$idx]} * $neg" | bc`)
done
## appending the negative dispalcements
delta_h_l_list+=(0)
delta_h_l_list+=(${l_neg_delta_list[@]})

######### Normalized Displacement upper part #########
normalized_disp=()
for (( idx=0 ; idx<=${#delta_h_u_list[@]}-1 ; idx++ )); do
    normalized_disp+=(`echo "scale=9; ${delta_h_u_list[$idx]} / $delta_h_u_pol" | bc`)
done

######### Normalized Displacement lower part #########
normalized_disp_2=()
for (( idx=0 ; idx<=${#delta_h_l_list[@]}-1 ; idx++ )); do
    normalized_disp_2+=(`echo "scale=9; ${delta_h_l_list[$idx]} / $delta_h_l_pol" | bc`)
done

######### Sweeping across all values of delta_h for W curve calcualtions #########  
#echo "Normalized Displacement    Energy(meV/atom)       Polarization (10^(-10) C/m)" >> pol_data_Bi_mono
echo "Delta_h_u = $delta_h_u_pol  Delta_h_l = $delta_h_l_pol" >> normalized_disp_data 
echo "Normalized displacment for both layers of monolayer are provided below" >> normalized_disp_data
echo "Upper (layer-1)     Lower (layer-1)" >> normalized_disp_data
polarization=()
tot_en=()
for (( idx=0 ; idx<=${#normalized_disp[@]}-1 ; idx++ )); do
	scf_name="Bi_BP_mono"
	nscf_name="Bi_BP_mono"
	#mkdir folder-${normalized_disp[$idx]}
	mkdir folder-$idx
	cp main_job.sh folder-$idx
	cd folder-$idx
	coor_u_pol=`echo "scale=9; $u_ref + ${delta_h_u_list[$idx]}" | bc`
	coor_l_pol=`echo "scale=9; $l_ref + ${delta_h_l_list[$idx]}" | bc`
	# Create the input file XXXX.scf.in.
	cat > $scf_name.scf.in << EOF
&control
    calculation = 'scf'
    restart_mode = 'from_scratch'
    prefix = 'bi_bp'
    pseudo_dir = '/home/akshay/pseudo/pbe.0.3.1/PSEUDOPOTENTIALS'
    outdir = './tmp/' 
/
&system
    ibrav = 0
    nat = 4
    ntyp = 1
    ecutwfc = 74.0
    ecutrho = 592.0
    vdw_corr = 'dft-d'
/
&electrons
    diagonalization = 'david'
    mixing_mode = 'plain'
    mixing_beta = 0.7
    conv_thr = 7.35d-10
/
ATOMIC_SPECIES
    Bi  208.9804   Bi.pbe-dn-rrkjus_psl.0.2.2.UPF
CELL_PARAMETERS {angstrom}
   4.898252066   0.000000000   0.000000000
   0.000000000   4.443566326   0.000000000
   0.000000000   0.000000000  33.211090088
ATOMIC_POSITIONS {angstrom}
Bi       0.625057731   3.332674564  14.791753001
Bi       3.074182872   1.110891844  $coor_u_pol
Bi       0.218643999   3.332674564  17.790480876
Bi       2.667804736   1.110891844  $coor_l_pol
K_POINTS {automatic}
    16 16 1 0 0 0

EOF

        
	# Create the input file XXXX.scf.in.
	cat > $nscf_name.pol.in << EOF
&control
    calculation = 'nscf'
    restart_mode = 'from_scratch'
    prefix = 'bi_bp'
    pseudo_dir = '/home/akshay/pseudo/pbe.0.3.1/PSEUDOPOTENTIALS'
    outdir = './tmp/'
    lberry = .true.
    gdir = 1
    nppstr = 32 
/
&system
    ibrav = 0
    nat = 4
    ntyp = 1
    ecutwfc = 74.0
    ecutrho = 592.0
    vdw_corr = 'dft-d'
/
&electrons
    diagonalization = 'david'
    mixing_mode = 'plain'
    mixing_beta = 0.7
    conv_thr = 7.35d-10
/
ATOMIC_SPECIES
    Bi  208.9804   Bi.pbe-dn-rrkjus_psl.0.2.2.UPF
CELL_PARAMETERS {angstrom}
   4.898252066   0.000000000   0.000000000
   0.000000000   4.443566326   0.000000000
   0.000000000   0.000000000  33.211090088
ATOMIC_POSITIONS {angstrom}
Bi       0.625057731   3.332674564  14.791753001
Bi       3.074182872   1.110891844  $coor_u_pol
Bi       0.218643999   3.332674564  17.790480876
Bi       2.667804736   1.110891844  $coor_l_pol
K_POINTS {automatic}
    32 16 1 0 0 0
EOF
	# Running the files 
	sed -i -e "2s/Bi_BP/Bi_pol_$idx/g" main_job.sh
	qsub main_job.sh
	stop=0
	while [ $stop -eq 0 ]
	do 
		 grep -q 'JOB DONE.' $nscf_name.pol.out  && stop=1
   	done
	
	#rm -r ./tmp
   	cd ../ # Go back to the directory from where this script is executed.
	
	ene=`grep "!    total energy" folder-$idx/${scf_name}.scf.out | awk '{printf "%15.9f\n",$5}'`
	tot_en+=(`grep "!    total energy" folder-$idx/${scf_name}.scf.out | awk '{printf "%15.9f\n",$5}'`)
	pol=`grep "C/m^2" folder-$idx/${nscf_name}.pol.out | awk '{printf "%5.7f\n",$3}'`
	polarization+=(`echo "scale=15; $pol * $z_vacc" | bc`)
        echo "${normalized_disp[$idx]} $ene $pol" >> pol_data_Bi_mono	
        # The >> symbols indicates that the data in each run must be appended to the same file and not overwrite the file.
   	echo "${normalized_disp[$idx]} ${tot_en[$idx]} ${polarization[$idx]}" >> run_check
	echo "${normalized_disp[$idx]} ${normalized_disp_2[$idx]}" >> normalized_disp_data
done 

######### Post-processing polarization values and storing the values #########
#para_idx=`echo "scale=0; ( (${#normalized_disp[@]}-1) / 2 )" | bc`
#for (( idx=0 ; idx<=${#normalized_disp[@]}-1 ; idx++ )); do
#	energy_final=`echo "scale=9; ( (${tot_en[$idx]} * $Q * 1000) / 4 )" | bc`
#	polarization_final=`echo "scale=9; ${polarization[$idx]} - ${polarization[$para_idx]}" | bc`
#	echo "${normalized_disp[$idx]} $energy_final $polarization_final" >> pol_data_Bi_mono
#done

#!/bin/bash

# Script to get the energy versus polarization and energy versus displacement plots
# Exclusive for Bi project (uses verticle dispalcement for polarization)
z_vacc=33.211090088
#k=16
#pol_polar=`grep "C/m^2" folder-16/Bi_BP_polar.pol.out | awk '{printf "%5.7f\n",$3}'`
#pol_non_polar=`grep "C/m^2" folder-16/Bi_BP_non_polar.pol.out | awk '{printf "%5.7f\n",$3}'`
#polar_diff=`echo "scale=15; $pol_polar - $pol_non_polar" | bc`
#polarization=`echo "scale=15; $polar_diff * $z_vacc" | bc`
#echo "$k $polarization" >> pol_k_conv_Bi_mono
echo "Checking polarization convergence with k (npppstr=2*k)" >> pol_conv_Bi_mono
for k in $(seq 33 1 50)
do
	nscf_pol_name="Bi_BP_mono.pol"
	scf_pol_name="Bi_BP_mono.scf"
	mkdir folder-$k
	cp main_job.sh folder-$k	
	cd folder-$k
        nppstr=`echo "scale=15; $k * 2" | bc`
	# Create the input file XXXX.scf.in. 
	cat > $scf_pol_name.in << EOF
&control
    calculation = 'scf'
    restart_mode = 'from_scratch'
    prefix = 'bi_bp'
    pseudo_dir = '/home/akshay/pseudo/pbe.0.3.1/PSEUDOPOTENTIALS'
    outdir = './tmp/' 
/
&system
    ibrav = 0
    nat = 4
    ntyp = 1
    ecutwfc = 74.0
    ecutrho = 592.0
    vdw_corr = 'dft-d'
/
&electrons
    diagonalization = 'david'
    mixing_mode = 'plain'
    mixing_beta = 0.7
    conv_thr = 7.35d-10
/
ATOMIC_SPECIES
    Bi  208.9804   Bi.pbe-dn-rrkjus_psl.0.2.2.UPF
CELL_PARAMETERS {angstrom}
   4.898252066   0.000000000   0.000000000
   0.000000000   4.443566326   0.000000000
   0.000000000   0.000000000  33.211090088
ATOMIC_POSITIONS {angstrom}
Bi       0.625057731   3.332674564  14.791753001
Bi       3.074182872   1.110891844  18.419321249
Bi       0.218643999   3.332674564  17.790480876
Bi       2.667804736   1.110891844  15.420625873
K_POINTS {automatic}
    $k $k 1 0 0 0
EOF
        # Create the input file XXXX.nscf.in.
        cat > $nscf_pol_name.in << EOF
&control
    calculation = 'nscf'
    restart_mode = 'from_scratch'
    prefix = 'bi_bp'
    pseudo_dir = '/home/akshay/pseudo/pbe.0.3.1/PSEUDOPOTENTIALS'
    outdir = './tmp/'
    lberry = .true.
    gdir = 1
    nppstr = $nppstr
/
&system
    ibrav = 0
    nat = 4
    ntyp = 1
    ecutwfc = 74.0
    ecutrho = 592.0
    vdw_corr = 'dft-d'
/
&electrons
    diagonalization = 'david'
    mixing_mode = 'plain'
    mixing_beta = 0.7
    conv_thr = 7.35d-10
/
ATOMIC_SPECIES
    Bi  208.9804   Bi.pbe-dn-rrkjus_psl.0.2.2.UPF
CELL_PARAMETERS {angstrom}
   4.898252066   0.000000000   0.000000000
   0.000000000   4.443566326   0.000000000
   0.000000000   0.000000000  33.211090088
ATOMIC_POSITIONS {angstrom}
Bi       0.625057731   3.332674564  14.791753001
Bi       3.074182872   1.110891844  18.419321249
Bi       0.218643999   3.332674564  17.790480876
Bi       2.667804736   1.110891844  15.420625873
K_POINTS {automatic}
    $nppstr $k 1 0 0 0
EOF
	# Running the files 
	sed -i -e "2s/Bi_BP/pol_$k/g" main_job.sh
        # Starting both runs
	qsub main_job.sh
	# waiting for polar run to finish
	stop=0
	while [ $stop -eq 0 ]
	do 
		 grep -q 'JOB DONE.' $nscf_pol_name.out  && stop=1
   	done

   	cd ../ # Go back to the directory from where this script is executed.
	# Getting polarization values 
	pol_val=`grep "C/m^2" folder-${k}/${nscf_pol_name}.out | awk '{printf "%5.7f\n",$3}'`
        polarization=`echo "scale=15; $pol_val * $z_vacc" | bc`
        echo "$k $polarization" >> pol_conv_Bi_mono	
done 
_______________________________________________
The Quantum ESPRESSO community stands by the Ukrainian
people and expresses its concerns about the devastating
effects that the Russian military offensive has on their
country and on the free and peaceful scientific, cultural,
and economic cooperation amongst peoples
_______________________________________________
Quantum ESPRESSO is supported by MaX (www.max-centre.eu)
users mailing list users@lists.quantum-espresso.org
https://lists.quantum-espresso.org/mailman/listinfo/users

Reply via email to