@@ -678,25 +678,32 @@ for (int64_t i=0 ; i<3*elec_num*walk_num ; ++i) {
678
678
*** Get
679
679
680
680
#+begin_src c :comments org :tangle (eval h_func) :noweb yes
681
- qmckl_exit_code qmckl_get_electron_ee_distance(qmckl_context context, double* const distance);
681
+ qmckl_exit_code
682
+ qmckl_get_electron_ee_distance(qmckl_context context,
683
+ double* const distance,
684
+ const int64_t size_max);
682
685
#+end_src
683
686
684
687
#+begin_src f90 :tangle (eval fh_func) :comments org :exports none
685
688
interface
686
- integer(c_int32_t) function qmckl_get_electron_ee_distance(context, distance) &
689
+ integer(c_int32_t) function qmckl_get_electron_ee_distance(context, distance, size_max ) &
687
690
bind(C)
688
691
use, intrinsic :: iso_c_binding
689
692
import
690
693
implicit none
691
694
integer (c_int64_t) , intent(in) , value :: context
692
695
real (c_double ) , intent(out) :: distance(*)
696
+ integer (c_int64_t) , intent(in) :: size_max
693
697
end function
694
698
end interface
695
699
#+end_src
696
700
697
701
698
702
#+begin_src c :comments org :tangle (eval c) :noweb yes :exports none
699
- qmckl_exit_code qmckl_get_electron_ee_distance(qmckl_context context, double* const distance)
703
+ qmckl_exit_code
704
+ qmckl_get_electron_ee_distance(qmckl_context context,
705
+ double* const distance,
706
+ const int64_t size_max)
700
707
{
701
708
if (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) {
702
709
return QMCKL_NULL_CONTEXT;
@@ -707,10 +714,23 @@ qmckl_exit_code qmckl_get_electron_ee_distance(qmckl_context context, double* co
707
714
rc = qmckl_provide_ee_distance(context);
708
715
if (rc != QMCKL_SUCCESS) return rc;
709
716
717
+ if (distance == NULL) {
718
+ return qmckl_failwith( context,
719
+ QMCKL_INVALID_ARG_2,
720
+ "qmckl_get_electron_ee_distance",
721
+ "distance is a null pointer");
722
+ }
723
+
710
724
qmckl_context_struct* const ctx = (qmckl_context_struct*) context;
711
725
assert (ctx != NULL);
712
726
713
- size_t sze = ctx->electron.num * ctx->electron.num * ctx->electron.walker.num;
727
+ const int64_t sze = ctx->electron.num * ctx->electron.num * ctx->electron.walker.num;
728
+ if (size_max < sze) {
729
+ return qmckl_failwith( context,
730
+ QMCKL_INVALID_ARG_3,
731
+ "qmckl_get_electron_ee_distance",
732
+ "size_max < num*num*walk_num");
733
+ }
714
734
memcpy(distance, ctx->electron.ee_distance, sze * sizeof(double));
715
735
716
736
return QMCKL_SUCCESS;
@@ -901,7 +921,7 @@ assert(qmckl_electron_provided(context));
901
921
902
922
903
923
double ee_distance[walk_num * elec_num * elec_num];
904
- rc = qmckl_get_electron_ee_distance(context, ee_distance);
924
+ rc = qmckl_get_electron_ee_distance(context, ee_distance, walk_num * elec_num * elec_num );
905
925
906
926
// (e1,e2,w)
907
927
// (0,0,0) == 0.
0 commit comments