Skip to content

mod_abstract_iterative_charge_equilibration

Lines: 198 | Visibility: private

Implementation of an iterative QeQ solver. author: Jonas A. Finkler, Moritz Gubler.

Dependencies

Uses

module~~mod_abstract_iterative_charge_equilibration~~UsesGraph module~mod_abstract_iterative_charge_equilibration mod_abstract_iterative_charge_equilibration module~mod_abstract_charge_equilibration mod_abstract_charge_equilibration module~mod_abstract_iterative_charge_equilibration->module~mod_abstract_charge_equilibration module~mod_abstract_electrostatics mod_abstract_electrostatics module~mod_abstract_iterative_charge_equilibration->module~mod_abstract_electrostatics module~mod_io mod_io module~mod_abstract_iterative_charge_equilibration->module~mod_io module~mod_pair_electrostatics mod_pair_electrostatics module~mod_abstract_iterative_charge_equilibration->module~mod_pair_electrostatics module~mod_precision mod_precision module~mod_abstract_iterative_charge_equilibration->module~mod_precision module~mod_throw mod_throw module~mod_abstract_iterative_charge_equilibration->module~mod_throw module~mod_abstract_charge_equilibration->module~mod_abstract_electrostatics module~mod_abstract_charge_equilibration->module~mod_precision module~mod_periodic_table mod_periodic_table module~mod_abstract_charge_equilibration->module~mod_periodic_table module~mod_structures mod_structures module~mod_abstract_charge_equilibration->module~mod_structures module~mod_abstract_electrostatics->module~mod_precision module~mod_abstract_electrostatics->module~mod_structures module~mod_io->module~mod_precision iso_fortran_env iso_fortran_env module~mod_io->iso_fortran_env module~mod_optional_args mod_optional_args module~mod_io->module~mod_optional_args module~mod_pair_electrostatics->module~mod_abstract_electrostatics module~mod_pair_electrostatics->module~mod_precision module~mod_pair_electrostatics->module~mod_throw module~mod_constants mod_constants module~mod_pair_electrostatics->module~mod_constants iso_c_binding iso_c_binding module~mod_precision->iso_c_binding module~mod_precision->iso_fortran_env module~mod_throw->module~mod_io module~mod_throw->module~mod_precision module~mod_throw->iso_c_binding module~mod_throw->iso_fortran_env module~mod_mpi mod_mpi module~mod_throw->module~mod_mpi module~mod_sort mod_sort module~mod_throw->module~mod_sort module~mod_constants->module~mod_precision module~mod_constants->iso_c_binding module~mod_mpi->module~mod_precision mpi_f08 mpi_f08 module~mod_mpi->mpi_f08 module~mod_periodic_table->module~mod_io module~mod_periodic_table->module~mod_precision module~mod_periodic_table->module~mod_throw module~mod_periodic_table->module~mod_constants module~mod_array_helpers mod_array_helpers module~mod_periodic_table->module~mod_array_helpers module~mod_sort->module~mod_precision module~mod_structures->module~mod_precision module~mod_structures->module~mod_throw module~mod_structures->module~mod_constants module~mod_structures->module~mod_mpi module~mod_structures->module~mod_periodic_table module~mod_structures->module~mod_array_helpers module~mod_linalg mod_linalg module~mod_structures->module~mod_linalg module~mod_structures_helper mod_structures_helper module~mod_structures->module~mod_structures_helper module~mod_array_helpers->module~mod_precision module~mod_array_helpers->module~mod_throw module~mod_linalg->module~mod_precision module~mod_linalg->module~mod_throw module~cublas_wrapper cublas_wrapper module~mod_linalg->module~cublas_wrapper module~mod_settings mod_settings module~mod_linalg->module~mod_settings module~mod_structures_helper->module~mod_precision module~mod_structures_helper->module~mod_linalg module~cublas_wrapper->iso_c_binding module~cublas_wrapper->module~mod_settings module~mod_settings->module~mod_io module~mod_settings->module~mod_precision module~mod_settings->module~mod_throw module~mod_settings->module~mod_constants module~mod_settings->module~mod_periodic_table module~mod_cpu_vendor mod_cpu_vendor module~mod_settings->module~mod_cpu_vendor module~mod_cpu_vendor->iso_c_binding

