mirror of https://github.com/QMCPACK/qmcpack.git
3556 lines
106 KiB
Python
3556 lines
106 KiB
Python
|
|
import numpy as np
|
|
|
|
from generic import obj
|
|
from developer import DevBase,error
|
|
from unit_converter import convert
|
|
from pseudopotential import pp_elem_label
|
|
from structure import generate_structure
|
|
from simulation import SimulationInput
|
|
|
|
|
|
class RmgInputSettings(DevBase):
|
|
enforce_min_value = True
|
|
enforce_max_value = True
|
|
enforce_allowed = True
|
|
check_on_write = True
|
|
#end class RmgInputSettings
|
|
|
|
|
|
# raw input spec below
|
|
# taken directly from
|
|
# https://github.com/RMGDFT/rmgdft/wiki/Input-File-Options
|
|
# changes made from website values
|
|
# write_data_period
|
|
# Max value: 50 -> 500
|
|
# pseudopotential
|
|
# Key type : string -> formatted
|
|
# Hubbard_U
|
|
# Key type : string -> formatted
|
|
|
|
raw_input_spec = '''
|
|
Control options
|
|
|
|
Key name: a_length
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: unlimited
|
|
Default: 0.000000e+00
|
|
Description: First lattice constant.
|
|
|
|
Key name: b_length
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: unlimited
|
|
Default: 0.000000e+00
|
|
Description: Second lattice constant.
|
|
|
|
Key name: c_length
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: unlimited
|
|
Default: 0.000000e+00
|
|
Description: Third lattice constant.
|
|
|
|
Key name: calculation_mode
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Quench Electrons"
|
|
Allowed: "Exx Only" "NEB Relax" "Band Structure Only" "Psi Plot" "Plot"
|
|
"Constant Pressure And Energy" "TDDFT" "Dimer Relax" "Constant
|
|
Temperature And Energy" "Constant Volume And Energy" "Relax
|
|
Structure" "Quench Electrons"
|
|
Description: Type of calculation to perform.
|
|
|
|
Key name: cell_relax
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: flag to control unit cell relaxation
|
|
|
|
Key name: coalesce_factor
|
|
Required: no
|
|
Key type: integer
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 1
|
|
Max value: 16
|
|
Default: 4
|
|
Description: Grid coalescing factor.
|
|
|
|
Key name: coalesce_states
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: Yes
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: Flag indicating whether or not to coalesce states.
|
|
|
|
Key name: compressed_infile
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "true"
|
|
Description: Flag indicating whether or not parallel restart wavefunction file
|
|
uses compressed format.
|
|
|
|
Key name: compressed_outfile
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "true"
|
|
Description: Flag indicating whether or not parallel output wavefunction file
|
|
uses compressed format.
|
|
|
|
Key name: description
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: ""
|
|
Allowed:
|
|
Description: Description of the run.
|
|
|
|
Key name: energy_convergence_criterion
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 1.000000e-20
|
|
Max value: 1.000000e-07
|
|
Default: 1.000000e-10
|
|
Description: The RMS value of the estimated change in the total energy per step
|
|
where we assume self consistency has been achieved.
|
|
|
|
Key name: energy_output_units
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Hartrees"
|
|
Allowed: "Rydbergs" "Hartrees"
|
|
Description: Units to be used when writing energy values to the output file.
|
|
Hartrees or Rydbergs are available.
|
|
|
|
Key name: exx_integrals_filepath
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "afqmc_rmg"
|
|
Allowed:
|
|
Description: File/path for exact exchange integrals.
|
|
|
|
Key name: exx_mode
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Distributed fft"
|
|
Allowed: "Local fft" "Distributed fft"
|
|
Description: FFT mode for exact exchange computations.
|
|
|
|
Key name: exxdiv_treatment
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "gygi-baldereschi"
|
|
Allowed: "none" "gygi-baldereschi"
|
|
Description: Exact exchange method for handling exx divergence at G=0.
|
|
|
|
Key name: input_tddft_file
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Waves/wave_tddft.out"
|
|
Allowed:
|
|
Description: Input file/path to read wavefunctions and other binary data from
|
|
on a restart.
|
|
|
|
Key name: input_wave_function_file
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Waves/wave.out"
|
|
Allowed:
|
|
Description: Input file/path to read wavefunctions and other binary data from
|
|
on a restart.
|
|
|
|
Key name: interpolation_type
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "FFT"
|
|
Allowed: "FFT" "prolong" "Cubic Polynomial"
|
|
Description: Interpolation method for transferring data between the potential
|
|
grid and the wavefunction grid. Mostly for diagnostic purposes.
|
|
|
|
Key name: max_exx_steps
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 1
|
|
Max value: 2147483647
|
|
Default: 100
|
|
Description: Maximum number of self consistent steps to perform with hybrid
|
|
functionals.
|
|
|
|
Key name: max_scf_steps
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0
|
|
Max value: 2147483647
|
|
Default: 500
|
|
Description: Maximum number of self consistent steps to perform. Inner loop for
|
|
hybrid functionals.
|
|
|
|
Key name: noncollinear
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: if set true, calculate noncollinear
|
|
|
|
Key name: nvme_orbitals
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: Flag indicating whether or not orbitals should be mapped to disk.
|
|
|
|
Key name: nvme_orbitals_filepath
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Orbitals/"
|
|
Allowed:
|
|
Description: File/path for runtime disk storage of orbitals.
|
|
|
|
Key name: nvme_weights
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: Flag indicating whether or not projector weights should be mapped
|
|
to disk.
|
|
|
|
Key name: nvme_weights_filepath
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Weights/"
|
|
Allowed:
|
|
Description: File/path for disk storage of projector weights.
|
|
|
|
Key name: nvme_work
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: Flag indicating whether or not work arrays should be mapped to
|
|
disk.
|
|
|
|
Key name: nvme_work_filepath
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Work/"
|
|
Allowed:
|
|
Description: File/path for disk storage of workspace.
|
|
|
|
Key name: omp_threads_per_node
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0
|
|
Max value: 64
|
|
Default: 0
|
|
Description: Number of Open MP threads each MPI process will use. A value of 0
|
|
selects automatic setting.
|
|
|
|
Key name: output_tddft_file
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Waves/wave_tddft.out"
|
|
Allowed:
|
|
Description: Output file/path to store wavefunctions and other binary data.
|
|
|
|
Key name: output_wave_function_file
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Waves/wave.out"
|
|
Allowed:
|
|
Description: Output file/path to store wavefunctions and other binary data.
|
|
|
|
Key name: pseudo_dir
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "."
|
|
Allowed:
|
|
Description: Directory where pseudopotentials are stored.
|
|
|
|
Key name: qfunction_filepath
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Qfunctions/"
|
|
Allowed:
|
|
Description: File/path for runtime disk storage of qfunctions.
|
|
|
|
Key name: read_serial_restart
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: Directs RMG to read from serial restart files. Normally used when
|
|
changing the sprocessor topology used during a restart run
|
|
|
|
Key name: rms_convergence_criterion
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: 1.000000e-03
|
|
Default: 1.000000e-07
|
|
Description: The RMS value of the change in the total potential from step to
|
|
step where we assume self consistency has been achieved.
|
|
|
|
Key name: spinorbit
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: if set true, calculate with spinorbit coupling
|
|
|
|
Key name: start_mode
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "LCAO Start"
|
|
Allowed: "Modified LCAO Start" "Restart TDDFT" "Start TDDFT" "Gaussian
|
|
Start" "FIREBALL Start" "LCAO Start" "Restart From File" "Random
|
|
Start"
|
|
Description: Type of run.
|
|
|
|
Key name: stress
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: flag to control stress cacluation
|
|
|
|
Key name: stress_convergence_criterion
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: 50.000000
|
|
Default: 0.500000
|
|
Description: The stress criteria
|
|
|
|
Key name: tddft_steps
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0
|
|
Max value: 2147483647
|
|
Default: 2000
|
|
Description: Maximum number of tddft steps to perform.
|
|
|
|
Key name: time_reversal
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "true"
|
|
Description: if false, no k -> -k symmetry
|
|
|
|
Key name: vdw_corr
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "None"
|
|
Allowed: "DFT-D3" "DFT-D2" "Grimme-D2" "None"
|
|
Description: Type of vdw correction
|
|
|
|
Key name: vdwdf_kernel_filepath
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "vdW_kernel_table"
|
|
Allowed:
|
|
Description: File/path for vdW_kernel_table data.
|
|
|
|
Key name: wannier90
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: set up informations for wannier90 interface
|
|
|
|
Key name: wannier90_scdm_mu
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: -unlimited
|
|
Max value: unlimited
|
|
Default: 0.000000e+00
|
|
Description: when wannier90 is used to build wannier functions, the energy
|
|
window parameter
|
|
|
|
Key name: write_data_period
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 5
|
|
Max value: 500
|
|
Default: 5
|
|
Description: How often to write checkpoint files during the initial quench in
|
|
units of SCF steps. During structural relaxations of molecular
|
|
dynamics checkpoints are written each ionic step.
|
|
|
|
Key name: write_eigvals_period
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 1
|
|
Max value: 100
|
|
Default: 5
|
|
Description: How often to output eigenvalues in units of scf steps.
|
|
|
|
Key name: write_pseudopotential_plots
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: Flag to indicate whether or not to write pseudopotential plots.
|
|
|
|
Key name: write_qmcpack_restart
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: If true then a QMCPACK restart file is written as well as a serial
|
|
restart file.
|
|
|
|
Key name: write_qmcpack_restart_localized
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: If true then a QMCPACK restart file for localized orbitals
|
|
|
|
Key name: write_serial_restart
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: RMG normally writes parallel restart files. These require that
|
|
restarts have the same processor topology. If write_serial_restart
|
|
= "true" then RMG will also write a serial restart file that can
|
|
be used with a different processor topology
|
|
|
|
Cell parameter options
|
|
|
|
Key name: atomic_coordinate_type
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Absolute"
|
|
Allowed: "Absolute" "Cell Relative"
|
|
Description: Flag indicated whether or not atomic coordinates are absolute or
|
|
cell relative.
|
|
|
|
Key name: bravais_lattice_type
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Orthorhombic Primitive"
|
|
Allowed: "Tetragonal Primitive" "Cubic Body Centered" "Orthorhombic
|
|
Primitive" "Cubic Face Centered" "Hexagonal Primitive" "Cubic
|
|
Primitive" "None"
|
|
Description: Bravais Lattice Type.
|
|
|
|
Key name: cell_movable
|
|
Required: no
|
|
Key type: integer array
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "0 0 0 0 0 0 0 0 0 "
|
|
Description: 9 numbers to control cell relaxation
|
|
|
|
Key name: crds_units
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Bohr"
|
|
Allowed: "Angstrom" "Bohr"
|
|
Description: Units for the atomic coordinates.
|
|
|
|
Key name: grid_spacing
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: unlimited
|
|
Default: 0.350000
|
|
Description: Approximate grid spacing (bohr).
|
|
|
|
Key name: kpoint_is_shift
|
|
Required: no
|
|
Key type: integer array
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "0 0 0 "
|
|
Description: Three-D layout of the kpoint shift.
|
|
|
|
Key name: kpoint_mesh
|
|
Required: no
|
|
Key type: integer array
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "1 1 1 "
|
|
Description: Three-D layout of the kpoint mesh.
|
|
|
|
Key name: lattice_units
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Bohr"
|
|
Allowed: "Angstrom" "Alat" "Bohr"
|
|
Description: Units for the lattice vectors
|
|
|
|
Key name: lattice_vector
|
|
Required: no
|
|
Key type: double array
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Not done yet"
|
|
Description: Lattice vectors, a0, a1, a2
|
|
|
|
Key name: potential_grid_refinement
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0
|
|
Max value: 4
|
|
Default: 0
|
|
Description: Ratio of the potential grid density to the wavefunction grid
|
|
density. For example if the wavefunction grid is (72,72,72) and
|
|
potential_grid_refinement = "2" then the potential grid would be
|
|
(144,144,144). The default value is 2 but it may sometimes be
|
|
beneficial to adjust this. (For USPP the minimum value is also 2
|
|
and it cannot be set lower. NCPP can be set to 1).
|
|
|
|
Key name: processor_grid
|
|
Required: no
|
|
Key type: integer array
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "1 1 1 "
|
|
Description: Three-D (x,y,z) layout of the MPI processes.
|
|
|
|
Key name: wavefunction_grid
|
|
Required: no
|
|
Key type: integer array
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "1 1 1 "
|
|
Description: Three-D (x,y,z) dimensions of the grid the wavefunctions are
|
|
defined on.
|
|
|
|
Pseudopotential related options
|
|
|
|
Key name: atomic_orbital_type
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "delocalized"
|
|
Allowed: "delocalized" "localized"
|
|
Description: Atomic Orbital Type. Choices are localized and delocalized.
|
|
|
|
Key name: energy_cutoff_parameter
|
|
Required: no
|
|
Key type: double
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 0.600000
|
|
Max value: 1.000000
|
|
Default: 0.800000
|
|
Description:
|
|
|
|
Key name: filter_dpot
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: Yes
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: Flag indicating whether or not to filter density dependent
|
|
potentials.
|
|
|
|
Key name: filter_factor
|
|
Required: no
|
|
Key type: double
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 0.060000
|
|
Max value: 1.000000
|
|
Default: 0.250000
|
|
Description: Filtering factor.
|
|
|
|
Key name: localize_localpp
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "true"
|
|
Description: The local potential associated with a particular ion also decays
|
|
rapidly in real-space with increasing r. As with beta projectors
|
|
truncating the real-space representation for large cells can lead
|
|
to significant computational savings with a small loss of accuracy
|
|
but it should be set to false for small cells.
|
|
|
|
Key name: localize_projectors
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "true"
|
|
Description: The Beta function projectors for a particular ion decay rapidly in
|
|
real-space with increasing r. For large cells truncating the
|
|
real-space representation of the projector can lead to significant
|
|
computational savings with a small loss of accuracy. For smaller
|
|
cells the computational cost is the same for localized or
|
|
delocalized projectors so it is better to set localize_projectors
|
|
to false.
|
|
|
|
Key name: max_nlradius
|
|
Required: no
|
|
Key type: double
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 2.000000
|
|
Max value: 10000.000000
|
|
Default: 10000.000000
|
|
Description: maximum radius for non-local projectors
|
|
|
|
Key name: max_qradius
|
|
Required: no
|
|
Key type: double
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 2.000000
|
|
Max value: 10000.000000
|
|
Default: 10000.000000
|
|
Description: maximum radius for qfunc in ultra-pseudopotential
|
|
|
|
Key name: min_nlradius
|
|
Required: no
|
|
Key type: double
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 1.000000
|
|
Max value: 10000.000000
|
|
Default: 2.000000
|
|
Description: minimum radius for non-local projectors
|
|
|
|
Key name: min_qradius
|
|
Required: no
|
|
Key type: double
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 1.000000
|
|
Max value: 10000.000000
|
|
Default: 2.000000
|
|
Description: minimum radius for qfunc in ultra-pseudopotential
|
|
|
|
Key name: projector_expansion_factor
|
|
Required: no
|
|
Key type: double
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 0.500000
|
|
Max value: 3.000000
|
|
Default: 1.000000
|
|
Description: When using localized projectors the radius can be adjusted with
|
|
this parameter.
|
|
|
|
Key name: pseudopotential
|
|
Required: no
|
|
Key type: formatted
|
|
Expert: No
|
|
Experimental: No
|
|
Default: ""
|
|
Allowed:
|
|
Description: External pseudopotentials may be specfied with this input key. The
|
|
format uses the atomic symbol followed by the pseudopotential file
|
|
name. pseudopotential = "Ni Ni.UPF O O.UPF"
|
|
|
|
Kohn Sham solver options
|
|
|
|
Key name: davidson_max_steps
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 5
|
|
Max value: 20
|
|
Default: 8
|
|
Description: Maximum number of iterations for davidson diagonalization.
|
|
|
|
Key name: davidson_multiplier
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0
|
|
Max value: 6
|
|
Default: 0
|
|
Description: The davidson solver expands the eigenspace with the maximum
|
|
expansion factor being set by the value of davidson_multiplier.
|
|
Larger values often lead to faster convergence but because the
|
|
computational cost of the davidson diagonalization step scales as
|
|
the cube of the number of eigenvectors the optimal value based on
|
|
the fastest time to solution depends on the number of orbitals. If
|
|
not specified explicitly or set to 0 RMG uses the following
|
|
algorithm to set the value.
|
|
|
|
Number of orbitals <= 600 davidson_multiplier= "4"
|
|
600 < Number of orbitals <= 900 davidson_multiplier = "3"
|
|
Number of orbitals > 900 davidson_multiplier = "2"
|
|
|
|
For very large problems the N^3 scaling makes even a factor of 2
|
|
prohibitively costly and the multigrid solver is a better choice.
|
|
|
|
Key name: kohn_sham_coarse_time_step
|
|
Required: no
|
|
Key type: double
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: 1.200000
|
|
Default: 1.000000
|
|
Description: Time step to use in the kohn-sham multigrid solver on the coarse
|
|
levels.
|
|
|
|
Key name: kohn_sham_fd_order
|
|
Required: no
|
|
Key type: integer
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 6
|
|
Max value: 10
|
|
Default: 8
|
|
Description: RMG uses finite differencing to represent the kinetic energy
|
|
operator and the accuracy of the representation is controllable by
|
|
the kohn_sham_fd_order parameter. The default is 8 and is fine for
|
|
most purposes but higher accuracy is obtainable with 10th order at
|
|
the cost of some additional computational expense.
|
|
|
|
Key name: kohn_sham_mg_levels
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: -1
|
|
Max value: 6
|
|
Default: -1
|
|
Description: Number of multigrid levels to use in the kohn-sham multigrid
|
|
preconditioner.
|
|
|
|
Key name: kohn_sham_mg_timestep
|
|
Required: no
|
|
Key type: double
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: 2.000000
|
|
Default: 0.666667
|
|
Description: timestep for multigrid correction.
|
|
|
|
Key name: kohn_sham_mucycles
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 1
|
|
Max value: 6
|
|
Default: 2
|
|
Description: Number of mu (also known as W) cycles to use in the kohn-sham
|
|
multigrid preconditioner.
|
|
|
|
Key name: kohn_sham_post_smoothing
|
|
Required: no
|
|
Key type: integer
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 1
|
|
Max value: 5
|
|
Default: 2
|
|
Description: Number of global grid post-smoothing steps to perform after a
|
|
multigrid preconditioner iteration.
|
|
|
|
Key name: kohn_sham_pre_smoothing
|
|
Required: no
|
|
Key type: integer
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 1
|
|
Max value: 5
|
|
Default: 2
|
|
Description: Number of global grid pre-smoothing steps to perform before a
|
|
multigrid preconditioner iteration.
|
|
|
|
Key name: kohn_sham_solver
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "davidson"
|
|
Allowed: "davidson" "multigrid"
|
|
Description: RMG supports a pure multigrid Kohn-Sham solver as well as a
|
|
multigrid preconditioned davidson solver. The davidson solver is
|
|
usually better for smaller problems with the pure multigrid solver
|
|
often being a better choice for very large problems.
|
|
|
|
Key name: kohn_sham_time_step
|
|
Required: no
|
|
Key type: double
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: 2.000000
|
|
Default: 0.660000
|
|
Description: Smoothing timestep to use on the fine grid in the the kohn-sham
|
|
multigrid preconditioner.
|
|
|
|
Key name: unoccupied_tol_factor
|
|
Required: no
|
|
Key type: double
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 1.000000
|
|
Max value: 100000.000000
|
|
Default: 1000.000000
|
|
Description: When using the Davidson Kohn-Sham solver unoccupied states are
|
|
converged to a less stringent tolerance than occupied orbitals
|
|
with the ratio set by this parameter.
|
|
|
|
Exchange correlation options
|
|
|
|
Key name: exchange_correlation_type
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "AUTO_XC"
|
|
Allowed: "hartree-fock" "vdw-df-c09" "sla+pw+pbe+vdw1" "VDW-DF" "vdw-df"
|
|
"gaupbe" "B3LYP" "hse" "mgga tb09" "AUTO_XC" "m06l" "VDW-DF-CX"
|
|
"tpss" "ev93" "optbk88" "sogga" "wc" "HSE" "HCTH" "hcth" "Q2D"
|
|
"q2d" "PBESOL" "tb09" "b86bpbe" "PW86PBE" "PBE0" "MGGA TB09"
|
|
"pw86pbe" "REVPBE" "pbe" "revpbe" "GGA PBE" "BLYP" "pbe0" "pbesol"
|
|
"blyp" "PBE" "GGA XP CP" "pw91" "GGA XB CP" "TB09" "optb86b"
|
|
"olyp" "BP" "GGA BLYP" "bp" "b3lyp" "LDA" "vdw-df-cx" "PW91" "PZ"
|
|
"pz"
|
|
Description: Most pseudopotentials specify the exchange correlation type they
|
|
were generated with and the default value of AUTO_XC means that
|
|
the type specified in the pseudopotial is what RMG will use. That
|
|
can be overridden by specifying a value here.
|
|
|
|
Key name: exx_convergence_criterion
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 1.000000e-12
|
|
Max value: 1.000000e-06
|
|
Default: 1.000000e-09
|
|
Description: Convergence criterion for the EXX delta from step to step where we
|
|
assume EXX consistency has been achieved.
|
|
|
|
Key name: exx_fraction
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: -1.000000
|
|
Max value: 1.000000
|
|
Default: -1.000000
|
|
Description: when hybrid functional is used, the fraction of Exx
|
|
|
|
Key name: vexx_fft_threshold
|
|
Required: no
|
|
Key type: double
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 1.000000e-14
|
|
Max value: 0.100000
|
|
Default: 1.000000e-14
|
|
Description: The value for the EXX delta where we switch from single to double
|
|
precision ffts. Single precision ffts are generally accurate
|
|
enough.
|
|
|
|
Key name: x_gamma_extrapolation
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "true"
|
|
Description: if set true, use exx extrapolation to gamma
|
|
|
|
Orbital occupation options
|
|
|
|
Key name: MP_order
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0
|
|
Max value: 5
|
|
Default: 2
|
|
Description: order of Methefessel Paxton occupation.
|
|
|
|
Key name: dos_broading
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: 1.000000
|
|
Default: 0.100000
|
|
Description: For DOS with Gaussian broading method
|
|
|
|
Key name: dos_method
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "tetrahedra"
|
|
Allowed: "Gaussian" "tetrahedra"
|
|
Description: tetrahedra or gauss smearing method for DOS calculation
|
|
|
|
Key name: occupation_electron_temperature_eV
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: 2.000000
|
|
Default: 0.040000
|
|
Description: Target electron temperature when not using fixed occupations.
|
|
|
|
Key name: occupation_number_mixing
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: 1.000000
|
|
Default: 1.000000
|
|
Description: Mixing parameter for orbital occupations when not using fixed
|
|
occupations.
|
|
|
|
Key name: occupations_type
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Fermi Dirac"
|
|
Allowed: "Error Function" "Gaussian" "Fermi Dirac" "MethfesselPaxton" "Cold
|
|
Smearing" "Fixed"
|
|
Description: RMG supports several different ways of specifying orbital
|
|
occupations. For a spin polarized system one may specify the
|
|
occupations for up and down separately. In the case of a non-zero
|
|
electronic temperature these will be adjusted as the calculation
|
|
proceeds based on this setting.
|
|
|
|
Key name: states_count_and_occupation
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: ""
|
|
Allowed:
|
|
Description: Occupation string for states. Format for a system with 240
|
|
electrons and 20 unoccupied states would be. "120 2.0 20 0.0"
|
|
|
|
Key name: states_count_and_occupation_spin_down
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: ""
|
|
Allowed:
|
|
Description: Occupation string for spin down states. Format is the same as for
|
|
states_count_and_occupation. Total number of states must match
|
|
spin up occupation string.
|
|
|
|
Key name: states_count_and_occupation_spin_up
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: ""
|
|
Allowed:
|
|
Description: Occupation string for spin up states. Format is the same as for
|
|
states_count_and_occupation. Total number of states must match
|
|
spin down occupation string.
|
|
|
|
Key name: unoccupied_states_per_kpoint
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0
|
|
Max value: 2147483647
|
|
Default: 10
|
|
Description: The number of unoccupied orbitals. A value that is 15-20% of the
|
|
number of occupied orbitals generally works well.
|
|
|
|
Charge density mixing options
|
|
|
|
Key name: charge_broyden_order
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 1
|
|
Max value: 10
|
|
Default: 5
|
|
Description: Number of previous steps to use when Broyden mixing is used to
|
|
update the charge density.
|
|
|
|
Key name: charge_broyden_scale
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: 1.000000
|
|
Default: 0.500000
|
|
Description:
|
|
|
|
Key name: charge_density_mixing
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: 1.000000
|
|
Default: 0.500000
|
|
Description: Proportion of the current charge density to replace with the new
|
|
density after each scf step when linear mixing is used.
|
|
|
|
Key name: charge_mixing_type
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Pulay"
|
|
Allowed: "Broyden" "Pulay" "Linear"
|
|
Description: RMG supports Broyden, Pulay and Linear mixing When the davidson
|
|
Kohn-Sham solver is selected Broyden or Pulay are preferred. For
|
|
the multigrid solver Linear with potential acceleration is often
|
|
(but not always) the best choice.
|
|
|
|
Key name: charge_pulay_Gspace
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: if set true, charge density mixing the residual in G space
|
|
|
|
Key name: charge_pulay_order
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 1
|
|
Max value: 10
|
|
Default: 5
|
|
Description: Number of previous steps to use when Pulay mixing is used to
|
|
update the charge density.
|
|
|
|
Key name: charge_pulay_refresh
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 1
|
|
Max value: 2147483647
|
|
Default: 100
|
|
Description:
|
|
|
|
Key name: charge_pulay_scale
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: 1.000000
|
|
Default: 0.500000
|
|
Description:
|
|
|
|
Key name: potential_acceleration_constant_step
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: 4.000000
|
|
Default: 0.000000e+00
|
|
Description: When set to a non-zero value this parameter causes RMG to perform
|
|
a band by band update of the self-consistent potential during the
|
|
course of an SCF step when the multigrid kohn_sham_solver is
|
|
chosen. This means that updates to the lower energy orbitals are
|
|
incorporated into the SCF potential seen by the higher energy
|
|
orbitals as soon as they are computed. This can lead to faster
|
|
convergence and better stability for many systems. The option
|
|
should only be used with Linear mixing. Even when the davidson
|
|
solver is chosen this parameter may be used since the first few
|
|
steps with davidson usually uses the multigrid solver.
|
|
|
|
Relaxation and Molecular dynamics options
|
|
|
|
Key name: dynamic_time_counter
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0
|
|
Max value: 0
|
|
Default: 0
|
|
Description:
|
|
|
|
Key name: dynamic_time_delay
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 5
|
|
Max value: 5
|
|
Default: 5
|
|
Description:
|
|
|
|
Key name: force_grad_order
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0
|
|
Max value: 12
|
|
Default: 8
|
|
Description: Atomic forces may be computed to varying degrees of accuracy
|
|
depending on the requirements of a specific problem. A value of 0
|
|
implies highest accuracy which is obtained by using FFTs in place
|
|
of finite differencing.
|
|
|
|
Key name: ionic_time_step
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: unlimited
|
|
Default: 50.000000
|
|
Description: Ionic time step for use in molecular dynamics and structure
|
|
optimizations.
|
|
|
|
Key name: ionic_time_step_decrease
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: 1.000000
|
|
Default: 0.500000
|
|
Description: Factor by which ionic timestep is decreased when dynamic timesteps
|
|
are enabled.
|
|
|
|
Key name: ionic_time_step_increase
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 1.000000
|
|
Max value: 3.000000
|
|
Default: 1.100000
|
|
Description: Factor by which ionic timestep is increased when dynamic timesteps
|
|
are enabled.
|
|
|
|
Key name: max_ionic_time_step
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: 150.000000
|
|
Default: 150.000000
|
|
Description: Maximum ionic time step to use for molecular dynamics or
|
|
structural optimizations.
|
|
|
|
Key name: max_md_steps
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0
|
|
Max value: 2147483647
|
|
Default: 100
|
|
Description: Maximum number of molecular dynamics steps to perform.
|
|
|
|
Key name: md_integration_order
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "5th Beeman-Velocity Verlet"
|
|
Allowed: "5th Beeman-Velocity Verlet" "3rd Beeman-Velocity Verlet" "2nd
|
|
Velocity Verlet"
|
|
Description: Integration order for molecular dynamics.
|
|
|
|
Key name: md_nose_oscillation_frequency_THz
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: unlimited
|
|
Default: 15.590000
|
|
Description:
|
|
|
|
Key name: md_number_of_nose_thermostats
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 5
|
|
Max value: 5
|
|
Default: 5
|
|
Description: Number of Nose thermostats to use during Constant Volume and
|
|
Temperature MD.
|
|
|
|
Key name: md_randomize_velocity
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "true"
|
|
Description: The initial ionic velocities for a molecular dyanamics run are
|
|
randomly initialized to the target temperature.
|
|
|
|
Key name: md_temperature
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: unlimited
|
|
Default: 300.000000
|
|
Description: Target MD Temperature.
|
|
|
|
Key name: md_temperature_control
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Nose Hoover Chains"
|
|
Allowed: "Anderson Rescaling" "Nose Hoover Chains"
|
|
Description: Type of temperature control method to use in molecular dynamics.
|
|
|
|
Key name: relax_dynamic_timestep
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: Flag indicating whether or not to use dynamic timesteps in
|
|
relaxation mode.
|
|
|
|
Key name: relax_mass
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Atomic"
|
|
Allowed: "Equal" "Atomic"
|
|
Description: Mass to use for structural relaxation, either atomic masses, or
|
|
the mass of carbon for all atoms.
|
|
|
|
Key name: relax_max_force
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: unlimited
|
|
Default: 2.500000e-03
|
|
Description: Force value at which an ionic relaxation is considered to be
|
|
converged.
|
|
|
|
Key name: relax_method
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Fast Relax"
|
|
Allowed: "LBFGS" "MD Min" "Quick Min" "FIRE" "Fast Relax"
|
|
Description: Type of relaxation method to use for structural optimizations.
|
|
|
|
Key name: renormalize_forces
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "true"
|
|
Description: Flag indicating whether or not to renormalize forces.
|
|
|
|
Key name: tddft_time_step
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: unlimited
|
|
Default: 0.200000
|
|
Description: TDDFT time step for use in TDDFT mode
|
|
|
|
Diagonalization options
|
|
|
|
Key name: extra_random_lcao_states
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0
|
|
Max value: 2147483647
|
|
Default: 0
|
|
Description: LCAO (Linear Combination of Atomic Orbitals) is the default
|
|
startup method for RMG. The atomic orbitals are obtained from the
|
|
pseudpotentials but in some cases better convergence may be
|
|
obtained by adding extra random wavefunctions in addition to the
|
|
atomic orbitals.
|
|
|
|
Key name: folded_spectrum
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: Yes
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: When the number of eigenvectors is large using folded_spectrum is
|
|
substantially faster than standard diagonalization. It also tends
|
|
to converge better for metallic systems. It works with the
|
|
multigrid kohn_sham_solver but not the davidson solver.
|
|
|
|
Key name: folded_spectrum_iterations
|
|
Required: no
|
|
Key type: integer
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 0
|
|
Max value: 20
|
|
Default: 2
|
|
Description: Number of folded spectrum iterations to perform.
|
|
|
|
Key name: folded_spectrum_width
|
|
Required: no
|
|
Key type: double
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 0.100000
|
|
Max value: 1.000000
|
|
Default: 0.300000
|
|
Description: Submatrix width to use as a fraction of the full spectrum. The
|
|
folded spectrum width ranges from 0.10 to 1.0. For insulators and
|
|
semiconductors a value of 0.3 is appropriate. For metals values
|
|
between 0.15 to 0.2 tend to be better. The default value is 0.3
|
|
|
|
Key name: initial_diagonalization
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "true"
|
|
Description: Perform initial subspace diagonalization.
|
|
|
|
Key name: period_of_diagonalization
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0
|
|
Max value: 2147483647
|
|
Default: 1
|
|
Description: Diagonalization period (per scf step). Mainly for debugging and
|
|
should not be changed for production.
|
|
|
|
Key name: scalapack_block_factor
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 4
|
|
Max value: 512
|
|
Default: 32
|
|
Description: Block size to use with scalapack. Optimal value is dependent on
|
|
matrix size and system hardware.
|
|
|
|
Key name: subdiag_driver
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "auto"
|
|
Allowed: "elpa" "cusolver" "auto" "scalapack" "magma" "lapack"
|
|
Description: Driver type used for subspace diagonalization of the eigenvectors.
|
|
|
|
Performance related options
|
|
|
|
Key name: mpi_queue_mode
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "true"
|
|
Description: Use mpi queue mode.
|
|
|
|
Key name: non_local_block_size
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 64
|
|
Max value: 40000
|
|
Default: 512
|
|
Description: Block size to use when applying the non-local and S operators.
|
|
|
|
Key name: preconditioner_threshold
|
|
Required: no
|
|
Key type: double
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 1.000000e-09
|
|
Max value: 0.100000
|
|
Default: 0.100000
|
|
Description: The RMS value of the change in the total potential where we switch
|
|
the preconditioner from single to double precision.
|
|
|
|
Key name: require_huge_pages
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: Yes
|
|
Default: "false"
|
|
Description: If set RMG assumes that sufficient huge pages are available. Bad
|
|
things may happen if this is not true.
|
|
|
|
Key name: spin_manager_thread
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: Yes
|
|
Experimental: No
|
|
Default: "true"
|
|
Description: When mpi_queue_mode is enabled the manager thread spins instead of
|
|
sleeping.
|
|
|
|
Key name: spin_worker_threads
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: Yes
|
|
Experimental: No
|
|
Default: "true"
|
|
Description: When mpi_queue_mode is enabled the worker threads spin instead of
|
|
sleeping.
|
|
|
|
Key name: state_block_size
|
|
Required: no
|
|
Key type: integer
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 1
|
|
Max value: 2147483647
|
|
Default: 64
|
|
Description: state_block used in nlforce.
|
|
|
|
Key name: use_alt_zgemm
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: Flag indicating whether or not to use alternate zgemm
|
|
implementation.
|
|
|
|
Key name: use_async_allreduce
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "true"
|
|
Description: Use asynchronous allreduce if available.
|
|
|
|
Key name: use_hwloc
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: Use internal hwloc setup if available. If both this and use_numa
|
|
are true hwloc takes precedence.
|
|
|
|
Key name: use_numa
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "true"
|
|
Description: Use internal numa setup if available.
|
|
|
|
LDAU options
|
|
|
|
Key name: Hubbard_U
|
|
Required: no
|
|
Key type: formatted
|
|
Expert: No
|
|
Experimental: No
|
|
Default: ""
|
|
Allowed:
|
|
Description: Hubbard U parameter for each atomic species using the format
|
|
Hubbard_U="Ni 6.5"
|
|
|
|
Key name: ldaU_mode
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "None"
|
|
Allowed: "Simple" "None"
|
|
Description: Type of lda+u implementation.
|
|
|
|
Key name: ldaU_radius
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 1.000000
|
|
Max value: 12.000000
|
|
Default: 9.000000
|
|
Description: Max radius of atomic orbitals to be used in LDA+U projectors.
|
|
|
|
Poisson solver options
|
|
|
|
Key name: hartree_max_sweeps
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 5
|
|
Max value: 100
|
|
Default: 10
|
|
Description: Maximum number of hartree iterations to perform per scf step.
|
|
|
|
Key name: hartree_min_sweeps
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0
|
|
Max value: 5
|
|
Default: 5
|
|
Description: Minimum number of hartree iterations to perform per scf step.
|
|
|
|
Key name: hartree_rms_ratio
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 1000.000000
|
|
Max value: unlimited
|
|
Default: 100000.000000
|
|
Description: Ratio between target RMS for get_vh and RMS total potential.
|
|
|
|
Key name: poisson_coarse_time_step
|
|
Required: no
|
|
Key type: double
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 0.400000
|
|
Max value: 1.000000
|
|
Default: 0.800000
|
|
Description: Time step to use in the poisson multigrid solver on the coarse
|
|
levels.
|
|
|
|
Key name: poisson_coarsest_steps
|
|
Required: no
|
|
Key type: integer
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 10
|
|
Max value: 100
|
|
Default: 25
|
|
Description: Number of smoothing steps to use on the coarsest level in the
|
|
hartree multigrid solver.
|
|
|
|
Key name: poisson_finest_time_step
|
|
Required: no
|
|
Key type: double
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 0.400000
|
|
Max value: 1.000000
|
|
Default: 1.000000
|
|
Description: Time step to use in the poisson multigrid solver on the finest
|
|
level.
|
|
|
|
Key name: poisson_mucycles
|
|
Required: no
|
|
Key type: integer
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 1
|
|
Max value: 4
|
|
Default: 3
|
|
Description: Number of mu (also known as W) cycles to use in the hartree
|
|
multigrid solver.
|
|
|
|
Key name: poisson_post_smoothing
|
|
Required: no
|
|
Key type: integer
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 1
|
|
Max value: 6
|
|
Default: 1
|
|
Description: Number of global hartree grid post-smoothing steps to perform
|
|
after a multigrid iteration.
|
|
|
|
Key name: poisson_pre_smoothing
|
|
Required: no
|
|
Key type: integer
|
|
Expert: Yes
|
|
Experimental: No
|
|
Min value: 1
|
|
Max value: 6
|
|
Default: 2
|
|
Description: Number of global hartree grid pre-smoothing steps to perform
|
|
before a multigrid iteration.
|
|
|
|
Key name: poisson_solver
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "pfft"
|
|
Allowed: "pfft" "multigrid"
|
|
Description: poisson solver.
|
|
|
|
Testing options
|
|
|
|
Key name: test_energy
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: -1000000000.000000
|
|
Max value: 1000000000.000000
|
|
Default: nan
|
|
Description: Expected final energy for testing.
|
|
|
|
Key name: test_energy_tolerance
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 1.000000e-08
|
|
Max value: 1.000000e-04
|
|
Default: 1.000000e-07
|
|
Description: Test final energy tolerance.
|
|
|
|
Miscellaneous options
|
|
|
|
Key name: E_POINTS
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 201
|
|
Max value: 201
|
|
Default: 201
|
|
Description:
|
|
|
|
Key name: Emax
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: -100.000000
|
|
Max value: 100.000000
|
|
Default: 0.000000e+00
|
|
Description:
|
|
|
|
Key name: Emin
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: -100.000000
|
|
Max value: 100.000000
|
|
Default: -6.000000
|
|
Description:
|
|
|
|
Key name: ExxCholMax
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 1
|
|
Max value: 64
|
|
Default: 8
|
|
Description: maximum number of Exx integral cholesky vectors
|
|
|
|
Key name: ExxIntCholosky
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "true"
|
|
Description: if set true, Exx integrals are Cholesky factorized to 3-index
|
|
|
|
Key name: alt_laplacian
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: Yes
|
|
Experimental: No
|
|
Default: "true"
|
|
Description: Flag indicating whether or not to use alternate laplacian weights
|
|
for some operators.
|
|
|
|
Key name: boundary_condition_type
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Periodic"
|
|
Allowed: "Periodic"
|
|
Description: Boundary condition type Only periodic is currently implemented.
|
|
|
|
Key name: charge_analysis
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Voronoi"
|
|
Allowed: "Voronoi" "None"
|
|
Description: Type of charge analysis to use. Only Voronoi deformation density
|
|
is currently available.
|
|
|
|
Key name: charge_analysis_period
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0
|
|
Max value: 500
|
|
Default: 0
|
|
Description: How often to perform and write out charge analysis.
|
|
|
|
Key name: cube_pot
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: if set true, total potential is printed out in cube format
|
|
|
|
Key name: cube_rho
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "true"
|
|
Description: if set true, charge density is printed out in cube format
|
|
|
|
Key name: cube_states_list
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: ""
|
|
Allowed:
|
|
Description: plot the states listed here
|
|
|
|
Key name: cube_vh
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: if set true, hatree potential is printed out in cube format
|
|
|
|
Key name: dftd3_version
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 2
|
|
Max value: 6
|
|
Default: 3
|
|
Description: Grimme's DFT-D3 versions,
|
|
|
|
Key name: dipole_correction
|
|
Required: no
|
|
Key type: integer array
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "0 0 0 "
|
|
Description: (1,1,1) for molecule, dipole correction in all directions.
|
|
|
|
Key name: dipole_moment
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: Turns on calculation of dipole moment for the entire cell.
|
|
|
|
Key name: ecutrho
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: 10000.000000
|
|
Default: 0.000000e+00
|
|
Description: ecut for rho in unit of Ry.
|
|
|
|
Key name: ecutwfc
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: 10000.000000
|
|
Default: 0.000000e+00
|
|
Description: ecut for wavefunctions in unit of Ry.
|
|
|
|
Key name: electric_field_magnitude
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: unlimited
|
|
Default: 0.000000e+00
|
|
Description: Magnitude of external electric field.
|
|
|
|
Key name: electric_field_vector
|
|
Required: no
|
|
Key type: double array
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Not done yet"
|
|
Description: Components of the electric field.
|
|
|
|
Key name: equal_initial_density
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: Specifies whether to set initial up and down density to be equal.
|
|
|
|
Key name: exx_int_flag
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: if set true, calculate the exact exchange integrals
|
|
|
|
Key name: fast_density
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "true"
|
|
Description: Use a faster but less accurate method to generate the charge
|
|
density from the electronic wavefunctions. As the cutoff
|
|
(grid-density) increases this method improves in accuracy. This
|
|
option should be set to false if you receive warnings about
|
|
negative charge densities after interpolation.
|
|
|
|
Key name: fd_allocation_limit
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 1024
|
|
Max value: 262144
|
|
Default: 65536
|
|
Description: Allocation sizes in finite difference routines less than this
|
|
value are stack rather than heap based.
|
|
|
|
Key name: frac_symmetry
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "true"
|
|
Description: For supercell calculation, one can disable the fractional
|
|
translation symmetry
|
|
|
|
Key name: freeze_occupied
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: Yes
|
|
Default: "false"
|
|
Description: Flag indicating whether or not to freeze the density and occupied
|
|
orbitals after a restart.
|
|
|
|
Key name: gw_residual_convergence_criterion
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: Yes
|
|
Min value: 1.000000e-14
|
|
Max value: 4.000000e-04
|
|
Default: 1.000000e-06
|
|
Description: The max value of the residual for unoccupied orbitals when
|
|
performing a GW calculation.
|
|
|
|
Key name: gw_residual_fraction
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: Yes
|
|
Min value: 0.000000e+00
|
|
Max value: 1.000000
|
|
Default: 0.900000
|
|
Description: The residual value specified by gw_residual_convergence_criterion
|
|
is applied to this fraction of the total spectrum.
|
|
|
|
Key name: kohn_sham_ke_fft
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: Yes
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: Special purpose flag which will force use of an FFT for the
|
|
kinetic energy operator.
|
|
|
|
Key name: kpoint_distribution
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: -2147483647
|
|
Max value: 2147483647
|
|
Default: -1
|
|
Description:
|
|
|
|
Key name: laplacian_autocoeff
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: if set to true, we use LaplacianCoeff.cpp to generate coeff
|
|
|
|
Key name: laplacian_offdiag
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: if set to true, we use LaplacianCoeff.cpp to generate coeff
|
|
|
|
Key name: lcao_use_empty_orbitals
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: Some pseudopotentials contain unbound atomic orbitals and this
|
|
flag indicates whether or not they should be used for LCAO starts.
|
|
|
|
Key name: md_steps_offset
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0
|
|
Max value: 0
|
|
Default: 0
|
|
Description:
|
|
|
|
Key name: num_wanniers
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0
|
|
Max value: 2147483647
|
|
Default: 0
|
|
Description: number of wannier functions to be used in wannier90
|
|
|
|
Key name: output_rho_xsf
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: Generate xsf format for electronic density.
|
|
|
|
Key name: poisson_mg_levels
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: -1
|
|
Max value: 6
|
|
Default: -1
|
|
Description: Number of multigrid levels to use in the hartree multigrid solver.
|
|
|
|
Key name: restart_tddft
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: restart TDDFT
|
|
|
|
Key name: rmg2bgw
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: Yes
|
|
Default: "false"
|
|
Description: Write wavefunction in G-space to BerkeleyGW WFN file.
|
|
|
|
Key name: rmg_threads_per_node
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0
|
|
Max value: 64
|
|
Default: 0
|
|
Description: Number of Multigrid/Davidson threads each MPI process will use. A
|
|
value of 0 means set automatically.
|
|
|
|
Key name: scf_steps_offset
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0
|
|
Max value: 0
|
|
Default: 0
|
|
Description:
|
|
|
|
Key name: sqrt_interpolation
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: Flag indicating whether or not to use square root technique for
|
|
density interpolation.
|
|
|
|
Key name: system_charge
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: -unlimited
|
|
Max value: unlimited
|
|
Default: 0.000000e+00
|
|
Description: Number of excess holes in the system (useful for doped systems).
|
|
Example, 2 means system is missing two electrons
|
|
|
|
Key name: tddft_mode
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "electric field"
|
|
Allowed: "point charge" "electric field"
|
|
Description: TDDFT mode
|
|
|
|
Key name: tddft_qgau
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: unlimited
|
|
Default: 1.000000
|
|
Description: Gaussian parameter for point charge to Gaussian charge
|
|
|
|
Key name: tddft_qpos
|
|
Required: no
|
|
Key type: double array
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Not done yet"
|
|
Description: cartesian coordinate of the point charge for tddft
|
|
|
|
Key name: total_scf_steps_offset
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0
|
|
Max value: 0
|
|
Default: 0
|
|
Description:
|
|
|
|
Key name: use_cpdgemr2d
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "true"
|
|
Description: if set to true, we use Cpdgemr2d to change matrix distribution
|
|
|
|
Key name: use_symmetry
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "true"
|
|
Description: For non-gamma point, always true, for gamma point, optional
|
|
|
|
Key name: vdwdf_grid_type
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "Coarse"
|
|
Allowed: "Fine" "Coarse"
|
|
Description: Type of grid to use when computing vdw-df correlation.
|
|
|
|
Key name: verbose
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: Flag for writing out extra information
|
|
|
|
Key name: vxc_diag_nmax
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 1
|
|
Max value: 10000
|
|
Default: 1
|
|
Description: Maximum band index for diagonal Vxc matrix elements.
|
|
|
|
Key name: vxc_diag_nmin
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 1
|
|
Max value: 10000
|
|
Default: 1
|
|
Description: Minimum band index for diagonal Vxc matrix elements.
|
|
|
|
Key name: wannier90_scdm
|
|
Required: no
|
|
Key type: integer
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: -2147483647
|
|
Max value: 2
|
|
Default: 0
|
|
Description: use scdm method to set the trial wannier functions
|
|
|
|
Key name: wannier90_scdm_sigma
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
Min value: 0.000000e+00
|
|
Max value: unlimited
|
|
Default: 1.000000
|
|
Description: when wannier90 is used to build wannier functions, the energy
|
|
window parameter
|
|
|
|
Key name: write_orbital_overlaps
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: If true the orbital overlap matrix from successive MD steps is
|
|
written.
|
|
|
|
Key name: write_pdos
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
Description: Flag to write partial density of states.
|
|
|
|
Key name: z_average_output_mode
|
|
Required: no
|
|
Key type: string
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "None"
|
|
Allowed: "potential and charge density" "wave functions" "None"
|
|
Description: z_average_output_mode.
|
|
|
|
'''
|
|
|
|
undocumented_options = '''
|
|
Undocumented options
|
|
|
|
Key name: use_bessel_projectors
|
|
Required: no
|
|
Key type: boolean
|
|
Expert: No
|
|
Experimental: No
|
|
Default: "false"
|
|
|
|
Key name: kpoints
|
|
Required: no
|
|
Key type: formatted
|
|
Expert: No
|
|
Experimental: No
|
|
|
|
Key name: kpoints_bandstructure
|
|
Required: no
|
|
Key type: formatted
|
|
Expert: No
|
|
Experimental: No
|
|
|
|
Key name: atoms
|
|
Required: no
|
|
Key type: formatted
|
|
Expert: No
|
|
Experimental: No
|
|
|
|
'''
|
|
|
|
deprecated_options = '''
|
|
Deprecated options
|
|
|
|
Key name: alpha
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
|
|
Key name: beta
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
|
|
Key name: gamma
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
|
|
Key name: length_units
|
|
Required: no
|
|
Key type: string
|
|
Allowed: "Angstrom" "Bohr"
|
|
Expert: No
|
|
Experimental: No
|
|
|
|
Key name: projector_mixing
|
|
Required: no
|
|
Key type: double
|
|
Expert: No
|
|
Experimental: No
|
|
|
|
'''
|
|
|
|
raw_input_spec += undocumented_options
|
|
raw_input_spec += deprecated_options
|
|
|
|
|
|
|
|
def read_string(v):
|
|
return v.strip().strip('"')
|
|
#end def read_string
|
|
|
|
truefalse_read = {'"true"':True,'"false"':False,'true':True,'false':False}
|
|
def read_boolean(v):
|
|
return truefalse_read[v.lower()]
|
|
#end def read_boolean
|
|
|
|
def read_integer(v):
|
|
return int(v.strip().strip('"'))
|
|
#end def read_integer
|
|
|
|
def read_double(v):
|
|
return float(v.strip().strip('"'))
|
|
#end def read_double
|
|
|
|
def read_integer_array(v):
|
|
return np.array(v.strip().strip('"').split(),dtype=int)
|
|
#end def read_integer_array
|
|
|
|
def read_double_array(v):
|
|
return np.array(v.strip().strip('"').split(),dtype=float)
|
|
#end def read_double_array
|
|
|
|
|
|
def write_string(v):
|
|
return '"'+v.strip()+'"'
|
|
#end def write_string
|
|
|
|
truefalse_write = {True:'"true"',False:'"false"'}
|
|
def write_boolean(v):
|
|
return truefalse_write[v]
|
|
#end def write_boolean
|
|
|
|
def write_integer(v):
|
|
return '"{}"'.format(v)
|
|
#end def write_integer
|
|
|
|
double_fmt = '{: 16.8f}'
|
|
double_fmt_exp = '{: 16.8e}'
|
|
def write_double(v):
|
|
vs = double_fmt.format(v).strip()
|
|
if abs((float(vs)-v))>1e-6*abs(v):
|
|
vs = double_fmt_exp.format(v).strip()
|
|
#end if
|
|
return '"'+vs+'"'
|
|
#end def write_double
|
|
|
|
def write_integer_array(v):
|
|
s = '"'
|
|
if isinstance(v,np.ndarray):
|
|
v = v.flatten()
|
|
#end if
|
|
for i in v:
|
|
s+='{} '.format(i)
|
|
#end for
|
|
return s[:-1]+'"'
|
|
#end def write_integer_array
|
|
|
|
def write_double_array(v):
|
|
s = '"'
|
|
if isinstance(v,np.ndarray):
|
|
v = v.flatten()
|
|
#end if
|
|
for d in v:
|
|
s+=double_fmt.format(d).strip()+' '
|
|
#end for
|
|
return s[:-1]+'"'
|
|
#end def write_double_array
|
|
|
|
|
|
rmg_value_types = obj({
|
|
'string' : (str , np.string_),
|
|
'boolean' : (bool , np.bool_ ),
|
|
'integer' : (int , np.int_ ),
|
|
'double' : (float, np.float_ ),
|
|
'integer array' : (tuple,list,np.ndarray),
|
|
'double array' : (tuple,list,np.ndarray),
|
|
})
|
|
|
|
read_functions = obj({
|
|
'string' : read_string,
|
|
'boolean' : read_boolean,
|
|
'integer' : read_integer,
|
|
'double' : read_double,
|
|
'integer array' : read_integer_array,
|
|
'double array' : read_double_array,
|
|
})
|
|
|
|
write_functions = obj({
|
|
'string' : write_string,
|
|
'boolean' : write_boolean,
|
|
'integer' : write_integer,
|
|
'double' : write_double,
|
|
'integer array' : write_integer_array,
|
|
'double array' : write_double_array,
|
|
})
|
|
|
|
rmg_array_dtypes = obj({
|
|
'integer array' : int,
|
|
'double array' : float,
|
|
})
|
|
|
|
|
|
class RmgKeyword(DevBase):
|
|
def __init__(self,key_spec,section_name):
|
|
self.key_name = None
|
|
self.key_type = None
|
|
self.default = None
|
|
self.allowed = None
|
|
self.min_value = None
|
|
self.max_value = None
|
|
self.required = None
|
|
self.expert = None
|
|
self.experimental = None
|
|
self.description = None
|
|
|
|
self.value_type = None
|
|
self.array_dtype = None
|
|
self.section_name = section_name
|
|
|
|
spec = obj()
|
|
name = None
|
|
value = None
|
|
for line in key_spec.strip().splitlines():
|
|
if ':' in line:
|
|
if name is not None:
|
|
spec[name] = value
|
|
#end if
|
|
name,value = line.split(':',1)
|
|
name = name.strip().lower().replace(' ','_')
|
|
value = value.strip()
|
|
else:
|
|
value += ' '+line.strip()
|
|
#end if
|
|
#end for
|
|
if name is not None:
|
|
spec[name] = value
|
|
else:
|
|
self.error('Invalid keyword specification text received.\nNo field names are present.\nInvalid spec: {}'.format(key_spec))
|
|
#end if
|
|
|
|
for name,value in spec.items():
|
|
if name not in self:
|
|
kname = 'unknown'
|
|
if 'key_name' in spec:
|
|
kname = spec.key_name
|
|
#end if
|
|
self.error('Unrecognized keyword specification field.\nKeyword: {}\nField name: {}\nField value: {}'.format(kname,name,value))
|
|
#end if
|
|
self[name] = value
|
|
#end for
|
|
|
|
if self.key_name is None:
|
|
self.error('Invalid keyword specification received.\nKey name must be defined.\nInvalid spec: {}'.format(key_spec))
|
|
#end if
|
|
if self.key_type is None:
|
|
self.error('Invalid keyword specification received.\nKey type must be defined.\nInvalid spec: {}'.format(key_spec))
|
|
#end if
|
|
|
|
if self.key_type=='formatted':
|
|
return
|
|
#end if
|
|
|
|
if self.key_type not in read_functions:
|
|
self.error('Read function has not been implemented for key type "{}".'.format(self.key_type))
|
|
#end if
|
|
if self.key_type not in write_functions:
|
|
self.error('Write function has not been implemented for key type "{}".'.format(self.key_type))
|
|
#end if
|
|
|
|
read_function = read_functions[self.key_type]
|
|
|
|
yesno = dict(yes=True,no=False)
|
|
if self.required is None:
|
|
self.required = False
|
|
else:
|
|
self.required = yesno[self.required.lower()]
|
|
#end if
|
|
if self.expert is None:
|
|
self.expert = False
|
|
else:
|
|
self.expert = yesno[self.expert.lower()]
|
|
#end if
|
|
if self.experimental is None:
|
|
self.experimental = False
|
|
else:
|
|
self.experimental = yesno[self.experimental.lower()]
|
|
#end if
|
|
if self.min_value is not None:
|
|
if 'unlimited' in self.min_value:
|
|
self.min_value = None
|
|
else:
|
|
self.min_value = self.read(self.min_value)
|
|
#end if
|
|
#end if
|
|
if self.max_value is not None:
|
|
if 'unlimited' in self.max_value:
|
|
self.max_value = None
|
|
else:
|
|
self.max_value = self.read(self.max_value)
|
|
#end if
|
|
#end if
|
|
if self.default is not None and self.default!='"Not done yet"':
|
|
self.default = self.read(self.default)
|
|
#end if
|
|
if self.allowed is not None:
|
|
tokens = []
|
|
i1 = -1
|
|
i2 = -1
|
|
for i,c in enumerate(self.allowed):
|
|
if c=='"':
|
|
if i1==-1:
|
|
i1 = i
|
|
else:
|
|
i2 = i
|
|
tokens.append(self.read(self.allowed[i1:i2+1]))
|
|
i1 = -1
|
|
i2 = -1
|
|
#end if
|
|
#end if
|
|
#end for
|
|
self.allowed = set(tokens)
|
|
if len(self.allowed)==0:
|
|
self.allowed = None
|
|
#end if
|
|
#end if
|
|
|
|
self.value_type = rmg_value_types[self.key_type]
|
|
if self.key_type in rmg_array_dtypes:
|
|
self.array_dtype = rmg_array_dtypes[self.key_type]
|
|
#end if
|
|
|
|
#end def __init__
|
|
|
|
|
|
def read(self,value):
|
|
return read_functions[self.key_type](value)
|
|
#end def read
|
|
|
|
|
|
def write(self,value):
|
|
return write_functions[self.key_type](value)
|
|
#end def write
|
|
|
|
|
|
def assign(self,value):
|
|
if not isinstance(value,self.value_type):
|
|
self.error('cannot assign RMG keyword "{}".\nInvalid type encountered.\nType encoutered: {}\nType(s) expected: {}'.format(self.key_name,value.__class__.__name__,self.value_type))
|
|
#end if
|
|
if self.array_dtype is not None:
|
|
return np.array(value,dtype=self.array_dtype)
|
|
else:
|
|
return value
|
|
#end if
|
|
#end def assign
|
|
|
|
|
|
def valid(self,value,message=False):
|
|
msg = ''
|
|
if not isinstance(value,self.value_type):
|
|
msg += 'Keyword "{}" has the wrong type.\n Type expected: {}\n Type provided: {}\n'.format(self.key_name,self.key_type,value.__class__.__name__)
|
|
else:
|
|
if RmgInputSettings.enforce_min_value:
|
|
if self.min_value is not None and value<self.min_value:
|
|
msg += 'Value for keyword "{}" is smaller than allowed.\n Minimum value allowed: {}\n Value provided: {}\n'.format(self.key_name,self.min_value,value)
|
|
#end if
|
|
#end if
|
|
if RmgInputSettings.enforce_max_value:
|
|
if self.max_value is not None and value>self.max_value:
|
|
self.warn('Value for keyword "{}" is larger than allowed.\n Maximum value allowed: {}\n Value provided: {}\n'.format(self.key_name,self.max_value,value))
|
|
#end if
|
|
#end if
|
|
if RmgInputSettings.enforce_allowed:
|
|
if self.allowed is not None and value not in self.allowed:
|
|
msg += 'Value for keyword "{}" is not allowed.\n Value provided: {}\n Allowed values: {}'.format(self.key_name,value,list(sorted(self.allowed)))
|
|
#end if
|
|
#end if
|
|
#end if
|
|
if not message:
|
|
return len(msg)==0
|
|
else:
|
|
return len(msg)==0,msg
|
|
#end if
|
|
#end def valid
|
|
#end class RmgKeyword
|
|
|
|
|
|
|
|
class FormattedRmgKeyword(RmgKeyword):
|
|
def read(self,value):
|
|
self.not_implemented()
|
|
#end def read
|
|
|
|
def write(self,value):
|
|
self.not_implemented()
|
|
#end def write
|
|
|
|
def assign(self,value):
|
|
self.not_implemented()
|
|
#end def assign
|
|
|
|
def valid(self,value,message=False):
|
|
valid = self.valid_no_msg(value)
|
|
if not message:
|
|
return valid
|
|
else:
|
|
return valid,'Data for keyword "{}" is invalid.\nInvalid value: {}'.format(self.key_name,value)
|
|
#end if
|
|
#end def valid
|
|
|
|
def valid_no_msg(self,value):
|
|
self.not_implemented()
|
|
#end def valid_no_msg
|
|
#end class FormattedRmgKeyword
|
|
|
|
|
|
|
|
class FormattedTableRmgKeyword(FormattedRmgKeyword):
|
|
array_options = None
|
|
array_types = None
|
|
exclude_fields = set()
|
|
|
|
def assign(self,value):
|
|
if isinstance(value,str):
|
|
return value
|
|
elif isinstance(value,(dict,obj)):
|
|
for k,v in value.items():
|
|
if isinstance(v,(tuple,list)):
|
|
value[k] = np.array(v)
|
|
#end if
|
|
#end for
|
|
return value
|
|
else:
|
|
self.error('cannot assign RMG keyword "{}".\nInvalid type encountered.\nType encoutered: {}\nType(s) expected: str,dict,obj'.format(self.key_name,value.__class__.__name__))
|
|
#end if
|
|
#end def assign
|
|
|
|
def valid_no_msg(self,value):
|
|
cls = self.__class__
|
|
if not isinstance(value,obj):
|
|
return False
|
|
#end if
|
|
keys = set(value.keys())-set(cls.exclude_fields)
|
|
match = False
|
|
for key_set in cls.array_options:
|
|
if keys==key_set:
|
|
match = True
|
|
break
|
|
#end if
|
|
#end if
|
|
if not match:
|
|
return False
|
|
#end if
|
|
lengths = [len(value[k]) for k in keys]
|
|
if lengths[0]==0:
|
|
return False
|
|
#end if
|
|
if len(set(lengths))!=1:
|
|
return False
|
|
#end if
|
|
for k in keys:
|
|
v = value[k]
|
|
if not isinstance(v,np.ndarray):
|
|
return False
|
|
elif not isinstance(v.flatten()[0],cls.array_types[k]):
|
|
return False
|
|
#end if
|
|
#end for
|
|
return True
|
|
#end def valid_no_msg
|
|
#end class FormattedTableRmgKeyword
|
|
|
|
|
|
|
|
class PseudopotentialKeyword(FormattedTableRmgKeyword):
|
|
array_options = [
|
|
set(('species','pseudos')),
|
|
]
|
|
array_types = obj(
|
|
species = rmg_value_types.string,
|
|
pseudos = rmg_value_types.string,
|
|
)
|
|
|
|
def read(self,value):
|
|
d = np.array(value.split(),dtype=str)
|
|
d.shape = len(d)//2,2
|
|
species = d[:,0].flatten()
|
|
pseudos = d[:,1].flatten()
|
|
return obj(species=species,pseudos=pseudos)
|
|
#end def read
|
|
|
|
def write(self,value):
|
|
v = value
|
|
s = '"\n'
|
|
for (sp,p) in zip(v.species,v.pseudos):
|
|
s += '{:<4} {}\n'.format(sp,p)
|
|
#end for
|
|
s += '"'
|
|
return s
|
|
#end def write
|
|
#end class PseudopotentialKeyword
|
|
|
|
|
|
|
|
class KpointsKeyword(FormattedTableRmgKeyword):
|
|
array_options = [
|
|
set(('kpoints','weights')),
|
|
]
|
|
array_types = obj(
|
|
kpoints = rmg_value_types.double,
|
|
weights = rmg_value_types.double,
|
|
)
|
|
|
|
def read(self,value):
|
|
d = np.array(value.split(),dtype=float)
|
|
d.shape = len(d)//4,4
|
|
kpoints = d[:,:3]
|
|
weights = d[:,-1].flatten()
|
|
return obj(kpoints=kpoints,weights=weights)
|
|
#end def read
|
|
|
|
def write(self,value):
|
|
v = value
|
|
s = '"\n'
|
|
for (kp,w) in zip(v.kpoints,v.weights):
|
|
s += '{: 16.12f} {: 16.12f} {: 16.12f} {: 16.12f}\n'.format(kp[0],kp[1],kp[2],w)
|
|
#end for
|
|
s += '"'
|
|
return s
|
|
#end def write
|
|
#end class KpointsKeyword
|
|
|
|
|
|
|
|
class KpointsBandstructureKeyword(FormattedTableRmgKeyword):
|
|
array_options = [
|
|
set(('kpoints','counts','labels')),
|
|
]
|
|
array_types = obj(
|
|
kpoints = rmg_value_types.double,
|
|
counts = rmg_value_types.integer,
|
|
labels = rmg_value_types.string,
|
|
)
|
|
|
|
def read(self,value):
|
|
d = np.array(value.split(),dtype=str)
|
|
d.shape = len(d)//4,5
|
|
kpoints = np.array(d[:,:3],dtype=float)
|
|
counts = np.array(d[:,3],dtype=int).flatten()
|
|
labels = d[:,-1].flatten()
|
|
return obj(kpoints=kpoints,counts=counts,labels=labels)
|
|
#end def read
|
|
|
|
def write(self,value):
|
|
v = value
|
|
s = '"\n'
|
|
for (kp,c,l) in zip(v.kpoints,v.counts,v.labels):
|
|
s += '{: 16.12f} {: 16.12f} {: 16.12f} {:>3} {}\n'.format(kp[0],kp[1],kp[2],c,l)
|
|
#end for
|
|
s += '"'
|
|
return s
|
|
#end def write
|
|
#end class KpointsBandstructureKeyword
|
|
|
|
|
|
|
|
class AtomsKeyword(FormattedTableRmgKeyword):
|
|
|
|
formats = ('basic','movable','movable_moment','moment','spin_ratio','full_spin')
|
|
|
|
array_options = [
|
|
set(('atoms','positions')),
|
|
set(('atoms','positions','movable')),
|
|
set(('atoms','positions','moments')),
|
|
set(('atoms','positions','movable','moments')),
|
|
set(('atoms','positions','movable','spin_ratio')),
|
|
set(('atoms','positions','movable','spin_ratio','spin_theta','spin_phi')),
|
|
]
|
|
array_types = obj(
|
|
atoms = rmg_value_types.string,
|
|
positions = rmg_value_types.double,
|
|
movable = rmg_value_types.boolean,
|
|
moments = rmg_value_types.double,
|
|
spin_ratio = rmg_value_types.double,
|
|
spin_theta = rmg_value_types.double,
|
|
spin_phi = rmg_value_types.double,
|
|
)
|
|
exclude_fields = ['format']
|
|
|
|
|
|
def read(self,value):
|
|
# check if input data is empty
|
|
value = value.strip()
|
|
if len(value)==0:
|
|
self.error('No data provided for "atoms".')
|
|
#end if
|
|
|
|
# determine the number of values per line
|
|
if '\n' in value:
|
|
first,rest = value.split('\n',1)
|
|
else:
|
|
first = value
|
|
#end if
|
|
nvals = len(first.split())
|
|
|
|
# initial array parse of value table
|
|
d = np.array(value.split(),dtype=str)
|
|
d.shape = len(d)//nvals,nvals
|
|
|
|
# extract universal atom labels and positions
|
|
atom_labels = d[:,0]
|
|
atom_labels = atom_labels.flatten()
|
|
positions = np.array(d[:,1:4],dtype=float)
|
|
|
|
# extract remaining data and determine format
|
|
v = obj(
|
|
format = None,
|
|
atoms = atom_labels,
|
|
positions = positions,
|
|
)
|
|
|
|
boolset = set(['0','1'])
|
|
invalid_format = False
|
|
if nvals==4:
|
|
v.format = 'basic'
|
|
elif nvals==5:
|
|
if len(set(d[:,4])-boolset)==0:
|
|
v.movable = np.array(d[:,4],dtype=bool)
|
|
v.format = 'movable'
|
|
else:
|
|
try:
|
|
v.moments = np.array(d[:,4],dtype=float)
|
|
v.format = 'moment'
|
|
except:
|
|
invalid_format = True
|
|
#end try
|
|
#end if
|
|
elif nvals==6:
|
|
try:
|
|
v.movable = np.array(d[:,4],dtype=bool)
|
|
v.moments = np.array(d[:,5],dtype=float)
|
|
v.format = 'movable_moment'
|
|
except:
|
|
invalid_format = True
|
|
#end try
|
|
elif nvals==8:
|
|
try:
|
|
assert(len(set(d[:,4:7].flatten())-boolset)==0)
|
|
v.movable = np.array(d[:,4:7],dtype=bool)
|
|
v.spin_ratio = np.array(d[:,7],dtype=float)
|
|
v.format = 'spin_ratio'
|
|
except:
|
|
invalid_format = True
|
|
#end try
|
|
elif nvals==10:
|
|
try:
|
|
assert(len(set(d[:,4:7].flatten())-boolset)==0)
|
|
v.movable = np.array(d[:,4:7],dtype=bool)
|
|
v.spin_ratio = np.array(d[:,7],dtype=float)
|
|
v.spin_theta = np.array(d[:,8],dtype=float)
|
|
v.spin_phi = np.array(d[:,9],dtype=float)
|
|
v.format = 'full_spin'
|
|
except:
|
|
invalid_format = True
|
|
#end try
|
|
#end if
|
|
|
|
if invalid_format:
|
|
self.error('Failed to read atoms data.\nPlease check the formatting:\n{}'.format(value))
|
|
elif v.format is None or v.format not in AtomsKeyword.formats:
|
|
self.error('Failed to read atoms data.\nThis is a developer error.\nPlease contact the developers.')
|
|
#end if
|
|
|
|
return v
|
|
#end def read
|
|
|
|
def write(self,value):
|
|
v = value
|
|
s = '"\n'
|
|
if v.format=='basic':
|
|
for (a,p) in zip(v.atoms,v.positions):
|
|
s += '{:<4} {: 16.12f} {: 16.12f} {: 16.12f}\n'.format(a,p[0],p[1],p[2])
|
|
#end for
|
|
elif v.format=='movable':
|
|
for (a,p,m) in zip(v.atoms,v.positions,v.movable):
|
|
s += '{:<4} {: 16.12f} {: 16.12f} {: 16.12f} {}\n'.format(a,p[0],p[1],p[2],int(m))
|
|
#end for
|
|
elif v.format=='moment':
|
|
for (a,p,m) in zip(v.atoms,v.positions,v.moments):
|
|
s += '{:<4} {: 16.12f} {: 16.12f} {: 16.12f} {: 6.4f}\n'.format(a,p[0],p[1],p[2],m)
|
|
#end for
|
|
elif v.format=='movable_moment':
|
|
for (a,p,mv,mo) in zip(v.atoms,v.positions,v.movable,v.moments):
|
|
s += '{:<4} {: 16.12f} {: 16.12f} {: 16.12f} {} {: 6.4f}\n'.format(a,p[0],p[1],p[2],int(mv),mo)
|
|
#end for
|
|
elif v.format=='spin_ratio':
|
|
for (a,p,m,s) in zip(v.atoms,v.positions,v.movable,v.spin_ratio):
|
|
s += '{:<4} {: 16.12f} {: 16.12f} {: 16.12f} {} {} {} {: 6.4f}\n'.format(a,p[0],p[1],p[2],int(m[0]),int(m[1]),int(m[2]),s)
|
|
#end for
|
|
elif v.format=='full_spin':
|
|
for (a,p,m,sr,st,sp) in zip(v.atoms,v.positions,v.movable,v.spin_ratio,v.spin_theta,v.spin_phi):
|
|
s += '{:<4} {: 16.12f} {: 16.12f} {: 16.12f} {} {} {} {: 6.4f} {: 6.2f} {: 6.2f}\n'.format(a,p[0],p[1],p[2],int(m[0]),int(m[1]),int(m[2]),sr,st,sp)
|
|
#end for
|
|
else:
|
|
self.error('Invalid atoms format encountered on write.\nInvalid format: {}\nValid options are: {}'.format(v.format,self.formats))
|
|
#end if
|
|
s += '"'
|
|
return s
|
|
#end def write
|
|
#end class AtomsKeyword
|
|
|
|
|
|
|
|
class HubbardUKeyword(RmgKeyword):
|
|
def read(self,value):
|
|
v = obj()
|
|
tokens = read_string(value).split()
|
|
for a,u in zip(tokens[::2],tokens[1::2]):
|
|
v[a] = float(u)
|
|
#end for
|
|
return v
|
|
#end def read
|
|
|
|
def write(self,value):
|
|
s = ''
|
|
for a in sorted(value.keys()):
|
|
s += ' {} {}'.format(a,value[a])
|
|
#end for
|
|
return write_string(s)
|
|
#end def write
|
|
|
|
def assign(self,value):
|
|
if isinstance(value,str):
|
|
return value
|
|
elif isinstance(value,(dict,obj)):
|
|
return obj(value)
|
|
else:
|
|
self.error('cannot assign RMG keyword "{}".\nInvalid type encountered.\nType encoutered: {}\nType(s) expected: str,dict,obj'.format(self.key_name,value.__class__.__name__))
|
|
#end if
|
|
#end def assign
|
|
|
|
def valid(self,value,message=False):
|
|
valid = True
|
|
for k,v in value.items():
|
|
if not isinstance(k,rmg_value_types.string):
|
|
valid = False
|
|
break
|
|
elif not isinstance(v,rmg_value_types.double):
|
|
valid = False
|
|
break
|
|
#end if
|
|
#end for
|
|
if not message:
|
|
return valid
|
|
else:
|
|
return valid,'Data for keyword "{}" is invalid.\nInvalid value: {}'.format(self.key_name,value)
|
|
#end if
|
|
#end def valid
|
|
#end class HubbardUKeyword
|
|
|
|
|
|
formatted_keywords = obj(
|
|
pseudopotential = PseudopotentialKeyword,
|
|
kpoints = KpointsKeyword,
|
|
kpoints_bandstructure = KpointsBandstructureKeyword,
|
|
atoms = AtomsKeyword,
|
|
Hubbard_U = HubbardUKeyword,
|
|
)
|
|
|
|
|
|
|
|
class RmgInputSpec(DevBase):
|
|
def __init__(self):
|
|
spec = raw_input_spec.strip()
|
|
|
|
blocks = spec.split('\n\n')
|
|
|
|
self.section_order = []
|
|
self.section_labels = obj()
|
|
self.section_contents = obj()
|
|
self.keywords = obj()
|
|
|
|
section = None
|
|
sec_cont = None
|
|
for b in blocks:
|
|
if ':' not in b:
|
|
b = b.strip().lower()
|
|
if b.endswith('options'):
|
|
sec_cont = []
|
|
section = b.replace(' options','').strip().replace(' ',' ').replace(' ','_')
|
|
self.section_order.append(section)
|
|
self.section_labels[section] = b
|
|
self.section_contents[section] = sec_cont
|
|
#end if
|
|
else:
|
|
k = RmgKeyword(b,section)
|
|
if k.key_type=='formatted':
|
|
if k.key_name not in formatted_keywords:
|
|
self.error('unrecognized formatted keyword: "{}"'.format(k.key_name))
|
|
#end if
|
|
k = formatted_keywords[k.key_name](b,section)
|
|
#end if
|
|
self.keywords[k.key_name] = k
|
|
sec_cont.append(k.key_name)
|
|
#end if
|
|
#end for
|
|
#end def __init__
|
|
#end class RmgInputSpec
|
|
|
|
input_spec = RmgInputSpec()
|
|
|
|
|
|
class RmgCalcModes(DevBase):
|
|
def __init__(self):
|
|
self.full_calc = obj(
|
|
scf = 'Quench Electrons',
|
|
exx = 'Exx Only',
|
|
neb = 'NEB Relax',
|
|
band = 'Band Structure Only',
|
|
relax = 'Relax Structure',
|
|
dimer_relax = 'Dimer Relax',
|
|
md_PE = 'Constant Pressure And Energy',
|
|
md_TE = 'Constant Temperature And Energy',
|
|
md_VE = 'Constant Volume And Energy',
|
|
tddft = 'TDDFT',
|
|
plot = 'Plot',
|
|
psi_plot = 'Psi Plot',
|
|
)
|
|
|
|
self.short_calc = obj()
|
|
for k,v in self.full_calc.items():
|
|
self.short_calc[v] = k
|
|
#end for
|
|
self.full_calc_modes = set(self.full_calc.values())
|
|
self.short_calc_modes = set(self.short_calc.values())
|
|
#end def __init__
|
|
|
|
def is_full_mode(self,mode):
|
|
return mode in self.full_calc_modes
|
|
#end def is_full_mode
|
|
|
|
def is_short_mode(self,mode):
|
|
return mode in self.short_calc_modes
|
|
#end def is_short_mode
|
|
|
|
def full_mode(self,short_mode):
|
|
mode = None
|
|
if short_mode in self.full_calc:
|
|
mode = self.full_calc[short_mode]
|
|
#end if
|
|
return mode
|
|
#end def full_mode
|
|
|
|
def short_mode(self,full_mode):
|
|
mode = None
|
|
if full_mode in self.short_calc:
|
|
mode = self.short_calc[full_mode]
|
|
#end if
|
|
return mode
|
|
#end def short_mode
|
|
|
|
def mode_match(self,text,short=False):
|
|
mode = None
|
|
text = text.lower()
|
|
for full_mode in self.full_calc_modes:
|
|
if full_mode.lower() in text:
|
|
if not short:
|
|
mode = full_mode
|
|
else:
|
|
mode = self.short_mode(full_mode)
|
|
#end if
|
|
break
|
|
#end if
|
|
#end for
|
|
return mode
|
|
#end def mode_match
|
|
|
|
#end class RmgCalcModes
|
|
|
|
rmg_modes = RmgCalcModes()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RmgInput(SimulationInput):
|
|
def __init__(self,filepath=None):
|
|
if filepath is not None:
|
|
self.read(filepath)
|
|
#end if
|
|
#end def __init__
|
|
|
|
|
|
def assign(self,**values):
|
|
unrecognized = []
|
|
for k,v in values.items():
|
|
if k in input_spec.keywords:
|
|
if isinstance(v,(str,np.string_)):
|
|
self[k] = input_spec.keywords[k].read(v)
|
|
else:
|
|
self[k] = input_spec.keywords[k].assign(v)
|
|
#end if
|
|
else:
|
|
unrecognized.append(k)
|
|
#end if
|
|
#end for
|
|
if len(unrecognized)>0:
|
|
unrec = obj(values).obj(unrecognized)
|
|
self.error('Unrecognized keywords encountered during assignment.\nUnrecognized keywords: {}\nCorresponding values:\n{}'.format(list(sorted(unrecognized)),unrec))
|
|
#end if
|
|
#end def assign
|
|
|
|
|
|
def read_text(self,contents,filepath=None):
|
|
# remove comments and whitespace
|
|
text = ''
|
|
for line in contents.splitlines():
|
|
i = line.find('#')
|
|
if i!=-1:
|
|
line = line[:i]
|
|
#end if
|
|
ls = line.strip()
|
|
if len(ls)>0:
|
|
text += ls+'\n'
|
|
#end if
|
|
#end for
|
|
text = text.strip()
|
|
|
|
# separate keywords and values
|
|
values = obj()
|
|
whitespace = ' \t\n'
|
|
icur = 0
|
|
k = 'some key'
|
|
while k is not None:
|
|
k = None
|
|
ie = text.find('=',icur)
|
|
if ie!=-1:
|
|
k = text[icur:ie].strip()
|
|
iv1 = text.find('"',ie)
|
|
if iv1!=-1:
|
|
iv2 = text.find('"',iv1+1)
|
|
if iv2!=-1:
|
|
v = text[iv1+1:iv2]
|
|
values[k] = v
|
|
icur = iv2+1
|
|
#end if
|
|
#end if
|
|
#end if
|
|
#end while
|
|
|
|
# read the keyword values, checking for unrecognized ones
|
|
self.assign(**values)
|
|
#end def read_text
|
|
|
|
|
|
def write_text(self,filepath=None):
|
|
if RmgInputSettings.check_on_write:
|
|
self.check_valid()
|
|
#end if
|
|
text = ''
|
|
for section_name in input_spec.section_order:
|
|
present = False
|
|
for k in input_spec.section_contents[section_name]:
|
|
if k in self:
|
|
if not present:
|
|
text += '\n\n# '+input_spec.section_labels[section_name]+'\n\n'
|
|
present = True
|
|
#end if
|
|
kw = input_spec.keywords[k]
|
|
text += '{:<22} = {}\n'.format(kw.key_name,kw.write(self[k]))
|
|
#end if
|
|
#end for
|
|
#end for
|
|
return text.lstrip()
|
|
#end def write_text
|
|
|
|
|
|
def check_valid(self,exit=True):
|
|
msg = ''
|
|
allowed = set(input_spec.keywords.keys())
|
|
present = set(self.keys())
|
|
unrecognized = present-allowed
|
|
if len(unrecognized)>0:
|
|
msg += 'Unrecognized keywords encountered.\n Unrecognized keywords: {}\n Valid keywords are: {}\n'.format(list(sorted(unrecognized)),list(sorted(allowed)))
|
|
#end if
|
|
recognized = present-unrecognized
|
|
for k in sorted(recognized):
|
|
kval,m = input_spec.keywords[k].valid(self[k],message=True)
|
|
if not kval:
|
|
msg += m+'\n'
|
|
#end if
|
|
#end if
|
|
if len(msg)>0 and exit:
|
|
self.log(msg)
|
|
self.error('Input is invalid.\nPlease see messages above for specific issues.')
|
|
#end if
|
|
return len(msg)==0
|
|
#end def check_valid
|
|
|
|
|
|
def is_valid(self):
|
|
return self.check_valid(exit=False)
|
|
#end def is_valid
|
|
|
|
|
|
def return_structure(self,units='B'):
|
|
axes = self.get('lattice_vector',None)
|
|
axes_unit = self.get('lattice_units','bohr')
|
|
lattice = self.get('bravais_lattice_type','orthorhombic primitive')
|
|
a = self.get('a_length',0.0)
|
|
b = self.get('b_length',0.0)
|
|
c = self.get('c_length',0.0)
|
|
|
|
coord_type = self.get('atomic_coordinate_type','absolute')
|
|
coord_unit = self.get('crds_units','bohr')
|
|
atom_data = self.get('atoms',obj())
|
|
atoms = atom_data.get('atoms',None)
|
|
positions = atom_data.get('positions',None)
|
|
|
|
unit_dict = dict(angstrom='A',bohr='B')
|
|
coord_unit = unit_dict[coord_unit.lower()]
|
|
axes_unit = unit_dict[axes_unit.lower()]
|
|
|
|
if axes is not None:
|
|
axes = np.array(axes,dtype=float)
|
|
else:
|
|
lattice_orig = lattice
|
|
lattice = lattice.lower()
|
|
if lattice=='cubic primitive':
|
|
axes = np.diag((a,a,a))
|
|
elif lattice=='tetragonal primitive':
|
|
axes = np.diag((a,a,c))
|
|
elif lattice=='orthorhombic primitive':
|
|
axes = np.diag((a,b,c))
|
|
elif lattice=='cubic body centered':
|
|
axes = 0.5*a*np.array([[ 1, 1,-1],
|
|
[-1, 1, 1],
|
|
[ 1,-1, 1]],dtype=float)
|
|
elif lattice=='cubic face centered':
|
|
axes = 0.5*a*np.array([[ 1, 1, 0],
|
|
[ 0, 1, 1],
|
|
[ 1, 0, 1]],dtype=float)
|
|
elif lattice=='hexagonal primitive':
|
|
axes = np.array([[ a, 0, 0],
|
|
[-a/2, np.sqrt(3)/2*a, 0],
|
|
[ 0, 0, c]],dtype=float)
|
|
else:
|
|
# cubic body centered, hexagonal primitive not yet supported
|
|
self.error('Structure extraction failed.\nLattice type "{}" is currently unsupported.'.format(lattice_orig))
|
|
#end if
|
|
#end if
|
|
axes = convert(axes,axes_unit,units)
|
|
|
|
if atoms is None or positions is None:
|
|
self.error('Structure extraction failed.\nEither atoms or positions could not be obtained.')
|
|
#end if
|
|
atoms = np.array(atoms,dtype=object)
|
|
positions = np.array(positions,dtype=float)
|
|
if coord_type.lower()=='cell relative':
|
|
positions = np.dot(positions,axes)
|
|
else:
|
|
positions = convert(positions,coord_unit,units)
|
|
#end if
|
|
|
|
s = generate_structure(
|
|
units = units,
|
|
axes = axes,
|
|
elem = atoms,
|
|
pos = positions,
|
|
)
|
|
|
|
return s
|
|
#end def return_structure
|
|
#end class RmgInput
|
|
|
|
|
|
|
|
|
|
def generate_rmg_input(**kwargs):
|
|
selector = kwargs.pop('input_type','generic')
|
|
if selector=='generic':
|
|
return generate_any_rmg_input(**kwargs)
|
|
else:
|
|
RmgInput.class_error('Input type "{}" has not been implemented for RMG input generation.'.format(selector))
|
|
#end if
|
|
#end def generate_rmg_input
|
|
|
|
|
|
|
|
generate_any_defaults = obj(
|
|
none = obj(),
|
|
basic = obj(
|
|
use_folded = True,
|
|
virtual_frac = 0.20,
|
|
),
|
|
#qmc = obj(
|
|
# use_folded = True,
|
|
# ),
|
|
)
|
|
|
|
def generate_any_rmg_input(**kwargs):
|
|
loc = 'generate_rmg_input'
|
|
|
|
# set default values
|
|
defaults = kwargs.pop('defaults','basic')
|
|
kw = obj(**kwargs)
|
|
kw.set_optional(generate_any_defaults[defaults])
|
|
|
|
# extract keywords not appearing in RMG input file
|
|
text = kw.delete_optional('text' , None )
|
|
wf_grid_spacing = kw.delete_optional('wf_grid_spacing', None )
|
|
pseudos = kw.delete_optional('pseudos' , None )
|
|
system = kw.delete_optional('system' , None )
|
|
copy_system = kw.delete_optional('copy_system' , True )
|
|
use_folded = kw.delete_optional('use_folded' , False )
|
|
virtual_frac = kw.delete_optional('virtual_frac' , None )
|
|
spin_polarized = kw.delete_optional('spin_polarized' , None )
|
|
default_units = kw.delete_optional('default_units' , 'bohr' )
|
|
|
|
default_units = dict(
|
|
a = 'angstrom',
|
|
b = 'bohr',
|
|
angstrom = 'angstrom',
|
|
bohr = 'bohr'
|
|
)[default_units.lower()]
|
|
|
|
rmg_units_map = obj(
|
|
angstrom = 'Angstrom',
|
|
bohr = 'Bohr',
|
|
alat = 'Alat',
|
|
a = 'Angstrom',
|
|
b = 'Bohr',
|
|
)
|
|
|
|
# generate RMG input
|
|
ri = RmgInput()
|
|
if text is not None:
|
|
ri.read_text(text)
|
|
#end if
|
|
ri.assign(**kw)
|
|
|
|
# incorporate pseudopotentials details provided via "pseudos"
|
|
if pseudos is not None:
|
|
species = []
|
|
pps = []
|
|
for ppname in pseudos:
|
|
label,element = pp_elem_label(ppname,guard=True)
|
|
species.append(element)
|
|
pps.append(ppname)
|
|
#end for
|
|
ri.pseudopotential = obj(
|
|
species = np.array(species),
|
|
pseudos = np.array(pps),
|
|
)
|
|
#end if
|
|
|
|
# incorporate system details, if provided
|
|
if system is not None:
|
|
|
|
# add system details
|
|
if copy_system:
|
|
system = system.copy()
|
|
#end if
|
|
if use_folded:
|
|
system = system.get_smallest()
|
|
#end if
|
|
system.check_folded_system()
|
|
system.update_particles()
|
|
|
|
# set atomic species, positions, magnetic moments and mobility
|
|
if 'atomic_coordinate_type' not in ri:
|
|
ri.atomic_coordinate_type = 'Absolute'
|
|
#end if
|
|
if 'crds_units' not in ri:
|
|
cu = default_units
|
|
|
|
else:
|
|
cu = ri.crds_units.lower()
|
|
#end if
|
|
if cu=='angstrom':
|
|
system.change_units('A')
|
|
elif cu=='bohr':
|
|
system.change_units('B')
|
|
else:
|
|
error('Invalid crds_units.\nExpected "Angstrom" or "Bohr".\nReceived: {}'.format(cu),loc)
|
|
#end if
|
|
rmg_length_units = rmg_units_map[cu]
|
|
if 'crd_units' not in ri and 'atomic_coordinate_type' in ri and ri.atomic_coordinate_type=='Absolute':
|
|
ri.crd_units = rmg_length_units
|
|
#end if
|
|
s = system.structure
|
|
elem = np.array(s.elem)
|
|
act = ri.atomic_coordinate_type.lower()
|
|
if act=='absolute':
|
|
pos = s.pos.copy()
|
|
elif act=='cell relative':
|
|
pos = s.pos_unit().copy()
|
|
else:
|
|
error('Invalid atomic_coordinate_type.\nExpected "Absolute" or "Cell Relative".\nReceived: {}'.format(cu),loc)
|
|
#end if
|
|
movable = None
|
|
if s.frozen is not None:
|
|
movable = ~s.is_frozen()
|
|
#end if
|
|
moments = None
|
|
if s.mag is not None:
|
|
moments = np.array(s.mag,dtype=float)
|
|
#end if
|
|
if movable is not None and moments is not None:
|
|
ri.atoms = obj(
|
|
format = 'movable_moment',
|
|
atoms = elem,
|
|
positions = pos,
|
|
movable = movable,
|
|
moments = moments,
|
|
)
|
|
elif movable is not None:
|
|
ri.atoms = obj(
|
|
format = 'movable',
|
|
atoms = elem,
|
|
positions = pos,
|
|
movable = movable,
|
|
)
|
|
else:
|
|
ri.atoms = obj(
|
|
format = 'basic',
|
|
atoms = elem,
|
|
positions = pos,
|
|
)
|
|
#end if
|
|
|
|
# set lattice vectors
|
|
if 'a_length' not in ri:
|
|
ri.lattice_units = rmg_length_units
|
|
ri.lattice_vector = s.axes.copy()
|
|
#end if
|
|
|
|
# set kpoints
|
|
if len(s.kpoints)>0 and 'kpoint_mesh' not in ri:
|
|
kpu = s.kpoints_unit()
|
|
ri.kpoints = obj(
|
|
kpoints = kpu.copy(),
|
|
weights = s.kweights.copy(),
|
|
)
|
|
if 'kpoint_is_shift' in ri:
|
|
del ri.kpoint_is_shift
|
|
#end if
|
|
#end if
|
|
|
|
# set wavefunction grid
|
|
if wf_grid_spacing is not None:
|
|
wf_grid = []
|
|
for a in system.structure.axes:
|
|
g = int(np.ceil(np.linalg.norm(a)/wf_grid_spacing))
|
|
wf_grid.append(g)
|
|
#end for
|
|
ri.assign(wavefunction_grid=wf_grid)
|
|
#end if
|
|
|
|
if spin_polarized is None and 'noncollinear' not in ri:
|
|
spin_polarized = system.spin_polarized_orbitals()
|
|
elif spin_polarized is None and 'noncollinear' in ri:
|
|
if not ri.noncollinear:
|
|
spin_polarized = system.spin_polarized_orbitals()
|
|
#end if
|
|
#end if
|
|
|
|
# set occupations
|
|
has_states = False
|
|
has_states |= 'states_count_and_occupation' in ri
|
|
has_states |= 'states_count_and_occupation_up' in ri and 'states_count_and_occupation_down' in ri
|
|
if not has_states and virtual_frac is not None:
|
|
states_keys = [
|
|
'states_count_and_occupation',
|
|
'states_count_and_occupation_up',
|
|
'states_count_and_occupation_down',
|
|
]
|
|
for k in states_keys:
|
|
if k in ri:
|
|
del ri[k]
|
|
#end if
|
|
#end for
|
|
nup,ndn = system.particles.electron_counts()
|
|
nvirt = int(np.ceil(virtual_frac*max(nup,ndn)))
|
|
nptot = max(nup,ndn) + nvirt
|
|
nup_virt = nptot-nup
|
|
ndn_virt = nptot-ndn
|
|
if nup==ndn and not spin_polarized:
|
|
occ_up = '{} 2.0 {} 0.0'.format(nup,nup_virt)
|
|
ri.states_count_and_occupation = occ_up
|
|
else:
|
|
occ_up = '{} 1.0 {} 0.0'.format(nup,nup_virt)
|
|
occ_dn = '{} 1.0 {} 0.0'.format(ndn,ndn_virt)
|
|
ri.states_count_and_occupation_spin_up = occ_up
|
|
ri.states_count_and_occupation_spin_down = occ_dn
|
|
#end if
|
|
#end if
|
|
|
|
#end if
|
|
|
|
if spin_polarized is not None and spin_polarized:
|
|
if 'states_count_and_occupation_spin_up' not in ri:
|
|
error('System is spin polarized, but occupations not provided for up and down spins.',loc)
|
|
#end if
|
|
#end if
|
|
|
|
return ri
|
|
#end def generate_any_rmg_input
|