tagarray_driver.F90 Source File


Source Code

#include "tagarray.fh"
module oqp_tagarray_driver
  use tagarray

  use, intrinsic :: iso_c_binding, only: c_int32_t, c_int64_t, c_char, c_ptr, c_null_ptr, c_bool

  implicit none
  private
  character(len=*), parameter, private :: module_name = "oqp_tagarray_driver"
  public :: tagarray_get_cptr
  character(len=*), parameter, public :: OQP_prefix = "OQP::"
  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"
  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"
  character(len=*), parameter, public :: OQP_Hcore = OQP_prefix // "Hcore"
  character(len=*), parameter, public :: OQP_SM = OQP_prefix // "SM"
  character(len=*), parameter, public :: OQP_QMAT = OQP_prefix // "QMAT"
  character(len=*), parameter, public :: OQP_TM = OQP_prefix // "TM"
  character(len=*), parameter, public :: OQP_ERI_AO = OQP_prefix // "ERI_AO"
  character(len=*), parameter, public :: OQP_ERI_AO_comment = &
    "Two-electron repulsion integrals (mu nu|la si) in AO basis, chemist "// &
    "notation, full nbf**4 array stored C-contiguous with si fastest"
  character(len=*), parameter, public :: OQP_WAO = OQP_prefix // "WAO"
  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"
  character(len=*), parameter, public :: OQP_td_singlet_energies = OQP_prefix // "td_singlet_energies"    !new
  character(len=*), parameter, public :: OQP_td_triplet_energies = OQP_prefix // "td_triplet_energies"    !new
  character(len=*), parameter, public :: OQP_td_bvec_mo_s = OQP_prefix // "td_bvec_mo_s"                  !new
  character(len=*), parameter, public :: OQP_td_bvec_mo_t = OQP_prefix // "td_bvec_mo_t"                  !new
  character(len=*), parameter, public :: OQP_nmr_shielding = OQP_prefix // "nmr_shielding"
  character(len=*), parameter, public :: OQP_nmr_shielding_comment = &
    "Isotropic NMR shielding per atom (ppm); shape (5, natom): rows = "// &
    "dia, para_uncoupled, para_coupled, total_uncoupled, total_coupled"
  character(len=*), parameter, public :: OQP_mulliken_charges = OQP_prefix // "mulliken_charges"
  character(len=*), parameter, public :: OQP_mulliken_charges_comment = &
    "Mulliken atomic partial charges (e), one per atom"
  character(len=*), parameter, public :: OQP_lowdin_charges = OQP_prefix // "lowdin_charges"
  character(len=*), parameter, public :: OQP_lowdin_charges_comment = &
    "Lowdin atomic partial charges (e), one per atom"
  ! NB: identifier differs from the subroutine oqp_resp_charges (Fortran is
  ! case-insensitive); the JSON key is still "resp_charges".
  character(len=*), parameter, public :: OQP_resp_chg = OQP_prefix // "resp_charges"
  character(len=*), parameter, public :: OQP_resp_chg_comment = &
    "RESP/ESP-fitted atomic partial charges (e), one per atom"
  character(len=*), parameter, public :: OQP_mrsf_ekt_density_mo = OQP_prefix // "mrsf_ekt_density_mo"
  character(len=*), parameter, public :: OQP_mrsf_ekt_lagrangian_mo = OQP_prefix // "mrsf_ekt_lagrangian_mo"
  character(len=*), parameter, public :: OQP_mrsf_ekt_fock_mo = OQP_prefix // "mrsf_ekt_fock_mo"
  character(len=*), parameter, public :: OQP_mrsf_ekt_orbitals_mo = OQP_prefix // "mrsf_ekt_orbitals_mo"
  character(len=*), parameter, public :: OQP_mrsf_ekt_eigenvalues = OQP_prefix // "mrsf_ekt_eigenvalues"
  character(len=*), parameter, public :: OQP_mrsf_ekt_strengths = OQP_prefix // "mrsf_ekt_strengths"
  character(len=*), parameter, public :: OQP_hf_hessian = OQP_prefix // "hf_hessian"
  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"