Used By

module~~mod_abstract_iterative_charge_equilibration~~UsedByGraph module~mod_abstract_iterative_charge_equilibration mod_abstract_iterative_charge_equilibration module~mod_iterative_charge_equilibration_cg mod_iterative_charge_equilibration_cg module~mod_iterative_charge_equilibration_cg->module~mod_abstract_iterative_charge_equilibration module~mod_iterative_charge_equilibration_sqnm mod_iterative_charge_equilibration_sqnm module~mod_iterative_charge_equilibration_sqnm->module~mod_abstract_iterative_charge_equilibration module~mod_initialize mod_initialize module~mod_initialize->module~mod_iterative_charge_equilibration_cg module~mod_initialize->module~mod_iterative_charge_equilibration_sqnm module~mod_predict_mode mod_predict_mode module~mod_predict_mode->module~mod_initialize module~mod_write_outfiles mod_write_outfiles module~mod_predict_mode->module~mod_write_outfiles module~mod_runner_interface_bindings mod_runner_interface_bindings module~mod_runner_interface_bindings->module~mod_initialize module~mod_train_energy_multiple_structures mod_train_energy_multiple_structures module~mod_train_energy_multiple_structures->module~mod_initialize module~mod_train_forces_multiple_structures mod_train_forces_multiple_structures module~mod_train_forces_multiple_structures->module~mod_initialize module~mod_train_forces_multiple_structures->module~mod_train_energy_multiple_structures module~mod_train_loop_4g_charges mod_train_loop_4g_charges module~mod_train_loop_4g_charges->module~mod_initialize module~mod_cost_calculator mod_cost_calculator module~mod_train_loop_4g_charges->module~mod_cost_calculator module~mod_output_files_and_cost_4g_charges mod_output_files_and_cost_4g_charges module~mod_train_loop_4g_charges->module~mod_output_files_and_cost_4g_charges module~mod_train_loop_atomic_property mod_train_loop_atomic_property module~mod_train_loop_atomic_property->module~mod_initialize module~mod_train_loop_atomic_property->module~mod_cost_calculator module~mod_output_files_and_cost mod_output_files_and_cost module~mod_train_loop_atomic_property->module~mod_output_files_and_cost module~mod_train_loop_short_range mod_train_loop_short_range module~mod_train_loop_short_range->module~mod_initialize module~mod_train_loop_short_range->module~mod_train_energy_multiple_structures module~mod_train_loop_short_range->module~mod_train_forces_multiple_structures module~mod_train_loop_short_range->module~mod_cost_calculator module~mod_train_loop_short_range->module~mod_output_files_and_cost module~mod_output_files_and_cost_4g_short_range mod_output_files_and_cost_4g_short_range module~mod_train_loop_short_range->module~mod_output_files_and_cost_4g_short_range module~mod_train_mode mod_train_mode module~mod_train_mode->module~mod_initialize module~mod_train_mode->module~mod_train_loop_4g_charges module~mod_train_mode->module~mod_train_loop_atomic_property module~mod_train_mode->module~mod_train_loop_short_range module~mod_write_outfiles_training mod_write_outfiles_training module~mod_train_mode->module~mod_write_outfiles_training module~mod_write_outfiles->module~mod_initialize program~runner RuNNer program~runner->module~mod_initialize program~runner->module~mod_predict_mode program~runner->module~mod_train_mode module~mod_lammps_interface mod_lammps_interface module~mod_lammps_interface->module~mod_runner_interface_bindings module~mod_write_outfiles_training->module~mod_write_outfiles module~mod_cost_calculator->module~mod_write_outfiles_training module~mod_output_files_and_cost->module~mod_cost_calculator module~mod_output_files_and_cost_4g_charges->module~mod_cost_calculator module~mod_output_files_and_cost_4g_short_range->module~mod_cost_calculator

Module Variables

  • MAX_ITER : integer
  • PRECONDITION : logical

