-
Notifications
You must be signed in to change notification settings - Fork 0
/
write_h5.irp.f
118 lines (93 loc) · 3.24 KB
/
write_h5.irp.f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
program print_integrals
use iso_c_binding
use map_module
implicit none
character (len = 100) :: h5path
character (len = 1) :: basis_id_str
integer :: err
integer :: n_bielec_int, n_hcore_int, n_to_read, o_num_h5
integer :: i_int, chuck_size_cur
real(integral_kind), allocatable :: buffer_values(:)
integer(key_kind), allocatable :: buffer_i(:)
integer(key_kind), allocatable :: buffer_i_hcore(:,:)
real(integral_kind), allocatable :: buffer_values_hcore_h5(:)
double precision, allocatable :: buffer_values_hcore(:,:)
integer, parameter :: chunk_size = 1 !0 !100*1000
integer :: basis_id = 1
integer*8 :: i,j, a,b, n
integer :: o_num
PROVIDE ezfio_filename
! _
! |_) _. ._ _. ._ _
! | (_| | (_| | | |
!
CALL GET_ENVIRONMENT_VARIABLE("h5_int_path", h5path, status = err)
if ( err .ne. 0) then
h5path = "qp_in.qp.h5"
endif
! basis_id == 0 -> MO ; basis_id != 0 -> AO. Default basis_id == 0
CALL GET_ENVIRONMENT_VARIABLE("h5_basis_id", basis_id_str, status = err)
if ( err .ne. 0) then
basis_id = 0
else
read(basis_id_str, '(i)') basis_id
endif
! Set param in hd5f
if (basis_id .eq. 0) then
o_num = mo_num
else
o_num = ao_num
endif
! _
! |\/| _ ._ _ _ | _ _ / |_| / _ ._ _ \
! | | (_) | | (_) (/_ | (/_ (_ | | | \_ (_) | (/_ |
! \ /
integer*8 :: get_mo_map_size, get_ao_map_size, o_map_size
integer(cache_key_kind), pointer :: key(:)
real(integral_kind), pointer :: val(:)
if (basis_id .eq. 0) then
PROVIDE mo_two_e_integrals_in_map
o_map_size = get_mo_map_size();
else
PROVIDE ao_two_e_integrals_in_map
o_map_size = get_ao_map_size();
endif
! WARNING: This can blowup. We should write in batch
allocate (buffer_values(o_map_size), buffer_i(o_map_size))
integer*8 k
k = 0
if (basis_id .eq. 0) then
do i=0_8,mo_integrals_map%map_size
key => mo_integrals_map%map(i)%key
val => mo_integrals_map%map(i)%value
n = mo_integrals_map%map(i)%n_elements
do j = 1, n
if (abs(val(j)) >= 1.E-15) then
k = k + 1
buffer_i(k) = key(j)
buffer_values(k) = val(j)
endif
end do
enddo
else
do i=0_8,ao_integrals_map%map_size
key => ao_integrals_map%map(i)%key
val => ao_integrals_map%map(i)%value
n = ao_integrals_map%map(i)%n_elements
do j = 1, n
if (abs(val(j)) >= 1.E-15) then
k = k + 1
buffer_i(k) = key(j)
buffer_values(k) = val(j)
endif
end do
enddo
endif
call write_init_h5(trim(h5path)//c_null_char, o_num, k, basis_id, nuclear_repulsion)
call write_bielec_h5(trim(h5path)//c_null_char, buffer_i, buffer_values,basis_id)
if (basis_id .eq. 0) then
call write_hcore_h5(trim(h5path)//c_null_char, o_num, mo_one_e_integrals, basis_id)
else
call write_hcore_h5(trim(h5path)//c_null_char, o_num, ao_one_e_integrals, basis_id)
endif
end