! Used to compute properties 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"
  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"
  character(len=*), parameter, public :: OQP_mm_potential = OQP_prefix // "mm_potential"
  character(len=*), parameter, public :: OQP_Hqmmm = OQP_prefix // "hamiltonian_qmmm"
  character(len=*), parameter, public :: OQP_partial_charges = OQP_prefix // "partial_charges"
  character(len=*), parameter, public :: OQP_mm_energy = OQP_prefix // "mm_energy"
  character(len=*), parameter, public :: OQP_mm_gradient = OQP_prefix // "mm_gradient"
  character(len=*), parameter, public :: OQP_ESPF_CORR = OQP_prefix // "ESPF_CORR"
  character(len=*), parameter, public :: OQP_POTQM = OQP_prefix // "POTQM"
  character(len=*), parameter, public :: OQP_POTMM = OQP_prefix // "POTMM"
  character(len=*), parameter, public :: OQP_ESPF_GRAD = OQP_prefix // "ESPF_GRAD"

  ! NAMD (Tully FSSH) state exchanged with the Python trajectory driver
  character(len=*), parameter, public :: OQP_namd_coef     = OQP_prefix // "namd_coef"
  character(len=*), parameter, public :: OQP_namd_velocity = OQP_prefix // "namd_velocity"
  character(len=*), parameter, public :: OQP_namd_params   = OQP_prefix // "namd_params"
  character(len=*), parameter, public :: OQP_namd_results  = OQP_prefix // "namd_results"
  character(len=*), parameter, public :: OQP_namd_tdc      = OQP_prefix // "namd_tdc"
  character(len=*), parameter, public :: OQP_namd_eabs     = OQP_prefix // "namd_eabs"
  character(len=*), parameter, public :: OQP_namd_stas     = OQP_prefix // "namd_stas"

  ! MRSF spin-orbit coupling (from upstream SOC merge)
  character(len=*), parameter, public :: OQP_soc_eval    = OQP_prefix // "soc_eval"
  character(len=*), parameter, public :: OQP_soc_evec_re = OQP_prefix // "soc_evec_re"
  character(len=*), parameter, public :: OQP_soc_evec_im = OQP_prefix // "soc_evec_im"
  character(len=*), parameter, public :: OQP_soc_hsoc_re = OQP_prefix // "soc_hsoc_re"
  character(len=*), parameter, public :: OQP_soc_hsoc_im = OQP_prefix // "soc_hsoc_im"

  ! misc-excited-analysis: MRSF state-interaction transition/state densities and
  ! dipole intermediates exposed for downstream Python excited-state analysis
  ! (NTOs / attach-detach / cubes / descriptors). Written at the end of the MRSF
  ! energy driver; read read-only from Python via the tagarray bridge.
  character(len=*), parameter, public :: OQP_td_trans_density_mo = OQP_prefix // "td_trans_density_mo"
  character(len=*), parameter, public :: OQP_td_trans_dipole = OQP_prefix // "td_trans_dipole"
  character(len=*), parameter, public :: OQP_td_dip_ao = OQP_prefix // "td_dip_ao"
  character(len=*), parameter, public :: OQP_td_trans_density_mo_comment = &
    "MRSF state-interaction 1-TDM (off-diag) / difference 1-RDM (diag) in the "// &
    "alpha-MO basis; shape (nbf,nbf,nstates*nstates), pair k=ist+(jst-1)*nstates"
  character(len=*), parameter, public :: OQP_td_trans_dipole_comment = &
    "MRSF transition dipoles (a.u.) at center of mass; shape (3,nstates,nstates)"
  character(len=*), parameter, public :: OQP_td_dip_ao_comment = &
    "AO electric-dipole integrals (a.u.) at center of mass; packed L-triangle (nbf*(nbf+1)/2,3)"

  ! Symmetry petite-list metadata (written by pyoqp when use_integral_symmetry
  ! is enabled)
  character(len=*), parameter, public :: OQP_sym_petite = OQP_prefix // "sym_petite_enable"
  character(len=*), parameter, public :: OQP_sym_shell_map = OQP_prefix // "sym_shell_map"
  character(len=*), parameter, public :: OQP_sym_ao_target = OQP_prefix // "sym_ao_target"
  character(len=*), parameter, public :: OQP_sym_ao_sign = OQP_prefix // "sym_ao_sign"
  character(len=*), parameter, public :: OQP_sym_atom_weight = OQP_prefix // "sym_atom_weight"
  character(len=*), parameter, public :: OQP_sym_pair_irrep = OQP_prefix // "sym_pair_irrep"
  character(len=*), parameter, public :: OQP_sym_op_blocks = OQP_prefix // "sym_op_blocks"

  character(len=*), parameter, public :: OQP_DM_A_comment = "Alpha-spin triangle Density matrix"
  character(len=*), parameter, public :: OQP_DM_B_comment = "Beta-spin triangle Density matrix"
  character(len=*), parameter, public :: OQP_FOCK_A_comment = "Alpha-spin triangle Fock matrix"
  character(len=*), parameter, public :: OQP_FOCK_B_comment = "Beta-spin triangle Fock matrix"
  character(len=*), parameter, public :: OQP_E_MO_A_comment = "Energies of alpha molecular orbitals"
  character(len=*), parameter, public :: OQP_E_MO_B_comment = "Energies of beta molecular orbitals"
  character(len=*), parameter, public :: OQP_VEC_MO_A_comment = "Coefficients of alpha molecular orbitals"
  character(len=*), parameter, public :: OQP_VEC_MO_B_comment = "Coefficients of beta molecular orbitals"
  character(len=*), parameter, public :: OQP_Hcore_comment = "triangle core Hamiltonian matrix"
  character(len=*), parameter, public :: OQP_SM_comment = "triangle Overlap matrix"
  character(len=*), parameter, public :: OQP_QMAT_comment = "canonical orthogonalizer Q = S^(-1/2), full (nbf x nbf)"
  character(len=*), parameter, public :: OQP_TM_comment = "triangle Kinetic-Energy matrix"
  character(len=*), parameter, public :: OQP_WAO_comment = "??? WAO ???"
  character(len=*), parameter, public :: OQP_td_abxc_comment = "??? td_abxc ???"
  character(len=*), parameter, public :: OQP_td_bvec_mo_comment = "??? td_bvec_mo ???"
  character(len=*), parameter, public :: OQP_td_mrsf_density_comment = "??? td_mrsf_density ???"
  character(len=*), parameter, public :: OQP_td_p_comment = "??? td_p ???"
  character(len=*), parameter, public :: OQP_td_t_comment = "??? td_t ???"
  character(len=*), parameter, public :: OQP_td_xpy_comment = OQP_prefix // "(X+Y) vector for target state in TD-DFT calculations"
  character(len=*), parameter, public :: OQP_td_xmy_comment = OQP_prefix // "(X-Y) vector for target state in TD-DFT calculations"
  character(len=*), parameter, public :: OQP_td_energies_comment = OQP_prefix // "Responce energies"
  character(len=*), parameter, public :: OQP_mm_potential_comment = "MM potential"
  character(len=*), parameter, public :: OQP_partial_charges_comment = "QM partial charges"
  character(len=*), parameter, public :: OQP_mm_energy_comment = "MM energy"
  character(len=*), parameter, public :: OQP_mm_gradient_comment = "MM gradient"
  character(len=*), parameter, public :: OQP_Hqmmm_comment = "triangle QM/MM Hamiltonian matrix"
  character(len=*), parameter, public :: OQP_espf_corr_comment = "ESPF one-electron operators for each QM atom"
  character(len=*), parameter, public :: OQP_log_filename_comment = OQP_prefix // "log filename"
  character(len=*), parameter, public :: OQP_potqm_comment = OQP_prefix // "Quantum contribution to the potential"
  character(len=*), parameter, public :: OQP_potmm_comment = OQP_prefix // "MM contribution to the potential"
  character(len=*), parameter, public :: OQP_ESPF_GRAD_comment = OQP_prefix // "ESP contribution to the gradient"
  character(len=*), parameter, public :: OQP_basis_filename_comment = OQP_prefix // "basis filename"
  character(len=*), parameter, public :: OQP_hbasis_filename_comment = OQP_prefix // "Huckel basis_filename for Huckel Guess"
  character(len=*), parameter, public :: OQP_nac_comment = OQP_prefix // "nonadiabatic coupling nstates x nstates"
  character(len=*), parameter, public :: OQP_overlap_mo_comment = OQP_prefix // "overlap between MOs of geo1 and geo2"
  character(len=*), parameter, public :: OQP_overlap_ao_comment = OQP_prefix // "overlap between geo1 and geo2"
  character(len=*), parameter, public :: OQP_td_states_phase_comment = OQP_prefix // "Bvecs phase sign with respect to Bvec_old"
  character(len=*), parameter, public :: OQP_td_states_overlap_comment = OQP_prefix // "Bvecs phase sign with respect to Bvec_old"
  character(len=*), parameter, public :: OQP_xyz_oldcomment = OQP_prefix // "saved geo from previous step"
  character(len=*), parameter, public :: OQP_namd_coef_comment = OQP_prefix // "NAMD electronic amplitudes (2 x nstate: re,im)"
  character(len=*), parameter, public :: OQP_namd_velocity_comment = OQP_prefix // "NAMD nuclear velocities (3 x natom, a.u.)"
  character(len=*), parameter, public :: OQP_namd_params_comment = OQP_prefix // "NAMD packed scalar parameters/state"
  character(len=*), parameter, public :: OQP_namd_results_comment = OQP_prefix // "NAMD per-step diagnostics (hop prob + flags)"
  character(len=*), parameter, public :: OQP_namd_tdc_comment = OQP_prefix // "NAMD time-derivative coupling matrix (nstate x nstate)"
  character(len=*), parameter, public :: OQP_namd_eabs_comment = OQP_prefix // "NAMD absolute state energies (Hartree)"
  character(len=*), parameter, public :: OQP_namd_stas_comment = OQP_prefix // "NAMD state overlap matrix (flat n*n) for trivial-crossing"
  character(len=*), parameter, public :: OQP_soc_eval_comment    = OQP_prefix // "SOC adiabatic eigenvalues (cm-1)"
  character(len=*), parameter, public :: OQP_soc_evec_re_comment = OQP_prefix // "SOC eigenvectors real part"
  character(len=*), parameter, public :: OQP_soc_evec_im_comment = OQP_prefix // "SOC eigenvectors imaginary part"
  character(len=*), parameter, public :: OQP_soc_hsoc_re_comment = OQP_prefix // "SOC Hamiltonian real part (cm-1)"
  character(len=*), parameter, public :: OQP_soc_hsoc_im_comment = OQP_prefix // "SOC Hamiltonian imaginary part (cm-1)"
  character(len=*), parameter, public :: all_tags(*) = (/ character(len=80) :: &
    OQP_DM_A, OQP_DM_B, OQP_FOCK_A, OQP_FOCK_B, OQP_E_MO_A, OQP_E_MO_B, &
    OQP_VEC_MO_A, OQP_VEC_MO_B, OQP_Hcore, OQP_SM, OQP_TM, OQP_WAO, &
    OQP_td_abxc, OQP_td_bvec_mo, OQP_td_mrsf_density, OQP_td_p, OQP_td_t, &
    OQP_mrsf_ekt_density_mo, OQP_mrsf_ekt_lagrangian_mo, OQP_mrsf_ekt_fock_mo, &
    OQP_mrsf_ekt_orbitals_mo, OQP_mrsf_ekt_eigenvalues, OQP_mrsf_ekt_strengths, OQP_hf_hessian, &
    OQP_log_filename, OQP_basis_filename, OQP_hbasis_filename, &
    OQP_xyz_old, OQP_overlap_mo, OQP_overlap_ao, OQP_E_MO_A_old, OQP_E_MO_B_old, &
    OQP_VEC_MO_A_old, OQP_VEC_MO_B_old, OQP_td_bvec_mo_old, OQP_td_energies_old, &
    OQP_nac, OQP_td_states_phase, OQP_td_states_overlap, &
    OQP_Hqmmm, OQP_mm_potential, OQP_partial_charges,OQP_mm_energy, &
    OQP_ESPF_CORR, OQP_POTMM, OQP_POTQM, &
    OQP_namd_coef, OQP_namd_velocity, OQP_namd_params, OQP_namd_results, &
    OQP_namd_tdc, OQP_namd_eabs, OQP_namd_stas /)

  interface tagarray_get_data
    module procedure tagarray_get_data_int64_val, tagarray_get_data_int64_1d, tagarray_get_data_int64_2d, tagarray_get_data_int64_3d
    module procedure tagarray_get_data_real64_val, tagarray_get_data_real64_1d, tagarray_get_data_real64_2d, tagarray_get_data_real64_3d
    module procedure tagarray_get_data_char8_val, tagarray_get_data_char8_1d
  end interface
  interface data_has_tags
    module procedure data_has_tags_location, data_has_tags_ms
  end interface
  public :: data_has_tags, check_status
  public :: tagarray_get_data
  public :: TA_TYPE_INT64, TA_TYPE_REAL64, TA_TYPE_CHAR8
  public :: ta_ok