Derived Types Summary

Name Description
AbstractIterativeChargeEquilibrator

Procedures Summary

Name Type Description
constrain_x Function
constrain_df_dx Function
max_grad_norm Function calculates norm of constrained gradient.
get_preconditioner Function Computes a preconditioner (diagonal of the matrix) by approximating the diagonal of the A matrix.
initialize_iterative Subroutine
solve_linear_system_iterative Subroutine
calc_f_and_df_dx Subroutine Computes the function to be minimized and its derivative. Also applies the constraint.
calc_a_times_vector Subroutine Computes A times a vector for a search direction. This is used to compute A*d where d is a...
make_initial_charge_guess_iterative_solver Subroutine makes an initial guess for the charges
make_initial_guess Subroutine makes an initial guess for any equation system (involving A) using the preconditioner

Derived Types Details

type AbstractIterativeChargeEquilibrator

Components

Type-Bound Procedures

Name Attributes Binding
initialize_private public ⇒ initialize_private
compute_charges public ⇒ compute_charges
compute_dcharge_delectronegativity public ⇒ compute_dcharge_delectronegativity
compute_dcharge_dhardness public ⇒ compute_dcharge_dhardness
set_hardness public ⇒ set_hardness
set_charges public ⇒ set_charges
get_lagrange_charges public ⇒ get_lagrange_charges
update_structure public ⇒ update_structure
initialize public ⇒ initialize_iterative
solve_linear_system public ⇒ solve_linear_system_iterative
make_initial_charge_guess public ⇒ make_initial_charge_guess_iterative_solver
make_initial_guess public ⇒ make_initial_guess
get_preconditioner private ⇒ get_preconditioner
max_grad_norm private ⇒ max_grad_norm
calc_f_and_df_dx public ⇒ calc_f_and_df_dx
calc_a_times_vector public ⇒ calc_a_times_vector
constrain_x public ⇒ constrain_x
constrain_df_dx public ⇒ constrain_df_dx
initial_iteration public ⇒ initial_iteration
iteration public ⇒ iteration

Inherits

type~~abstractiterativechargeequilibrator~~InheritsGraph type~abstractiterativechargeequilibrator AbstractIterativeChargeEquilibrator type~abstractchargeequilibrator AbstractChargeEquilibrator type~abstractiterativechargeequilibrator->type~abstractchargeequilibrator type~abstractelectrostaticscalculator AbstractElectrostaticsCalculator type~abstractchargeequilibrator->type~abstractelectrostaticscalculator elec_calc

Inherited By

type~~abstractiterativechargeequilibrator~~InheritedByGraph type~abstractiterativechargeequilibrator AbstractIterativeChargeEquilibrator type~iterativecgchargeequilibrator IterativeCgChargeEquilibrator type~iterativecgchargeequilibrator->type~abstractiterativechargeequilibrator type~iterativesqnmchargeequilibrator IterativeSQNMChargeEquilibrator type~iterativesqnmchargeequilibrator->type~abstractiterativechargeequilibrator

Interface Details

interface abstract_initial_iteration


interface abstract_iteration


Procedure Details

function constrain_x

function constrain_x( &
    self, &
    x, &
    sum_x &
)

Arguments

Called By

proc~~constrain_x~~CalledByGraph proc~constrain_x mod_abstract_iterative_charge_equilibration::AbstractIterativeChargeEquilibrator%constrain_x proc~calc_a_times_vector mod_abstract_iterative_charge_equilibration::AbstractIterativeChargeEquilibrator%calc_a_times_vector proc~calc_a_times_vector->proc~constrain_x proc~calc_f_and_df_dx mod_abstract_iterative_charge_equilibration::AbstractIterativeChargeEquilibrator%calc_f_and_df_dx proc~calc_f_and_df_dx->proc~constrain_x proc~solve_linear_system_iterative mod_abstract_iterative_charge_equilibration::AbstractIterativeChargeEquilibrator%solve_linear_system_iterative proc~solve_linear_system_iterative->proc~constrain_x proc~sqnm_iteration mod_iterative_charge_equilibration_sqnm::IterativeSQNMChargeEquilibrator%sqnm_iteration proc~sqnm_iteration->proc~constrain_x proc~sqnm_iteration->proc~calc_f_and_df_dx proc~cg_initial_iteration mod_iterative_charge_equilibration_cg::IterativeCgChargeEquilibrator%cg_initial_iteration proc~cg_initial_iteration->proc~calc_f_and_df_dx proc~cg_iteration mod_iterative_charge_equilibration_cg::IterativeCgChargeEquilibrator%cg_iteration proc~cg_iteration->proc~calc_a_times_vector proc~sqnm_initial_iteration mod_iterative_charge_equilibration_sqnm::IterativeSQNMChargeEquilibrator%sqnm_initial_iteration proc~sqnm_initial_iteration->proc~calc_f_and_df_dx

