csr matrices in terms of pao basis.

svn-origin-rev: 18394
This commit is contained in:
Hossein Banihashemian 2018-04-24 08:16:40 +00:00
parent d6bf8bf07a
commit 107a7acd2e
4 changed files with 176 additions and 8 deletions

View file

@ -126,6 +126,7 @@ CONTAINS
! parse the ls_scf section and set derived quantities
CALL ls_scf_init_read_write_input(input, ls_scf_env, unit_nr)
dft_control%qs_control%pao = ls_scf_env%do_pao
! set up the buffer for the history of matrices
ls_scf_env%scf_history%nstore = ls_scf_env%extrapolation_order

View file

@ -15,14 +15,21 @@ MODULE pao_io
USE cp_files, ONLY: close_file,&
open_file
USE cp_log_handling, ONLY: cp_get_default_logger,&
cp_logger_get_default_io_unit,&
cp_logger_type
USE cp_output_handling, ONLY: cp_print_key_finished_output,&
USE cp_output_handling, ONLY: cp_p_file,&
cp_print_key_finished_output,&
cp_print_key_should_output,&
cp_print_key_unit_nr
USE cp_para_types, ONLY: cp_para_env_type
USE dbcsr_api, ONLY: dbcsr_get_block_p,&
dbcsr_get_info,&
dbcsr_type
USE input_section_types, ONLY: section_vals_type
USE dbcsr_api, ONLY: &
convert_dbcsr_to_csr, csr_create_from_dbcsr, csr_dbcsr_blkrow_dist, csr_destroy, csr_type, &
csr_write, dbcsr_copy, dbcsr_desymmetrize, dbcsr_get_block_p, dbcsr_get_info, &
dbcsr_has_symmetry, dbcsr_release, dbcsr_type
USE dm_ls_scf_types, ONLY: ls_scf_env_type
USE input_section_types, ONLY: section_vals_get_subs_vals,&
section_vals_type,&
section_vals_val_get
USE kinds, ONLY: default_path_length,&
default_string_length,&
dp
@ -50,6 +57,7 @@ MODULE pao_io
PUBLIC :: pao_read_restart, pao_write_restart
PUBLIC :: pao_read_raw, pao_kinds_ensure_equal
PUBLIC :: pao_ioblock_type, pao_iokind_type
PUBLIC :: pao_write_ks_matrix_csr, pao_write_s_matrix_csr
! data types used by pao_read_raw()
TYPE pao_ioblock_type
@ -548,4 +556,153 @@ CONTAINS
END SUBROUTINE write_restart_header
!**************************************************************************************************
!> \brief writing the KS matrix (in terms of the PAO basis) in csr format into a file
!> \param qs_env qs environment
!> \param ls_scf_env ls environment
!> \author Mohammad Hossein Bani-Hashemian
! **************************************************************************************************
SUBROUTINE pao_write_ks_matrix_csr(qs_env, ls_scf_env)
TYPE(qs_environment_type), POINTER :: qs_env
TYPE(ls_scf_env_type), TARGET :: ls_scf_env
CHARACTER(len=*), PARAMETER :: routineN = 'pao_write_ks_matrix_csr', &
routineP = moduleN//':'//routineN
CHARACTER(LEN=default_path_length) :: file_name, fileformat
INTEGER :: handle, ispin, output_unit, unit_nr
LOGICAL :: bin, do_kpoints, do_ks_csr_write, uptr
REAL(KIND=dp) :: thld
TYPE(cp_logger_type), POINTER :: logger
TYPE(csr_type) :: ks_mat_csr
TYPE(dbcsr_type) :: matrix_ks_nosym
TYPE(section_vals_type), POINTER :: dft_section, input
CALL timeset(routineN, handle)
NULLIFY (dft_section)
logger => cp_get_default_logger()
output_unit = cp_logger_get_default_io_unit(logger)
CALL get_qs_env(qs_env, input=input)
dft_section => section_vals_get_subs_vals(input, "DFT")
do_ks_csr_write = BTEST(cp_print_key_should_output(logger%iter_info, dft_section, &
"PRINT%KS_CSR_WRITE"), cp_p_file)
! NOTE: k-points has to be treated differently later. k-points has KS matrix as double pointer.
CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints)
IF (do_ks_csr_write .AND. (.NOT. do_kpoints)) THEN
CALL section_vals_val_get(dft_section, "PRINT%KS_CSR_WRITE%THRESHOLD", r_val=thld)
CALL section_vals_val_get(dft_section, "PRINT%KS_CSR_WRITE%UPPER_TRIANGULAR", l_val=uptr)
CALL section_vals_val_get(dft_section, "PRINT%KS_CSR_WRITE%BINARY", l_val=bin)
IF (bin) THEN
fileformat = "UNFORMATTED"
ELSE
fileformat = "FORMATTED"
END IF
DO ispin = 1, SIZE(ls_scf_env%matrix_ks)
IF (dbcsr_has_symmetry(ls_scf_env%matrix_ks(ispin))) THEN
CALL dbcsr_desymmetrize(ls_scf_env%matrix_ks(ispin), matrix_ks_nosym)
ELSE
CALL dbcsr_copy(matrix_ks_nosym, ls_scf_env%matrix_ks(ispin))
END IF
CALL csr_create_from_dbcsr(matrix_ks_nosym, ks_mat_csr, csr_dbcsr_blkrow_dist)
CALL convert_dbcsr_to_csr(matrix_ks_nosym, ks_mat_csr)
WRITE (file_name, '(A,I0)') "PAO_KS_SPIN_", ispin
unit_nr = cp_print_key_unit_nr(logger, dft_section, "PRINT%KS_CSR_WRITE", &
extension=".csr", middle_name=TRIM(file_name), &
file_status="REPLACE", file_form=fileformat)
CALL csr_write(ks_mat_csr, unit_nr, upper_triangle=uptr, threshold=thld, binary=bin)
CALL cp_print_key_finished_output(unit_nr, logger, dft_section, "PRINT%KS_CSR_WRITE")
CALL csr_destroy(ks_mat_csr)
CALL dbcsr_release(matrix_ks_nosym)
END DO
END IF
CALL timestop(handle)
END SUBROUTINE pao_write_ks_matrix_csr
!**************************************************************************************************
!> \brief writing the overlap matrix (in terms of the PAO basis) in csr format into a file
!> \param qs_env qs environment
!> \param ls_scf_env ls environment
!> \author Mohammad Hossein Bani-Hashemian
! **************************************************************************************************
SUBROUTINE pao_write_s_matrix_csr(qs_env, ls_scf_env)
TYPE(qs_environment_type), POINTER :: qs_env
TYPE(ls_scf_env_type), TARGET :: ls_scf_env
CHARACTER(len=*), PARAMETER :: routineN = 'pao_write_s_matrix_csr', &
routineP = moduleN//':'//routineN
CHARACTER(LEN=default_path_length) :: file_name, fileformat
INTEGER :: handle, output_unit, unit_nr
LOGICAL :: bin, do_kpoints, do_s_csr_write, uptr
REAL(KIND=dp) :: thld
TYPE(cp_logger_type), POINTER :: logger
TYPE(csr_type) :: s_mat_csr
TYPE(dbcsr_type) :: matrix_s_nosym
TYPE(section_vals_type), POINTER :: dft_section, input
CALL timeset(routineN, handle)
NULLIFY (dft_section)
logger => cp_get_default_logger()
output_unit = cp_logger_get_default_io_unit(logger)
CALL get_qs_env(qs_env, input=input)
dft_section => section_vals_get_subs_vals(input, "DFT")
do_s_csr_write = BTEST(cp_print_key_should_output(logger%iter_info, dft_section, &
"PRINT%S_CSR_WRITE"), cp_p_file)
! NOTE: k-points has to be treated differently later. k-points has overlap matrix as double pointer.
CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints)
IF (do_s_csr_write .AND. (.NOT. do_kpoints)) THEN
CALL section_vals_val_get(dft_section, "PRINT%S_CSR_WRITE%THRESHOLD", r_val=thld)
CALL section_vals_val_get(dft_section, "PRINT%S_CSR_WRITE%UPPER_TRIANGULAR", l_val=uptr)
CALL section_vals_val_get(dft_section, "PRINT%S_CSR_WRITE%BINARY", l_val=bin)
IF (bin) THEN
fileformat = "UNFORMATTED"
ELSE
fileformat = "FORMATTED"
END IF
IF (dbcsr_has_symmetry(ls_scf_env%matrix_s)) THEN
CALL dbcsr_desymmetrize(ls_scf_env%matrix_s, matrix_s_nosym)
ELSE
CALL dbcsr_copy(matrix_s_nosym, ls_scf_env%matrix_s)
END IF
CALL csr_create_from_dbcsr(matrix_s_nosym, s_mat_csr, csr_dbcsr_blkrow_dist)
CALL convert_dbcsr_to_csr(matrix_s_nosym, s_mat_csr)
WRITE (file_name, '(A,I0)') "PAO_S"
unit_nr = cp_print_key_unit_nr(logger, dft_section, "PRINT%S_CSR_WRITE", &
extension=".csr", middle_name=TRIM(file_name), &
file_status="REPLACE", file_form=fileformat)
CALL csr_write(s_mat_csr, unit_nr, upper_triangle=uptr, threshold=thld, binary=bin)
CALL cp_print_key_finished_output(unit_nr, logger, dft_section, "PRINT%S_CSR_WRITE")
CALL csr_destroy(s_mat_csr)
CALL dbcsr_release(matrix_s_nosym)
END IF
CALL timestop(handle)
END SUBROUTINE pao_write_s_matrix_csr
END MODULE pao_io