contains

    function tagarray_get_cptr(container, tag, ptr, type_id, ndims, dims, data_size) result(res)
    type(container_t), intent(inout) :: container
    character(len=*), intent(in) :: tag
    type(c_ptr), intent(out) :: ptr
    integer(c_int64_t) :: res
    integer(c_int32_t), optional, intent(out) :: type_id
    integer(c_int32_t), optional, intent(out) :: ndims
    integer(c_int64_t), optional, intent(out) :: dims(:)
    integer(c_int64_t), optional, intent(out) :: data_size

    type(recordinfo_t) :: record_info

    ptr = c_null_ptr
    res = TA_CONTAINER_RECORD_NOT_FOUND
    if (.not. container%contains(tag)) return

    record_info = container%get(tag)
    ptr = record_info%data
    res = record_info%count
    if (present(type_id)) type_id = record_info%type_id
    if (present(ndims  )) ndims   = int(record_info%ndims, c_int32_t)
    if (present(dims   )) dims(1:record_info%ndims) = record_info%dims
    if (present(data_size   )) data_size = record_info%count

  end function tagarray_get_cptr


  subroutine data_has_tags_location(container, tags, location, abort, status)
    use messages, only: show_message, WITHOUT_ABORT
    type(container_t), intent(inout) :: container
    character(len=*), intent(in) :: tags(:)
    character(len=*), intent(in) :: location
    logical, optional, intent(in) :: abort
    integer(c_int32_t), optional, intent(out) :: status
    integer(c_int32_t) :: tag_id, status_
    logical :: abort_
    abort_ = WITHOUT_ABORT
    if (present(abort)) abort_ = abort
    status_ = TA_OK
    if (.not. container%contains(tags, tag_id)) then
      status_ = TA_CONTAINER_RECORD_NOT_FOUND
      call show_message( &
          location // ": " // get_status_message(status_, trim(tags(tag_id))), &
          abort_)
    end if
    if (present(status)) status = status_
  end subroutine data_has_tags_location
  subroutine data_has_tags_ms(container, tags, modulename, subroutinename, abort, status)
    use messages, only: show_message, WITHOUT_ABORT
    type(container_t), intent(inout) :: container
    character(len=*), intent(in) :: tags(:)
    character(len=*), intent(in) :: modulename, subroutinename
    logical, optional, intent(in) :: abort
    integer(c_int32_t), optional, intent(out) :: status
    integer(c_int32_t) :: tag_id, status_
    logical :: abort_
    abort_ = WITHOUT_ABORT
    if (present(abort)) abort_ = abort
    status_ = TA_OK
    if (.not. container%contains(tags, tag_id)) then
      status_ = TA_CONTAINER_RECORD_NOT_FOUND
      call show_message( &
          modulename // "::" // subroutinename // ": " // get_status_message(status_, trim(tags(tag_id))), &
          abort_)
    end if
    if (present(status)) status = status_
  end subroutine data_has_tags_ms
  subroutine check_status(status, modulename, subroutinename, tag, abort)
    use messages, only: show_message, WITHOUT_ABORT
    integer(c_int32_t), intent(in) :: status
    character(len=*), intent(in) :: modulename, subroutinename, tag
    logical, optional, intent(in) :: abort
    logical :: abort_
    abort_ = WITHOUT_ABORT
    if (present(abort)) abort_ = abort
    if (status /= TA_OK) call show_message( &
        modulename // "::" // subroutinename // ": " // get_status_message(status, trim(tag)), &
        abort_)
  end subroutine check_status
  subroutine tagarray_get_data_int64_val(container, tag, ptr, status)
    type(container_t), intent(inout) :: container
    character(len=*), intent(in) :: tag
    integer(8), pointer :: ptr
    integer(c_int32_t), optional, intent(out) :: status
    integer(c_int32_t) :: status_
    TA_CONTAINER_GET_VALUE(container, tag, TA_TYPE_INT64, ptr, status_)
    if (present(status)) status = status_
  end subroutine tagarray_get_data_int64_val
  subroutine tagarray_get_data_int64_1d(container, tag, ptr, status)
    type(container_t), intent(inout) :: container
    character(len=*), intent(in) :: tag
    integer(8), pointer :: ptr(:)
    integer(c_int32_t), optional, intent(out) :: status
    integer(c_int32_t) :: status_
    TA_CONTAINER_GET_ARRAY(container, tag, TA_TYPE_INT64, ptr, status_)
    if (present(status)) status = status_
  end subroutine tagarray_get_data_int64_1d
  subroutine tagarray_get_data_int64_2d(container, tag, ptr, status)
    type(container_t), intent(inout) :: container
    character(len=*), intent(in) :: tag
    integer(8), pointer :: ptr(:,:)
    integer(c_int32_t), optional, intent(out) :: status
    integer(c_int32_t) :: status_
    TA_CONTAINER_GET_ARRAY(container, tag, TA_TYPE_INT64, ptr, status_)
    if (present(status)) status = status_
  end subroutine tagarray_get_data_int64_2d
  subroutine tagarray_get_data_int64_3d(container, tag, ptr, status)
    type(container_t), intent(inout) :: container
    character(len=*), intent(in) :: tag
    integer(8), pointer :: ptr(:,:,:)
    integer(c_int32_t), optional, intent(out) :: status
    integer(c_int32_t) :: status_
    TA_CONTAINER_GET_ARRAY(container, tag, TA_TYPE_INT64, ptr, status_)
    if (present(status)) status = status_
  end subroutine tagarray_get_data_int64_3d
  subroutine tagarray_get_data_real64_val(container, tag, ptr, status)
    type(container_t), intent(inout) :: container
    character(len=*), intent(in) :: tag
    real(8), pointer :: ptr
    integer(c_int32_t), optional, intent(out) :: status
    integer(c_int32_t) :: status_
    TA_CONTAINER_GET_VALUE(container, tag, TA_TYPE_REAL64, ptr, status_)
    if (present(status)) status = status_
  end subroutine tagarray_get_data_real64_val
  subroutine tagarray_get_data_real64_1d(container, tag, ptr, status)
    type(container_t), intent(inout) :: container
    character(len=*), intent(in) :: tag
    real(8), pointer :: ptr(:)
    integer(c_int32_t), optional, intent(out) :: status
    integer(c_int32_t) :: status_
    TA_CONTAINER_GET_ARRAY(container, tag, TA_TYPE_REAL64, ptr, status_)
    if (present(status)) status = status_
  end subroutine tagarray_get_data_real64_1d
  subroutine tagarray_get_data_real64_2d(container, tag, ptr, status)
    type(container_t), intent(inout) :: container
    character(len=*), intent(in) :: tag
    real(8), pointer :: ptr(:,:)
    integer(c_int32_t), optional, intent(out) :: status
    integer(c_int32_t) :: status_
    TA_CONTAINER_GET_ARRAY(container, tag, TA_TYPE_REAL64, ptr, status_)
    if (present(status)) status = status_
  end subroutine tagarray_get_data_real64_2d
  subroutine tagarray_get_data_real64_3d(container, tag, ptr, status)
    type(container_t), intent(inout) :: container
    character(len=*), intent(in) :: tag
    real(8), pointer :: ptr(:,:,:)
    integer(c_int32_t), optional, intent(out) :: status
    integer(c_int32_t) :: status_
    TA_CONTAINER_GET_ARRAY(container, tag, TA_TYPE_REAL64, ptr, status_)
    if (present(status)) status = status_
  end subroutine tagarray_get_data_real64_3d

  subroutine tagarray_get_data_char8_val(container, tag, ptr, status)
    type(container_t), intent(inout) :: container
    character(len=*), intent(in) :: tag
    character(len=*, kind=c_char), pointer :: ptr
    integer(c_int32_t), optional, intent(out) :: status
    integer(c_int32_t) :: status_
    TA_CONTAINER_GET_VALUE(container, tag, TA_TYPE_CHAR8, ptr, status_)
    if (present(status)) status = status_
  end subroutine tagarray_get_data_char8_val

  subroutine tagarray_get_data_char8_1d(container, tag, ptr, status)
    type(container_t), intent(inout) :: container
    character(len=*), intent(in) :: tag
    character(len=*, kind=c_char), pointer :: ptr(:)
    integer(c_int32_t), optional, intent(out) :: status
    integer(c_int32_t) :: status_
    TA_CONTAINER_GET_ARRAY(container, tag, TA_TYPE_CHAR8, ptr, status_)
    if (present(status)) status = status_
  end subroutine tagarray_get_data_char8_1d
end module oqp_tagarray_driver