function constrain_df_dx

function constrain_df_dx( &
    self, &
    df_dx &
)

Arguments

Called By

proc~~constrain_df_dx~~CalledByGraph proc~constrain_df_dx mod_abstract_iterative_charge_equilibration::AbstractIterativeChargeEquilibrator%constrain_df_dx proc~cg_initial_iteration mod_iterative_charge_equilibration_cg::IterativeCgChargeEquilibrator%cg_initial_iteration proc~cg_initial_iteration->proc~constrain_df_dx proc~cg_iteration mod_iterative_charge_equilibration_cg::IterativeCgChargeEquilibrator%cg_iteration proc~cg_iteration->proc~constrain_df_dx proc~max_grad_norm mod_abstract_iterative_charge_equilibration::AbstractIterativeChargeEquilibrator%max_grad_norm proc~max_grad_norm->proc~constrain_df_dx proc~sqnm_initial_iteration mod_iterative_charge_equilibration_sqnm::IterativeSQNMChargeEquilibrator%sqnm_initial_iteration proc~sqnm_initial_iteration->proc~constrain_df_dx proc~sqnm_iteration mod_iterative_charge_equilibration_sqnm::IterativeSQNMChargeEquilibrator%sqnm_iteration proc~sqnm_iteration->proc~constrain_df_dx proc~solve_linear_system_iterative mod_abstract_iterative_charge_equilibration::AbstractIterativeChargeEquilibrator%solve_linear_system_iterative proc~solve_linear_system_iterative->proc~max_grad_norm

function max_grad_norm

function max_grad_norm( &
    self, &
    df_dx &
)

calculates norm of constrained gradient.

Arguments

Called By

proc~~max_grad_norm~~CalledByGraph proc~max_grad_norm mod_abstract_iterative_charge_equilibration::AbstractIterativeChargeEquilibrator%max_grad_norm proc~solve_linear_system_iterative mod_abstract_iterative_charge_equilibration::AbstractIterativeChargeEquilibrator%solve_linear_system_iterative proc~solve_linear_system_iterative->proc~max_grad_norm

function get_preconditioner

function get_preconditioner( &
    self &
)

Computes a preconditioner (diagonal of the matrix) by approximating the diagonal of the A matrix.

Arguments

Called By

proc~~get_preconditioner~~CalledByGraph proc~get_preconditioner mod_abstract_iterative_charge_equilibration::AbstractIterativeChargeEquilibrator%get_preconditioner proc~make_initial_guess mod_abstract_iterative_charge_equilibration::AbstractIterativeChargeEquilibrator%make_initial_guess proc~make_initial_guess->proc~get_preconditioner proc~solve_linear_system_iterative mod_abstract_iterative_charge_equilibration::AbstractIterativeChargeEquilibrator%solve_linear_system_iterative proc~solve_linear_system_iterative->proc~get_preconditioner proc~make_initial_charge_guess_iterative_solver mod_abstract_iterative_charge_equilibration::AbstractIterativeChargeEquilibrator%make_initial_charge_guess_iterative_solver proc~make_initial_charge_guess_iterative_solver->proc~make_initial_guess

subroutine initialize_iterative

