tagarray - Open-Quantum-Platform/openqp GitHub Wiki
Dynamic memory allocations and deallocations are often required during runtime for efficient memory usage, especially when handling large data structures like the Fock matrix. Managing this across different layers can be challenging. To address this, a separate project called "TagArray" has been developed, as illustrated in Fig. below. TagArray enables any layer within the structure to allocate or deallocate dynamic memory using a Tag, which is a simple text string.
In the context of OpenQP, tagarrays
are utilized to manage and exchange data within the platform. Below is the list of predefined tagarrays
for OpenQP, as defined in source/tagarray_driver.F90
:
character(len=*), parameter, public :: OQP_prefix = "OQP::"
! Density matrices and Fock matrices
character(len=*), parameter, public :: OQP_DM_A = OQP_prefix // "DM_A"
character(len=*), parameter, public :: OQP_DM_B = OQP_prefix // "DM_B"
character(len=*), parameter, public :: OQP_FOCK_A = OQP_prefix // "FOCK_A"
character(len=*), parameter, public :: OQP_FOCK_B = OQP_prefix // "FOCK_B"
! Molecular orbital energies and vectors
character(len=*), parameter, public :: OQP_E_MO_A = OQP_prefix // "E_MO_A"
character(len=*), parameter, public :: OQP_E_MO_B = OQP_prefix // "E_MO_B"
character(len=*), parameter, public :: OQP_VEC_MO_A = OQP_prefix // "VEC_MO_A"
character(len=*), parameter, public :: OQP_VEC_MO_B = OQP_prefix // "VEC_MO_B"
! Core Hamiltonian and various matrices
character(len=*), parameter, public :: OQP_Hcore = OQP_prefix // "Hcore"
character(len=*), parameter, public :: OQP_SM = OQP_prefix // "SM"
character(len=*), parameter, public :: OQP_TM = OQP_prefix // "TM"
character(len=*), parameter, public :: OQP_XINTS = OQP_prefix // "XINTS"
character(len=*), parameter, public :: OQP_WAO = OQP_prefix // "WAO"
! Time-dependent calculations and related data
character(len=*), parameter, public :: OQP_td_abxc = OQP_prefix // "td_abxc"
character(len=*), parameter, public :: OQP_td_bvec_mo = OQP_prefix // "td_bvec_mo"
character(len=*), parameter, public :: OQP_td_mrsf_density = OQP_prefix // "td_mrsf_density"
character(len=*), parameter, public :: OQP_td_p = OQP_prefix // "td_p"
character(len=*), parameter, public :: OQP_td_t = OQP_prefix // "td_t"
character(len=*), parameter, public :: OQP_td_xpy = OQP_prefix // "td_xpy"
character(len=*), parameter, public :: OQP_td_xmy = OQP_prefix // "td_xmy"
character(len=*), parameter, public :: OQP_td_energies = OQP_prefix // "td_energies"
! File handling and logging
character(len=*), parameter, public :: OQP_log_filename = OQP_prefix // "log_filename"
character(len=*), parameter, public :: OQP_basis_filename = OQP_prefix // "basis_filename"
character(len=*), parameter, public :: OQP_hbasis_filename = OQP_prefix // "hbasis_filename"
! Data for property computations between two geometries
character(len=*), parameter, public :: OQP_xyz_old = OQP_prefix // "xyz_old"
character(len=*), parameter, public :: OQP_overlap_ao = OQP_prefix // "overlap_ao_non_orthogonal"
character(len=*), parameter, public :: OQP_overlap_mo = OQP_prefix // "overlap_mo_non_orthogonal"
character(len=*), parameter, public :: OQP_E_MO_A_old = OQP_prefix // "E_MO_A_old"
character(len=*), parameter, public :: OQP_E_MO_B_old = OQP_prefix // "E_MO_B_old"
character(len=*), parameter, public :: OQP_VEC_MO_A_old = OQP_prefix // "VEC_MO_A_old"
character(len=*), parameter, public :: OQP_VEC_MO_B_old = OQP_prefix // "VEC_MO_B_old"
character(len=*), parameter, public :: OQP_td_bvec_mo_old = OQP_prefix // "td_bvec_mo_old"
character(len=*), parameter, public :: OQP_td_energies_old = OQP_prefix // "td_energies_old"
! Non-adiabatic coupling and time-dependent states
character(len=*), parameter, public :: OQP_nac = OQP_prefix // "nac"
character(len=*), parameter, public :: OQP_td_states_phase = OQP_prefix // "td_states_phase"
character(len=*), parameter, public :: OQP_td_states_overlap = OQP_prefix // "td_states_overlap"
These tagarrays are used to efficiently manage and transfer data across different parts of the OpenQP platform, ensuring that complex quantum mechanical calculations can be performed smoothly and with interoperability between different programming environments.