QuantumATK > General Questions and Answers
Phonon dispersion is senstitive to "processes_per_displacement" paramter of DM?
krabidix:
Hi,
I calculated the graphene phonon dispersion spectrum using the following script:
--- Code: ---# -------------------------------------------------------------
# Bulk Configuration
# -------------------------------------------------------------
# Set up lattice
lattice = Hexagonal(2.4612*Angstrom, 30.0*Angstrom)
# Define elements
elements = [Carbon, Carbon]
# Define coordinates
fractional_coordinates = [[ 0.333333333333, 0.6666666666 , 0.5 ],
[ 0.666666666666, 0.3333333333 , 0.5 ]]
# Set up configuration
bulk_configuration = BulkConfiguration(
bravais_lattice=lattice,
elements=elements,
fractional_coordinates=fractional_coordinates
)
# -------------------------------------------------------------
# Calculator
# -------------------------------------------------------------
#----------------------------------------
# Basis Set
#----------------------------------------
basis_set = [
GGABasis.Carbon_DoubleZetaPolarized,
]
#----------------------------------------
# Exchange-Correlation
#----------------------------------------
exchange_correlation = SGGA.PBE
k_point_sampling = MonkhorstPackGrid(
na=51,
nb=51,
)
numerical_accuracy_parameters = NumericalAccuracyParameters(
density_mesh_cutoff=110.0*Hartree,
k_point_sampling=k_point_sampling,
occupation_method=FermiDirac(0.05*eV),
)
poisson_solver = FastFourier2DSolver(
boundary_conditions=[[PeriodicBoundaryCondition(),PeriodicBoundaryCondition()],
[PeriodicBoundaryCondition(),PeriodicBoundaryCondition()],
[DirichletBoundaryCondition(),DirichletBoundaryCondition()]]
)
iteration_control_parameters = IterationControlParameters(
tolerance=1e-08,
max_steps=10000,
)
calculator = LCAOCalculator(
exchange_correlation=exchange_correlation,
numerical_accuracy_parameters=numerical_accuracy_parameters,
poisson_solver=poisson_solver,
iteration_control_parameters=iteration_control_parameters,
)
bulk_configuration.setCalculator(calculator)
nlprint(bulk_configuration)
bulk_configuration.update()
nlsave('gr_mp_fhi_dzp.hdf5', bulk_configuration)
## -------------------------------------------------------------
## Optimize Geometry
## -------------------------------------------------------------
bulk_configuration = OptimizeGeometry(
bulk_configuration,
max_forces=0.0001*eV/Ang,
max_stress=1.0e-04*eV/Angstrom**3,
max_steps=20000,
max_step_length=0.4*Ang,
optimize_cell=True,
trajectory_filename=None,
optimizer_method=LBFGS(),
enable_optimization_stop_file=False,
)
bulk_configuration.update()
nlsave('gr_mp_fhi_dzp.hdf5', bulk_configuration)
nlprint(bulk_configuration)
bulk_configuration = nlread('gr_mp_fhi_dzp.hdf5', BulkConfiguration)[1]
# -------------------------------------------------------------
# Dynamical Matrix
# -------------------------------------------------------------
dynamical_matrix = DynamicalMatrix(
bulk_configuration,
filename= 'gr_mp_fhi.hdf5',
object_id='dynamical_matrix',
repetitions=(11, 11, 1),
atomic_displacement=0.01*Angstrom,
acoustic_sum_rule=True,
finite_difference_method=Central,
#max_interaction_range=3.5*Angstrom,
force_tolerance=1e-08*Hartree/Bohr**2,
processes_per_displacement=28,
log_filename_prefix='forces_fhi_mp_',
use_wigner_seitz_scheme=True,
)
dynamical_matrix.update()
# -------------------------------------------------------------
# Phonon Bandstructure
# -------------------------------------------------------------
phonon_bandstructure = PhononBandstructure(
configuration=bulk_configuration,
dynamical_matrix=dynamical_matrix,
route=['G', 'K', 'M', 'G'],
points_per_segment=100,
number_of_bands=All
)
nlsave('gr_mp_fhi_dzp.hdf5', phonon_bandstructure)
filename = 'gr_mp_fhi_ph_band.dat'#.format(band_index)
with open(filename, 'w') as f:
phonon_bandstructure.nlprint(f)
--- End code ---
In processes_per_displacement, the parameter of the dynamical matrix is set to just '4' using a single node, and then the results obtained match the literature.
But when I use larger supercell repetitions=(11, 11, 1), I need to set processes_per_displacement for more processes, so I set it to '28'. Then, the phonon energies are ~ 12000 meV (with negative energies, too), quite off from the simple graphene phonon dispersion. This processes_per_displacement is a sensitive parameter.
Why is it so? What am I missing here?
Anders Blom:
It shouldn't matter, but there is a lot going on here. What is the repetition in the calculation that gives good results? Do you use the Wigner-Seitz scheme in both cases? Are there convergence issues indicated in any log file? Code version (we fixed some symmetry-related problems that gave negative energies recently)?
There is no real need to optimize the geometry since the structure is symmetric (fractional coordinates constrained to 1/3 and 2/3). Yes, you can optimize the lattice constant, but that would be a simple equation of state (vary the parameter a for 5-10 runs and fit a parabola), much more efficient.
Do you need spin-polarization? Not sure it makes a difference, just takes longer... I try without first, at least, while testing other parameters.
krabidix:
Thank you for your input!
I understand that I may have overgeneralized regarding geometry optimization and script parameters.
My primary focus is on the unexpected behaviour of phonon energies when changing the "processes_per_displacement" parameter within my script.
Using a large value for "processes_per_displacement" (e.g., 26) results in unusually high phonon energies (~12000 meV), while a smaller value (e.g., 4) produces the expected range for graphene (~200 meV).
This discrepancy is puzzling and leads me to question the impact of this parameter.
I am using QuantumATK Version U-2022.12.
I used the Wigner-Seitz scheme in both cases. I changed only "processes_per_displacement".
Anders Blom:
I think we need to look at the exact scripts and output. If you don't want to share them publicly, you can email then.
krabidix:
Here are the output (in zip files) and script for the case in which I used a large value (28) for processes_per_displacement.
The attached image is for the case when I used the value of processes_per_displacement =4.
The only question is why the energies are that much off!
Navigation
[0] Message Index
[#] Next page
Go to full version