View file

@ -29,7 +29,9 @@ MODULE pao_main
USE machine, ONLY: m_walltime
USE pao_input, ONLY: parse_pao_section
USE pao_io, ONLY: pao_read_restart,&
pao_write_restart
pao_write_ks_matrix_csr,&
pao_write_restart,&
pao_write_s_matrix_csr
USE pao_methods, ONLY: &
pao_add_forces, pao_build_core_hamiltonian, pao_build_diag_distribution, &
pao_build_matrix_X, pao_build_orthogonalizer, pao_build_selector, pao_calc_energy, &
@ -333,6 +335,11 @@ CONTAINS
CALL timeset(routineN, handle)
! print out the matrices here before pao_store_P converts them back into matrices in
! terms of the primary basis
CALL pao_write_ks_matrix_csr(qs_env, ls_scf_env)
CALL pao_write_s_matrix_csr(qs_env, ls_scf_env)
CALL pao_store_P(qs_env, ls_scf_env)
IF (ls_scf_env%calculate_forces) CALL pao_add_forces(qs_env, ls_scf_env)

View file

@ -2834,8 +2834,11 @@ CONTAINS
END IF
! write csr matrices
CALL write_ks_matrix_csr(qs_env, input)
CALL write_s_matrix_csr(qs_env, input)
! matrices in terms of the PAO basis will be taken care of in pao_post_scf.
IF (.NOT. dft_control%qs_control%pao) THEN
CALL write_ks_matrix_csr(qs_env, input)
CALL write_s_matrix_csr(qs_env, input)
END IF
! write adjacency matrix
CALL write_adjacency_matrix(qs_env, input)