Skip to content

Commit 3384db8

Browse files
committed
Swap indices in forces_ao|mo_value
1 parent 56ebb10 commit 3384db8

File tree

1 file changed

+32
-38
lines changed

1 file changed

+32
-38
lines changed

org/qmckl_forces.org

Lines changed: 32 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -5809,7 +5809,7 @@ qmckl_exit_code qmckl_provide_forces_ao_value(qmckl_context context)
58095809
| ~shell_ang_mom~ | ~int32_t[shell_num]~ | in | Angular momentum of each shell |
58105810
| ~ao_factor~ | ~double[ao_num]~ | in | Normalization factor of the AOs |
58115811
| ~ao_vgl~ | ~double[point_num][5][shell_num]~ | in | Value, gradients and Laplacian of the shells |
5812-
| ~forces_ao_value~ | ~double[nucl_num][point_num][ao_num][3]~ | out | Forces of the AOs |
5812+
| ~forces_ao_value~ | ~double[nucl_num][point_num][3][ao_num]~ | out | Forces of the AOs |
58135813
|---------------------+------------------------------------------+--------+----------------------------------------------|
58145814

58155815
#+begin_src f90 :comments org :tangle (eval f) :noweb yes
@@ -5831,7 +5831,7 @@ function qmckl_compute_forces_ao_value_doc(context, &
58315831
integer (c_int32_t) , intent(in) :: shell_ang_mom(shell_num)
58325832
real (c_double ) , intent(in) :: ao_factor(ao_num)
58335833
real (c_double ) , intent(in) :: ao_vgl(ao_num,5,point_num)
5834-
real (c_double ) , intent(out) :: forces_ao_value(3,ao_num,point_num,nucl_num)
5834+
real (c_double ) , intent(out) :: forces_ao_value(ao_num,3,point_num,nucl_num)
58355835
integer(qmckl_exit_code) :: info
58365836

58375837
integer :: l, il, k
@@ -5844,7 +5844,7 @@ function qmckl_compute_forces_ao_value_doc(context, &
58445844
integer , allocatable :: ao_index(:)
58455845
allocate(ao_index(ao_num))
58465846

5847-
!forces_ao_value = 0.d0
5847+
forces_ao_value = 0.d0
58485848

58495849
! Pre-computed data
58505850
do l=0,20
@@ -5870,15 +5870,11 @@ function qmckl_compute_forces_ao_value_doc(context, &
58705870
ishell_start = nucleus_index(inucl) + 1
58715871
ishell_end = nucleus_index(inucl) + nucleus_shell_num(inucl)
58725872
do ishell = ishell_start, ishell_end
5873-
k = ao_index(ishell)
58745873
l = shell_ang_mom(ishell)
5875-
do il = lstart(l), lstart(l+1)-1
5876-
5877-
forces_ao_value(1,k,ipoint,inucl) = -ao_vgl(k,2,ipoint)
5878-
forces_ao_value(2,k,ipoint,inucl) = -ao_vgl(k,3,ipoint)
5879-
forces_ao_value(3,k,ipoint,inucl) = -ao_vgl(k,4,ipoint)
5880-
5881-
k = k+1
5874+
do k = ao_index(ishell), ao_index(ishell) + lstart(l+1)-lstart(l) -1
5875+
forces_ao_value(k,1,ipoint,inucl) = -ao_vgl(k,2,ipoint)
5876+
forces_ao_value(k,2,ipoint,inucl) = -ao_vgl(k,3,ipoint)
5877+
forces_ao_value(k,3,ipoint,inucl) = -ao_vgl(k,4,ipoint)
58825878
end do
58835879
end do
58845880
end do
@@ -5982,15 +5978,15 @@ free(temp_coord);
59825978
free(ao_output);
59835979

59845980

5985-
for (int j = 0; j < ao_num; j++){
5981+
for (int a = 0; a < nucl_num; a++) {
59865982
for (int i = 0; i < point_num; i++){
5987-
for (int a = 0; a < nucl_num; a++) {
5988-
for (int k = 0; k < 3; k++){
5989-
//printf("k=%i a=%i i=%i j=%i\n", k, a, i, j);
5990-
//printf("%.10f\t", finite_difference_force_ao_value[k*ao_num*point_num*nucl_num + a*ao_num*point_num + i*ao_num + j]);
5991-
//printf("%.10f\n", forces_ao_value[a*3*ao_num*point_num + i*ao_num*3 + j*3 + k]);
5992-
assert(fabs(finite_difference_force_ao_value[k*ao_num*point_num*nucl_num + a*ao_num*point_num + i*ao_num + j] - forces_ao_value[a*3*ao_num*point_num + i*ao_num*3 + j*3 + k]) < 1.e-9);
5993-
5983+
for (int k = 0; k < 3; k++){
5984+
for (int j = 0; j < ao_num; j++){
5985+
// printf("k=%i a=%i i=%i j=%i\n", k, a, i, j);
5986+
// printf("%.10e\t", finite_difference_force_ao_value[k*ao_num*point_num*nucl_num + a*ao_num*point_num + i*ao_num + j]);
5987+
// printf("%.10e\n", forces_ao_value[a*3*ao_num*point_num + i*ao_num*3 + k*ao_num + j]);
5988+
assert(fabs(finite_difference_force_ao_value[k*ao_num*point_num*nucl_num + a*ao_num*point_num + i*ao_num + j] -
5989+
forces_ao_value[a*3*ao_num*point_num + i*ao_num*3 + k*ao_num + j]) < 1.e-9);
59945990
}
59955991
}
59965992
}
@@ -6238,8 +6234,8 @@ qmckl_exit_code qmckl_provide_forces_mo_value(qmckl_context context)
62386234
| ~nucleus_shell_num~ | ~int64_t[nucl_num]~ | in | Number of shells per nucleus |
62396235
| ~shell_ang_mom~ | ~int32_t[shell_num]~ | in | Angular momentum of each shell |
62406236
| ~coefficient_t~ | ~double[mo_num][ao_num]~ | in | Transpose of the AO to MO transformation matrix |
6241-
| ~forces_ao_value~ | ~double[nucl_num][point_num][ao_num][3]~ | in | Forces of AOs |
6242-
| ~forces_mo_value~ | ~double[nucl_num][point_num][mo_num][3]~ | out | Forces of MOs |
6237+
| ~forces_ao_value~ | ~double[nucl_num][point_num][3][ao_num]~ | in | Forces of AOs |
6238+
| ~forces_mo_value~ | ~double[nucl_num][point_num][3][mo_num]~ | out | Forces of MOs |
62436239
|---------------------+------------------------------------------+--------+-------------------------------------------------|
62446240

62456241

@@ -6253,12 +6249,12 @@ integer(qmckl_exit_code) function qmckl_compute_forces_mo_value_doc(context, &
62536249
implicit none
62546250
integer(qmckl_context), intent(in) :: context
62556251
integer(c_int64_t) , intent(in), value ::nucl_num, ao_num, mo_num, point_num, shell_num
6256-
real(c_double) , intent(in) :: forces_ao_value(3,ao_num,point_num,nucl_num)
6252+
real(c_double) , intent(in) :: forces_ao_value(ao_num,3,point_num,nucl_num)
62576253
real(c_double) , intent(in) :: coefficient_t(mo_num,ao_num)
62586254
integer (c_int64_t) , intent(in) :: nucleus_index(nucl_num)
62596255
integer (c_int64_t) , intent(in) :: nucleus_shell_num(nucl_num)
62606256
integer (c_int32_t) , intent(in) :: shell_ang_mom(shell_num)
6261-
real(c_double) , intent(out) :: forces_mo_value(3,mo_num,point_num,nucl_num)
6257+
real(c_double) , intent(out) :: forces_mo_value(mo_num,3,point_num,nucl_num)
62626258

62636259

62646260
integer*8 :: i,j,a, m, ishell_start, ishell_end, il, ishell
@@ -6287,29 +6283,26 @@ integer(qmckl_exit_code) function qmckl_compute_forces_mo_value_doc(context, &
62876283

62886284

62896285
info = QMCKL_SUCCESS
6290-
forces_mo_value = 0.0d0
62916286
do a=1,nucl_num
62926287
ishell_start = nucleus_index(a) + 1
62936288
ishell_end = nucleus_index(a) + nucleus_shell_num(a)
62946289
do j=1,point_num
6290+
forces_mo_value(:,:,j,a) = 0.0d0
62956291
do ishell = ishell_start, ishell_end
6296-
k = ao_index(ishell)
62976292
l = shell_ang_mom(ishell)
6298-
do il = lstart(l), lstart(l+1)-1
6299-
c1 = forces_ao_value(1,k,j,a)
6300-
c2 = forces_ao_value(2,k,j,a)
6301-
c3 = forces_ao_value(3,k,j,a)
6293+
do k=ao_index(ishell), ao_index(ishell) + lstart(l+1)-lstart(l)-1
6294+
c1 = forces_ao_value(k,1,j,a)
6295+
c2 = forces_ao_value(k,2,j,a)
6296+
c3 = forces_ao_value(k,3,j,a)
63026297
if (c1 == 0.d0 .and. c2 == 0.d0 .and. c3 == 0.d0) then
6303-
k = k + 1
63046298
cycle
63056299
end if
63066300
do i=1,mo_num
63076301
coef = coefficient_t(i,k)
6308-
forces_mo_value(1,i,j,a) = forces_mo_value(1,i,j,a) + coef * c1
6309-
forces_mo_value(2,i,j,a) = forces_mo_value(2,i,j,a) + coef * c2
6310-
forces_mo_value(3,i,j,a) = forces_mo_value(3,i,j,a) + coef * c3
6302+
forces_mo_value(i,1,j,a) = forces_mo_value(i,1,j,a) + c1
6303+
forces_mo_value(i,2,j,a) = forces_mo_value(i,2,j,a) + c2
6304+
forces_mo_value(i,3,j,a) = forces_mo_value(i,3,j,a) + c3
63116305
end do
6312-
k = k + 1
63136306
end do
63146307
end do
63156308
end do
@@ -6426,14 +6419,15 @@ free(temp_coord);
64266419
free(mo_output);
64276420

64286421

6429-
for (int j = 0; j < mo_num; j++){
6422+
for (int a = 0; a < nucl_num; a++) {
64306423
for (int i = 0; i < point_num; i++){
6431-
for (int a = 0; a < nucl_num; a++) {
6432-
for (int k = 0; k < 3; k++){
6424+
for (int k = 0; k < 3; k++){
6425+
for (int j = 0; j < mo_num; j++){
64336426
//printf("k=%i a=%i i=%i j=%i\n", k, a, i, j);
64346427
//printf("%.10f\t", finite_difference_force_mo_value[k*mo_num*point_num*nucl_num + a*mo_num*point_num + i*mo_num + j]);
64356428
//printf("%.10f\n", forces_mo_value[a*3*mo_num*point_num + k*mo_num*point_num + i*mo_num + j]);
6436-
assert(fabs(finite_difference_force_mo_value[k*mo_num*point_num*nucl_num + a*mo_num*point_num + i*mo_num + j] - forces_mo_value[a*3*mo_num*point_num + i*mo_num*3 + j*3 + k]) < 1.e-9);
6429+
assert(fabs(finite_difference_force_mo_value[k*mo_num*point_num*nucl_num + a*mo_num*point_num + i*mo_num + j] -
6430+
forces_mo_value[a*3*mo_num*point_num + i*mo_num*3 + k*mo_num + j]) < 1.e-9);
64376431
}
64386432
}
64396433
}

0 commit comments

Comments
 (0)