From e485e512f726d48b58c690aa70cb5461fcaf69c6 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 10 Dec 2021 18:42:49 +0100 Subject: [PATCH] Update trexio plugin --- devel/trexio/EZFIO.cfg | 18 ++ devel/trexio/NEED | 1 + devel/trexio/export_trexio.irp.f | 191 +++++++++++++-------- devel/trexio/trexio_f.f90 | 281 +++++++++++++++++++++++++------ 4 files changed, 371 insertions(+), 120 deletions(-) diff --git a/devel/trexio/EZFIO.cfg b/devel/trexio/EZFIO.cfg index 9da5e95..e99dba9 100644 --- a/devel/trexio/EZFIO.cfg +++ b/devel/trexio/EZFIO.cfg @@ -10,3 +10,21 @@ doc: Name of the exported TREXIO file interface: ezfio, ocaml, provider default: None +[export_rdm] +type: logical +doc: If True, export two-body reduced density matrix +interface: ezfio, ocaml, provider +default: False + +[export_ao_ints] +type: logical +doc: If True, export two-electron integrals in AO basis +interface: ezfio, ocaml, provider +default: False + +[export_mo_ints] +type: logical +doc: If True, export two-electron integrals in MO basis +interface: ezfio, ocaml, provider +default: True + diff --git a/devel/trexio/NEED b/devel/trexio/NEED index 0a886cf..1d6fc39 100644 --- a/devel/trexio/NEED +++ b/devel/trexio/NEED @@ -4,3 +4,4 @@ mo_one_e_ints mo_two_e_ints ao_two_e_ints ao_one_e_ints +two_body_rdm diff --git a/devel/trexio/export_trexio.irp.f b/devel/trexio/export_trexio.irp.f index 89699f0..4620c3c 100644 --- a/devel/trexio/export_trexio.irp.f +++ b/devel/trexio/export_trexio.irp.f @@ -1,4 +1,11 @@ program export_trexio + implicit none + read_wf = .True. + SOFT_TOUCH read_wf + call run +end + +subroutine run use trexio implicit none BEGIN_DOC @@ -53,6 +60,9 @@ program export_trexio rc = trexio_write_nucleus_label(f, nucl_label, 32) call check_success(rc) + rc = trexio_write_nucleus_repulsion(f, nuclear_repulsion) + call check_success(rc) + ! Pseudo-potentials ! ----------------- @@ -209,46 +219,48 @@ program export_trexio ! Two-e AO integrals ! ------------------ - PROVIDE ao_two_e_integrals_in_map + if (export_ao_ints) then + PROVIDE ao_two_e_integrals_in_map - integer(8), parameter :: BUFSIZE=10000_8 - double precision :: eri_buffer(BUFSIZE), integral - integer(4) :: eri_index(4,BUFSIZE) - integer(8) :: icount, offset + integer(8), parameter :: BUFSIZE=10000_8 + double precision :: eri_buffer(BUFSIZE), integral + integer(4) :: eri_index(4,BUFSIZE) + integer(8) :: icount, offset - double precision, external :: get_ao_two_e_integral + double precision, external :: get_ao_two_e_integral - icount = 0_8 - offset = 0_8 - do l=1,ao_num - do k=1,ao_num - do j=l,ao_num - do i=k,ao_num - if (i==j .and. k= 0_8) then - rc = trexio_write_ao_2e_int_eri(f, offset, icount, eri_index, eri_buffer) - call check_success(rc) + if (icount >= 0_8) then + rc = trexio_write_ao_2e_int_eri(f, offset, icount, eri_index, eri_buffer) + call check_success(rc) + end if end if @@ -292,57 +304,96 @@ program export_trexio ! Two-e MO integrals ! ------------------ - PROVIDE mo_two_e_integrals_in_map + if (export_mo_ints) then + PROVIDE mo_two_e_integrals_in_map - double precision, external :: mo_two_e_integral + double precision, external :: mo_two_e_integral - icount = 0_8 - offset = 0_8 - do l=1,mo_num - do k=1,mo_num - do j=l,mo_num - do i=k,mo_num - if (i==j .and. k= 0_8) then - rc = trexio_write_mo_2e_int_eri(f, offset, icount, eri_index, eri_buffer) - call check_success(rc) + if (icount >= 0_8) then + rc = trexio_write_mo_2e_int_eri(f, offset, icount, eri_index, eri_buffer) + call check_success(rc) + end if end if -! RDM -! ---- +! One-e RDM +! --------- -! rc = trexio_write_rdm_one_e(f,one_e_dm_mo) -! call check_success(rc) -! -! rc = trexio_write_rdm_one_e_up(f,one_e_dm_mo_alpha_average) -! call check_success(rc) -! -! rc = trexio_write_rdm_one_e_dn(f,one_e_dm_mo_beta_average) -! call check_success(rc) + rc = trexio_write_rdm_1e(f,one_e_dm_mo) + call check_success(rc) + rc = trexio_write_rdm_1e_up(f,one_e_dm_mo_alpha_average) + call check_success(rc) + + rc = trexio_write_rdm_1e_dn(f,one_e_dm_mo_beta_average) + call check_success(rc) + + +! Two-e RDM +! --------- + + if (export_rdm) then + PROVIDE two_e_dm_mo + + icount = 0_8 + offset = 0_8 + do l=1,mo_num + do k=1,mo_num + do j=1,mo_num + do i=1,mo_num + integral = two_e_dm_mo(i,j,k,l) + if (integral == 0.d0) cycle + icount += 1_8 + eri_buffer(icount) = integral + eri_index(1,icount) = i + eri_index(2,icount) = j + eri_index(3,icount) = k + eri_index(4,icount) = l + if (icount == BUFSIZE) then + rc = trexio_write_rdm_2e(f, offset, icount, eri_index, eri_buffer) + call check_success(rc) + icount = 0_8 + offset += icount + end if + end do + end do + end do + end do + + if (icount >= 0_8) then + rc = trexio_write_rdm_2e(f, offset, icount, eri_index, eri_buffer) + call check_success(rc) + end if + end if ! ------------------------------------------------------------------------------ diff --git a/devel/trexio/trexio_f.f90 b/devel/trexio/trexio_f.f90 index ab8c3c9..6cce3aa 100644 --- a/devel/trexio/trexio_f.f90 +++ b/devel/trexio/trexio_f.f90 @@ -125,6 +125,13 @@ interface end function trexio_has_nucleus_num end interface +interface + integer function trexio_has_nucleus_repulsion (trex_file) bind(C) + use, intrinsic :: iso_c_binding + integer(8), intent(in), value :: trex_file + end function trexio_has_nucleus_repulsion +end interface + interface integer function trexio_has_ecp_num (trex_file) bind(C) use, intrinsic :: iso_c_binding @@ -427,24 +434,24 @@ interface end interface interface - integer function trexio_has_rdm_one_e (trex_file) bind(C) + integer function trexio_has_rdm_1e (trex_file) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file - end function trexio_has_rdm_one_e + end function trexio_has_rdm_1e end interface interface - integer function trexio_has_rdm_one_e_up (trex_file) bind(C) + integer function trexio_has_rdm_1e_up (trex_file) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file - end function trexio_has_rdm_one_e_up + end function trexio_has_rdm_1e_up end interface interface - integer function trexio_has_rdm_one_e_dn (trex_file) bind(C) + integer function trexio_has_rdm_1e_dn (trex_file) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file - end function trexio_has_rdm_one_e_dn + end function trexio_has_rdm_1e_dn end interface interface @@ -476,10 +483,31 @@ interface end interface interface - integer function trexio_has_rdm_two_e (trex_file) bind(C) + integer function trexio_has_rdm_2e (trex_file) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file - end function trexio_has_rdm_two_e + end function trexio_has_rdm_2e +end interface + +interface + integer function trexio_has_rdm_2e_upup (trex_file) bind(C) + use, intrinsic :: iso_c_binding + integer(8), intent(in), value :: trex_file + end function trexio_has_rdm_2e_upup +end interface + +interface + integer function trexio_has_rdm_2e_dndn (trex_file) bind(C) + use, intrinsic :: iso_c_binding + integer(8), intent(in), value :: trex_file + end function trexio_has_rdm_2e_dndn +end interface + +interface + integer function trexio_has_rdm_2e_updn (trex_file) bind(C) + use, intrinsic :: iso_c_binding + integer(8), intent(in), value :: trex_file + end function trexio_has_rdm_2e_updn end interface interface @@ -557,6 +585,14 @@ interface end function trexio_read_nucleus_num_32 end interface +interface + integer function trexio_read_nucleus_repulsion_32 (trex_file, num) bind(C) + use, intrinsic :: iso_c_binding + integer(8), intent(in), value :: trex_file + real(4), intent(out) :: num + end function trexio_read_nucleus_repulsion_32 +end interface + interface integer function trexio_read_ecp_num_32 (trex_file, num) bind(C) use, intrinsic :: iso_c_binding @@ -645,6 +681,14 @@ interface end function trexio_read_nucleus_num_64 end interface +interface + integer function trexio_read_nucleus_repulsion_64 (trex_file, num) bind(C) + use, intrinsic :: iso_c_binding + integer(8), intent(in), value :: trex_file + real(8), intent(out) :: num + end function trexio_read_nucleus_repulsion_64 +end interface + interface integer function trexio_read_ecp_num_64 (trex_file, num) bind(C) use, intrinsic :: iso_c_binding @@ -733,6 +777,14 @@ interface end function trexio_read_nucleus_num end interface +interface + integer function trexio_read_nucleus_repulsion (trex_file, num) bind(C) + use, intrinsic :: iso_c_binding + integer(8), intent(in), value :: trex_file + real(8), intent(out) :: num + end function trexio_read_nucleus_repulsion +end interface + interface integer function trexio_read_ecp_num (trex_file, num) bind(C) use, intrinsic :: iso_c_binding @@ -1088,27 +1140,27 @@ interface end interface interface - integer function trexio_read_rdm_one_e_32 (trex_file, dset) bind(C) + integer function trexio_read_rdm_1e_32 (trex_file, dset) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file real(4), intent(out) :: dset(*) - end function trexio_read_rdm_one_e_32 + end function trexio_read_rdm_1e_32 end interface interface - integer function trexio_read_rdm_one_e_up_32 (trex_file, dset) bind(C) + integer function trexio_read_rdm_1e_up_32 (trex_file, dset) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file real(4), intent(out) :: dset(*) - end function trexio_read_rdm_one_e_up_32 + end function trexio_read_rdm_1e_up_32 end interface interface - integer function trexio_read_rdm_one_e_dn_32 (trex_file, dset) bind(C) + integer function trexio_read_rdm_1e_dn_32 (trex_file, dset) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file real(4), intent(out) :: dset(*) - end function trexio_read_rdm_one_e_dn_32 + end function trexio_read_rdm_1e_dn_32 end interface interface @@ -1368,27 +1420,27 @@ interface end interface interface - integer function trexio_read_rdm_one_e_64 (trex_file, dset) bind(C) + integer function trexio_read_rdm_1e_64 (trex_file, dset) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file real(8), intent(out) :: dset(*) - end function trexio_read_rdm_one_e_64 + end function trexio_read_rdm_1e_64 end interface interface - integer function trexio_read_rdm_one_e_up_64 (trex_file, dset) bind(C) + integer function trexio_read_rdm_1e_up_64 (trex_file, dset) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file real(8), intent(out) :: dset(*) - end function trexio_read_rdm_one_e_up_64 + end function trexio_read_rdm_1e_up_64 end interface interface - integer function trexio_read_rdm_one_e_dn_64 (trex_file, dset) bind(C) + integer function trexio_read_rdm_1e_dn_64 (trex_file, dset) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file real(8), intent(out) :: dset(*) - end function trexio_read_rdm_one_e_dn_64 + end function trexio_read_rdm_1e_dn_64 end interface interface @@ -1648,27 +1700,27 @@ interface end interface interface - integer function trexio_read_rdm_one_e (trex_file, dset) bind(C) + integer function trexio_read_rdm_1e (trex_file, dset) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file real(8), intent(out) :: dset(*) - end function trexio_read_rdm_one_e + end function trexio_read_rdm_1e end interface interface - integer function trexio_read_rdm_one_e_up (trex_file, dset) bind(C) + integer function trexio_read_rdm_1e_up (trex_file, dset) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file real(8), intent(out) :: dset(*) - end function trexio_read_rdm_one_e_up + end function trexio_read_rdm_1e_up end interface interface - integer function trexio_read_rdm_one_e_dn (trex_file, dset) bind(C) + integer function trexio_read_rdm_1e_dn (trex_file, dset) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file real(8), intent(out) :: dset(*) - end function trexio_read_rdm_one_e_dn + end function trexio_read_rdm_1e_dn end interface interface @@ -1724,7 +1776,7 @@ interface end interface interface - integer function trexio_read_rdm_two_e (trex_file, & + integer function trexio_read_rdm_2e (trex_file, & offset_file, buffer_size, & index_sparse, value_sparse) bind(C) use, intrinsic :: iso_c_binding @@ -1733,7 +1785,46 @@ interface integer(8), intent(in), value :: buffer_size integer(4), intent(in) :: index_sparse(*) double precision, intent(out) :: value_sparse(*) - end function trexio_read_rdm_two_e + end function trexio_read_rdm_2e +end interface + +interface + integer function trexio_read_rdm_2e_upup (trex_file, & + offset_file, buffer_size, & + index_sparse, value_sparse) bind(C) + use, intrinsic :: iso_c_binding + integer(8), intent(in), value :: trex_file + integer(8), intent(in), value :: offset_file + integer(8), intent(in), value :: buffer_size + integer(4), intent(in) :: index_sparse(*) + double precision, intent(out) :: value_sparse(*) + end function trexio_read_rdm_2e_upup +end interface + +interface + integer function trexio_read_rdm_2e_dndn (trex_file, & + offset_file, buffer_size, & + index_sparse, value_sparse) bind(C) + use, intrinsic :: iso_c_binding + integer(8), intent(in), value :: trex_file + integer(8), intent(in), value :: offset_file + integer(8), intent(in), value :: buffer_size + integer(4), intent(in) :: index_sparse(*) + double precision, intent(out) :: value_sparse(*) + end function trexio_read_rdm_2e_dndn +end interface + +interface + integer function trexio_read_rdm_2e_updn (trex_file, & + offset_file, buffer_size, & + index_sparse, value_sparse) bind(C) + use, intrinsic :: iso_c_binding + integer(8), intent(in), value :: trex_file + integer(8), intent(in), value :: offset_file + integer(8), intent(in), value :: buffer_size + integer(4), intent(in) :: index_sparse(*) + double precision, intent(out) :: value_sparse(*) + end function trexio_read_rdm_2e_updn end interface interface @@ -1773,12 +1864,39 @@ interface end interface interface - integer function trexio_read_rdm_two_e_size (trex_file, & + integer function trexio_read_rdm_2e_size (trex_file, & size_max) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file integer(8), intent(out) :: size_max - end function trexio_read_rdm_two_e_size + end function trexio_read_rdm_2e_size +end interface + +interface + integer function trexio_read_rdm_2e_upup_size (trex_file, & + size_max) bind(C) + use, intrinsic :: iso_c_binding + integer(8), intent(in), value :: trex_file + integer(8), intent(out) :: size_max + end function trexio_read_rdm_2e_upup_size +end interface + +interface + integer function trexio_read_rdm_2e_dndn_size (trex_file, & + size_max) bind(C) + use, intrinsic :: iso_c_binding + integer(8), intent(in), value :: trex_file + integer(8), intent(out) :: size_max + end function trexio_read_rdm_2e_dndn_size +end interface + +interface + integer function trexio_read_rdm_2e_updn_size (trex_file, & + size_max) bind(C) + use, intrinsic :: iso_c_binding + integer(8), intent(in), value :: trex_file + integer(8), intent(out) :: size_max + end function trexio_read_rdm_2e_updn_size end interface interface @@ -1866,6 +1984,14 @@ interface end function trexio_write_nucleus_num_32 end interface +interface + integer function trexio_write_nucleus_repulsion_32 (trex_file, num) bind(C) + use, intrinsic :: iso_c_binding + integer(8), intent(in), value :: trex_file + real(4), intent(in), value :: num + end function trexio_write_nucleus_repulsion_32 +end interface + interface integer function trexio_write_ecp_num_32 (trex_file, num) bind(C) use, intrinsic :: iso_c_binding @@ -1954,6 +2080,14 @@ interface end function trexio_write_nucleus_num_64 end interface +interface + integer function trexio_write_nucleus_repulsion_64 (trex_file, num) bind(C) + use, intrinsic :: iso_c_binding + integer(8), intent(in), value :: trex_file + real(8), intent(in), value :: num + end function trexio_write_nucleus_repulsion_64 +end interface + interface integer function trexio_write_ecp_num_64 (trex_file, num) bind(C) use, intrinsic :: iso_c_binding @@ -2042,6 +2176,14 @@ interface end function trexio_write_nucleus_num end interface +interface + integer function trexio_write_nucleus_repulsion (trex_file, num) bind(C) + use, intrinsic :: iso_c_binding + integer(8), intent(in), value :: trex_file + real(8), intent(in), value :: num + end function trexio_write_nucleus_repulsion +end interface + interface integer function trexio_write_ecp_num (trex_file, num) bind(C) use, intrinsic :: iso_c_binding @@ -2397,27 +2539,27 @@ interface end interface interface - integer function trexio_write_rdm_one_e_32 (trex_file, dset) bind(C) + integer function trexio_write_rdm_1e_32 (trex_file, dset) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file real(4), intent(in) :: dset(*) - end function trexio_write_rdm_one_e_32 + end function trexio_write_rdm_1e_32 end interface interface - integer function trexio_write_rdm_one_e_up_32 (trex_file, dset) bind(C) + integer function trexio_write_rdm_1e_up_32 (trex_file, dset) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file real(4), intent(in) :: dset(*) - end function trexio_write_rdm_one_e_up_32 + end function trexio_write_rdm_1e_up_32 end interface interface - integer function trexio_write_rdm_one_e_dn_32 (trex_file, dset) bind(C) + integer function trexio_write_rdm_1e_dn_32 (trex_file, dset) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file real(4), intent(in) :: dset(*) - end function trexio_write_rdm_one_e_dn_32 + end function trexio_write_rdm_1e_dn_32 end interface interface @@ -2677,27 +2819,27 @@ interface end interface interface - integer function trexio_write_rdm_one_e_64 (trex_file, dset) bind(C) + integer function trexio_write_rdm_1e_64 (trex_file, dset) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file real(8), intent(in) :: dset(*) - end function trexio_write_rdm_one_e_64 + end function trexio_write_rdm_1e_64 end interface interface - integer function trexio_write_rdm_one_e_up_64 (trex_file, dset) bind(C) + integer function trexio_write_rdm_1e_up_64 (trex_file, dset) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file real(8), intent(in) :: dset(*) - end function trexio_write_rdm_one_e_up_64 + end function trexio_write_rdm_1e_up_64 end interface interface - integer function trexio_write_rdm_one_e_dn_64 (trex_file, dset) bind(C) + integer function trexio_write_rdm_1e_dn_64 (trex_file, dset) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file real(8), intent(in) :: dset(*) - end function trexio_write_rdm_one_e_dn_64 + end function trexio_write_rdm_1e_dn_64 end interface interface @@ -2957,27 +3099,27 @@ interface end interface interface - integer function trexio_write_rdm_one_e (trex_file, dset) bind(C) + integer function trexio_write_rdm_1e (trex_file, dset) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file real(8), intent(in) :: dset(*) - end function trexio_write_rdm_one_e + end function trexio_write_rdm_1e end interface interface - integer function trexio_write_rdm_one_e_up (trex_file, dset) bind(C) + integer function trexio_write_rdm_1e_up (trex_file, dset) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file real(8), intent(in) :: dset(*) - end function trexio_write_rdm_one_e_up + end function trexio_write_rdm_1e_up end interface interface - integer function trexio_write_rdm_one_e_dn (trex_file, dset) bind(C) + integer function trexio_write_rdm_1e_dn (trex_file, dset) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file real(8), intent(in) :: dset(*) - end function trexio_write_rdm_one_e_dn + end function trexio_write_rdm_1e_dn end interface interface @@ -3033,7 +3175,7 @@ interface end interface interface - integer function trexio_write_rdm_two_e (trex_file, & + integer function trexio_write_rdm_2e (trex_file, & offset_file, buffer_size, & index_sparse, value_sparse) bind(C) use, intrinsic :: iso_c_binding @@ -3042,7 +3184,46 @@ interface integer(8), intent(in), value :: buffer_size integer(4), intent(in) :: index_sparse(*) double precision, intent(in) :: value_sparse(*) - end function trexio_write_rdm_two_e + end function trexio_write_rdm_2e +end interface + +interface + integer function trexio_write_rdm_2e_upup (trex_file, & + offset_file, buffer_size, & + index_sparse, value_sparse) bind(C) + use, intrinsic :: iso_c_binding + integer(8), intent(in), value :: trex_file + integer(8), intent(in), value :: offset_file + integer(8), intent(in), value :: buffer_size + integer(4), intent(in) :: index_sparse(*) + double precision, intent(in) :: value_sparse(*) + end function trexio_write_rdm_2e_upup +end interface + +interface + integer function trexio_write_rdm_2e_dndn (trex_file, & + offset_file, buffer_size, & + index_sparse, value_sparse) bind(C) + use, intrinsic :: iso_c_binding + integer(8), intent(in), value :: trex_file + integer(8), intent(in), value :: offset_file + integer(8), intent(in), value :: buffer_size + integer(4), intent(in) :: index_sparse(*) + double precision, intent(in) :: value_sparse(*) + end function trexio_write_rdm_2e_dndn +end interface + +interface + integer function trexio_write_rdm_2e_updn (trex_file, & + offset_file, buffer_size, & + index_sparse, value_sparse) bind(C) + use, intrinsic :: iso_c_binding + integer(8), intent(in), value :: trex_file + integer(8), intent(in), value :: offset_file + integer(8), intent(in), value :: buffer_size + integer(4), intent(in) :: index_sparse(*) + double precision, intent(in) :: value_sparse(*) + end function trexio_write_rdm_2e_updn end interface interface