@@ -5809,7 +5809,7 @@ qmckl_exit_code qmckl_provide_forces_ao_value(qmckl_context context)
5809
5809
| ~shell_ang_mom~ | ~int32_t[shell_num]~ | in | Angular momentum of each shell |
5810
5810
| ~ao_factor~ | ~double[ao_num]~ | in | Normalization factor of the AOs |
5811
5811
| ~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 |
5813
5813
|---------------------+------------------------------------------+--------+----------------------------------------------|
5814
5814
5815
5815
#+begin_src f90 :comments org :tangle (eval f) :noweb yes
@@ -5831,7 +5831,7 @@ function qmckl_compute_forces_ao_value_doc(context, &
5831
5831
integer (c_int32_t) , intent(in) :: shell_ang_mom(shell_num)
5832
5832
real (c_double ) , intent(in) :: ao_factor(ao_num)
5833
5833
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)
5835
5835
integer(qmckl_exit_code) :: info
5836
5836
5837
5837
integer :: l, il, k
@@ -5844,7 +5844,7 @@ function qmckl_compute_forces_ao_value_doc(context, &
5844
5844
integer , allocatable :: ao_index(:)
5845
5845
allocate(ao_index(ao_num))
5846
5846
5847
- ! forces_ao_value = 0.d0
5847
+ forces_ao_value = 0.d0
5848
5848
5849
5849
! Pre-computed data
5850
5850
do l=0,20
@@ -5870,15 +5870,11 @@ function qmckl_compute_forces_ao_value_doc(context, &
5870
5870
ishell_start = nucleus_index(inucl) + 1
5871
5871
ishell_end = nucleus_index(inucl) + nucleus_shell_num(inucl)
5872
5872
do ishell = ishell_start, ishell_end
5873
- k = ao_index(ishell)
5874
5873
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)
5882
5878
end do
5883
5879
end do
5884
5880
end do
@@ -5982,15 +5978,15 @@ free(temp_coord);
5982
5978
free(ao_output);
5983
5979
5984
5980
5985
- for (int j = 0; j < ao_num; j ++){
5981
+ for (int a = 0; a < nucl_num; a ++) {
5986
5982
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);
5994
5990
}
5995
5991
}
5996
5992
}
@@ -6238,8 +6234,8 @@ qmckl_exit_code qmckl_provide_forces_mo_value(qmckl_context context)
6238
6234
| ~nucleus_shell_num~ | ~int64_t[nucl_num]~ | in | Number of shells per nucleus |
6239
6235
| ~shell_ang_mom~ | ~int32_t[shell_num]~ | in | Angular momentum of each shell |
6240
6236
| ~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 |
6243
6239
|---------------------+------------------------------------------+--------+-------------------------------------------------|
6244
6240
6245
6241
@@ -6253,12 +6249,12 @@ integer(qmckl_exit_code) function qmckl_compute_forces_mo_value_doc(context, &
6253
6249
implicit none
6254
6250
integer(qmckl_context), intent(in) :: context
6255
6251
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)
6257
6253
real(c_double) , intent(in) :: coefficient_t(mo_num,ao_num)
6258
6254
integer (c_int64_t) , intent(in) :: nucleus_index(nucl_num)
6259
6255
integer (c_int64_t) , intent(in) :: nucleus_shell_num(nucl_num)
6260
6256
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)
6262
6258
6263
6259
6264
6260
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, &
6287
6283
6288
6284
6289
6285
info = QMCKL_SUCCESS
6290
- forces_mo_value = 0.0d0
6291
6286
do a=1,nucl_num
6292
6287
ishell_start = nucleus_index(a) + 1
6293
6288
ishell_end = nucleus_index(a) + nucleus_shell_num(a)
6294
6289
do j=1,point_num
6290
+ forces_mo_value(:,:,j,a) = 0.0d0
6295
6291
do ishell = ishell_start, ishell_end
6296
- k = ao_index(ishell)
6297
6292
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)
6302
6297
if (c1 == 0.d0 .and. c2 == 0.d0 .and. c3 == 0.d0) then
6303
- k = k + 1
6304
6298
cycle
6305
6299
end if
6306
6300
do i=1,mo_num
6307
6301
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
6311
6305
end do
6312
- k = k + 1
6313
6306
end do
6314
6307
end do
6315
6308
end do
@@ -6426,14 +6419,15 @@ free(temp_coord);
6426
6419
free(mo_output);
6427
6420
6428
6421
6429
- for (int j = 0; j < mo_num; j ++){
6422
+ for (int a = 0; a < nucl_num; a ++) {
6430
6423
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 ++){
6433
6426
//printf("k=%i a=%i i=%i j=%i\n", k, a, i, j);
6434
6427
//printf("%.10f\t", finite_difference_force_mo_value[k*mo_num*point_num*nucl_num + a*mo_num*point_num + i*mo_num + j]);
6435
6428
//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);
6437
6431
}
6438
6432
}
6439
6433
}
0 commit comments