subroutine initialize_iterative( &
    self, &
    num_atoms, &
    lperiodic, &
    pos, &
    lat, &
    elec_calc, &
    atomic_sigmas, &
    iter_tol, &
    electro_precision &
)

Arguments

  • self : class(AbstractIterativeChargeEquilibrator) [out]
  • num_atoms : integer [in]
  • lperiodic : logical [in]
  • pos : real(DP) (dim: (3,num_atoms)) [in]
  • lat : real(DP) (dim: (3,3)) [in]
  • elec_calc : class(AbstractElectrostaticsCalculator) [in]
  • atomic_sigmas : real(DP) (dim: (num_atoms)) [in]
  • iter_tol : real(DP) [in]
  • electro_precision : real(DP) [in]

subroutine solve_linear_system_iterative

subroutine solve_linear_system_iterative( &
    self, &
    rhs, &
    sum_x, &
    x &
)

Arguments


subroutine calc_f_and_df_dx

subroutine calc_f_and_df_dx( &
    self, &
    rhs, &
    x, &
    sum_x, &
    f_of_x, &
    df_dx, &
    a_times_x &
)

Computes the function to be minimized and its derivative. Also applies the constraint.

Arguments

  • self : class(AbstractIterativeChargeEquilibrator)
  • rhs : real(DP) (dim: (self%nat)) [in]
  • x : real(DP) (dim: (self%nat)) [inout]
  • sum_x : real(DP) [in]
  • f_of_x : real(DP) [out]
  • df_dx : real(DP) (dim: (self%nat)) [out]
  • a_times_x : real(DP) (dim: (self%nat)) [out]

Called By

proc~~calc_f_and_df_dx~~CalledByGraph proc~calc_f_and_df_dx mod_abstract_iterative_charge_equilibration::AbstractIterativeChargeEquilibrator%calc_f_and_df_dx proc~cg_initial_iteration mod_iterative_charge_equilibration_cg::IterativeCgChargeEquilibrator%cg_initial_iteration proc~cg_initial_iteration->proc~calc_f_and_df_dx proc~sqnm_initial_iteration mod_iterative_charge_equilibration_sqnm::IterativeSQNMChargeEquilibrator%sqnm_initial_iteration proc~sqnm_initial_iteration->proc~calc_f_and_df_dx proc~sqnm_iteration mod_iterative_charge_equilibration_sqnm::IterativeSQNMChargeEquilibrator%sqnm_iteration proc~sqnm_iteration->proc~calc_f_and_df_dx

subroutine calc_a_times_vector

subroutine calc_a_times_vector( &
    self, &
    vector, &
    a_times_vector &
)

Computes A times a vector for a search direction. This is used to compute Ad where d is a search direction that should be tangent to the constraint manifold (sum(dc) = 0). Unlike calc_f_and_df_dx, this constrains to sum=0, not to sum=sum_x.

Arguments

Called By

proc~~calc_a_times_vector~~CalledByGraph proc~calc_a_times_vector mod_abstract_iterative_charge_equilibration::AbstractIterativeChargeEquilibrator%calc_a_times_vector proc~cg_iteration mod_iterative_charge_equilibration_cg::IterativeCgChargeEquilibrator%cg_iteration proc~cg_iteration->proc~calc_a_times_vector

subroutine make_initial_charge_guess_iterative_solver

subroutine make_initial_charge_guess_iterative_solver( &
    self, &
    electronegativities, &
    total_charge &
)

makes an initial guess for the charges

Arguments


subroutine make_initial_guess

subroutine make_initial_guess( &
    self, &
    rhs, &
    sum_x, &
    x &
)

makes an initial guess for any equation system (involving A) using the preconditioner

Arguments

Called By

proc~~make_initial_guess~~CalledByGraph proc~make_initial_guess mod_abstract_iterative_charge_equilibration::AbstractIterativeChargeEquilibrator%make_initial_guess proc~make_initial_charge_guess_iterative_solver mod_abstract_iterative_charge_equilibration::AbstractIterativeChargeEquilibrator%make_initial_charge_guess_iterative_solver proc~make_initial_charge_guess_iterative_solver->proc~make_initial_guess