From 1504330500915ff03ff0fd86c69355c0ee8b1f56 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Wed, 19 May 2021 00:28:56 +0200 Subject: [PATCH] Added 'N' and 'T' in coord --- Makefile.am | 10 +- org/chbrclf.png | Bin 0 -> 28859 bytes org/qmckl_distance.org | 36 +-- org/qmckl_electron.org | 148 ++++++--- org/qmckl_nucleus.org | 220 +++++++------ org/qmckl_tests.org | 677 +++++++++++++++++++++++++++++++++++++++++ org/qmckl_utils.org | 229 ++++++++++++++ org/table_of_contents | 2 + 8 files changed, 1164 insertions(+), 158 deletions(-) create mode 100644 org/chbrclf.png create mode 100644 org/qmckl_tests.org create mode 100644 org/qmckl_utils.org diff --git a/Makefile.am b/Makefile.am index 1ff940b..7f735dd 100644 --- a/Makefile.am +++ b/Makefile.am @@ -52,6 +52,7 @@ test_qmckl_f = tests/qmckl_f.f90 test_qmckl_fo = tests/qmckl_f.o src_qmckl_f = src/qmckl_f.f90 src_qmckl_fo = src/qmckl_f.o +header_tests = tests/chbrclf.h fortrandir = $(datadir)/$(PACKAGE_NAME)/fortran/ dist_fortran_DATA = $(qmckl_f) @@ -59,12 +60,11 @@ dist_fortran_DATA = $(qmckl_f) AM_CPPFLAGS = -I$(srcdir)/src -I$(srcdir)/include lib_LTLIBRARIES = src/libqmckl.la -src_libqmckl_la_SOURCES = $(qmckl_h) $(src_qmckl_f) $(C_FILES) $(F_FILES) $(H_PRIVATE_FUNC_FILES) $(H_PRIVATE_TYPE_FILES) +src_libqmckl_la_SOURCES = $(qmckl_h) $(src_qmckl_f) $(C_FILES) $(F_FILES) $(H_PRIVATE_FUNC_FILES) $(H_PRIVATE_TYPE_FILES) $(header_tests) export qmckl_f qmckl_h srcdir -CLEANFILES+=$(test_qmckl_f) $(src_qmckl_f) $(test_qmckl_o) $(src_qmckl_o) \ - $(qmckl_h) $(qmckl_f) +CLEANFILES+=$(test_qmckl_f) $(src_qmckl_f) $(test_qmckl_o) $(src_qmckl_o) htmlize_el=share/doc/qmckl/html/htmlize.el @@ -107,9 +107,9 @@ if QMCKL_DEVEL dist_src_DATA = $(ORG_FILES) $(TANGLED_FILES) $(EXPORTED_FILES) -BUILT_SOURCES = $(C_FILES) $(F_FILES) $(FH_FUNC_FILES) $(FH_TYPE_FILES) $(H_FUNC_FILES) $(H_TYPE_FILES) $(H_PRIVATE_FUNC_FILES) $(H_PRIVATE_TYPE_FILES) $(qmckl_f) $(qmckl_h) +BUILT_SOURCES = $(C_FILES) $(F_FILES) $(FH_FUNC_FILES) $(FH_TYPE_FILES) $(H_FUNC_FILES) $(H_TYPE_FILES) $(H_PRIVATE_FUNC_FILES) $(H_PRIVATE_TYPE_FILES) $(qmckl_f) $(qmckl_h) $(header_tests) -CLEANFILES += $(BUILT_SOURCES) $(C_TEST_FILES) $(F_TEST_FILES) $(TANGLED_FILES) $(C_TEST_FILES) $(F_TEST_FILES) $(qmckl_f) $(qmckl_h) $(HTML_FILES) $(TEXT_FILES) share/doc/qmckl/html/index.html $(EXPORTED_FILES) +CLEANFILES += $(BUILT_SOURCES) $(C_TEST_FILES) $(F_TEST_FILES) $(TANGLED_FILES) $(C_TEST_FILES) $(F_TEST_FILES) $(qmckl_f) $(qmckl_h) $(HTML_FILES) $(TEXT_FILES) share/doc/qmckl/html/index.html $(EXPORTED_FILES) $(header_tests) EXTRA_DIST += \ tools/build_doc.sh \ diff --git a/org/chbrclf.png b/org/chbrclf.png new file mode 100644 index 0000000000000000000000000000000000000000..ab8d3fbf748bb0791ca96888708f71241d462c85 GIT binary patch literal 28859 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.uninitialized & mask) != 0) { @@ -137,7 +141,7 @@ if ( (ctx->electron.uninitialized & mask) != 0) { #+end_src *** Number of electrons - + #+begin_src c :comments org :tangle (eval h_func) :exports none qmckl_exit_code qmckl_get_electron_num (const qmckl_context context, int64_t* num); qmckl_exit_code qmckl_get_electron_up_num (const qmckl_context context, int64_t* up_num); @@ -211,10 +215,10 @@ qmckl_get_electron_down_num (const qmckl_context context, int64_t* down_num) { #+end_src *** Number of walkers - + A walker is a set of electron coordinates that are arguments of the wave function. ~walk_num~ is the number of walkers. - + #+begin_src c :comments org :tangle (eval h_func) :exports none qmckl_exit_code qmckl_get_electron_walk_num (const qmckl_context context, int64_t* walk_num); #+end_src @@ -242,12 +246,12 @@ qmckl_get_electron_walk_num (const qmckl_context context, int64_t* walk_num) { #+end_src *** Electron coordinates - + Returns the current electron coordinates. The pointer is assumed to point on a memory block of size ~3 * elec_num * walk_num~. In C the order of the indices is ~[walk_num][3][elec_num]~ and in Fortran it is ~(elec_num,3,walk_num)~. - + #+begin_src c :comments org :tangle (eval h_func) :exports none qmckl_exit_code qmckl_get_electron_coord (const qmckl_context context, double* coord); #+end_src @@ -273,7 +277,6 @@ qmckl_get_electron_coord (const qmckl_context context, double* elec_coord) { } #+end_src - ** Initialization functions @@ -451,25 +454,34 @@ qmckl_set_electron_coord(qmckl_context context, const double* coord) { ** Test - #+begin_src c :tangle (eval c_test) + #+begin_src python :results output :exports none :tangle none +import numpy as np + + #+end_src + + #+begin_src c :tangle (eval c_test) /* Reference input data */ +const int64_t walk_num = chbrclf_walk_num; +const int64_t elec_num = chbrclf_elec_num; +const int64_t elec_up_num = chbrclf_elec_up_num; +const int64_t elec_dn_num = chbrclf_elec_dn_num; +const double*** elec_coord = chbrclf_elec_coord; -#define up_num ((int64_t) 3) -#define down_num ((int64_t) 2) -#define walk_num ((int64_t) 2) -#define num (up_num+down_num) +const int64_t nucl_num = chbrclf_nucl_num; +const double* charge = chbrclf_charge; +const double** nucl_coord = chbrclf_nucl_coord; -double coord[walk_num*3*num] = - { 7.303633091022677881e+00, 1.375868694453235719e+01, 1.167371490471771217e-01, - 4.547755371567960836e+00, 3.245907105524011182e+00, 2.410764357550297110e-01, - 5.932816068137344523e+00, 1.491671465549257469e+01, 3.825374039119375236e-01, - 7.347336142660052083e+00, 1.341946976062362129e+00, 1.648917914228352322e+00, - 5.735221530102248444e+00, 1.064667491680036271e+01, 4.227201772236627297e-01, - 8.099550978782254163e+00, 6.861498941099086757e+00, 4.015884841159429036e-02, - 1.014757367558326173e+01, 5.219335322173662917e+00, 5.037004126899931322e-02, - 1.484094322159507051e+01, 9.777903829455864226e+00, 5.243007994024882767e-02, - 9.081723054990456845e+00, 5.499568496038920173e+00, 2.910446438899221347e-02, - 2.583154239492383653e+00, 1.442282811294904432e+00, 6.387191629878670451e-02 }; +double* coord = (double*) malloc(walk_num*num*3*sizeof(double)); + +double* x = coord; +for (int i=0 ; inucleus.uninitialized & mask) != 0) { #+begin_src c :comments org :tangle (eval c) :noweb yes :exports none qmckl_exit_code -qmckl_get_nucleus_num (const qmckl_context context, int64_t* num) { +qmckl_get_nucleus_num (const qmckl_context context, int64_t* const num) { if (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) { return QMCKL_INVALID_CONTEXT; } + if (num == NULL) { + return qmckl_failwith( context, + QMCKL_INVALID_ARG_2, + "qmckl_get_nucleus_num", + "num is a null pointer"); + } + qmckl_context_struct* const ctx = (qmckl_context_struct* const) context; assert (ctx != NULL); int32_t mask = 1 << 0; if ( (ctx->nucleus.uninitialized & mask) != 0) { - return QMCKL_NOT_PROVIDED; + return qmckl_failwith( context, + QMCKL_NOT_PROVIDED, + "qmckl_get_nucleus_num", + "nucleus data is not provided"); } assert (ctx->nucleus.num >= (int64_t) 0); @@ -130,19 +143,29 @@ qmckl_get_nucleus_num (const qmckl_context context, int64_t* num) { qmckl_exit_code -qmckl_get_nucleus_charge (const qmckl_context context, double* charge) { +qmckl_get_nucleus_charge (const qmckl_context context, double* const charge) { if (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) { return QMCKL_INVALID_CONTEXT; } + if (charge == NULL) { + return qmckl_failwith( context, + QMCKL_INVALID_ARG_2, + "qmckl_get_nucleus_charge", + "charge is a null pointer"); + } + qmckl_context_struct* const ctx = (qmckl_context_struct* const) context; assert (ctx != NULL); int32_t mask = 1 << 1; if ( (ctx->nucleus.uninitialized & mask) != 0) { - return QMCKL_NOT_PROVIDED; + return qmckl_failwith( context, + QMCKL_NOT_PROVIDED, + "qmckl_get_nucleus_charge", + "nucleus data is not provided"); } assert (ctx->nucleus.charge != NULL); @@ -151,24 +174,37 @@ qmckl_get_nucleus_charge (const qmckl_context context, double* charge) { qmckl_exit_code rc; rc = qmckl_get_nucleus_num(context, &nucl_num); if (rc != QMCKL_SUCCESS) return rc; - - double* result = memcpy(charge, ctx->nucleus.charge, nucl_num*sizeof(double)); - if (result == NULL) return QMCKL_FAILURE; - + + memcpy(charge, ctx->nucleus.charge, nucl_num*sizeof(double)); + return QMCKL_SUCCESS; } qmckl_exit_code -qmckl_get_nucleus_coord (const qmckl_context context, double* coord) { - +qmckl_get_nucleus_coord (const qmckl_context context, const char transp, double* const coord) { + if (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) { return QMCKL_INVALID_CONTEXT; } + if (transp != 'N' && transp != 'T') { + return qmckl_failwith( context, + QMCKL_INVALID_ARG_2, + "qmckl_get_nucleus_coord", + "transp should be 'N' or 'T'"); + } + + if (coord == NULL) { + return qmckl_failwith( context, + QMCKL_INVALID_ARG_3, + "qmckl_get_nucleus_coord", + "coord is a null pointer"); + } + qmckl_context_struct* const ctx = (qmckl_context_struct* const) context; assert (ctx != NULL); - + int32_t mask = 1 << 2; if ( (ctx->nucleus.uninitialized & mask) != 0) { @@ -179,12 +215,18 @@ qmckl_get_nucleus_coord (const qmckl_context context, double* coord) { qmckl_exit_code rc; rc = qmckl_get_nucleus_num(context, &nucl_num); if (rc != QMCKL_SUCCESS) return rc; - + assert (ctx->nucleus.coord != NULL); - double* result = memcpy(coord, ctx->nucleus.coord, 3*nucl_num*sizeof(double)); - if (result == NULL) return QMCKL_FAILURE; - + if (transp == 'N') { + rc = qmckl_transpose(context, nucl_num, 3, + ctx->nucleus.coord, nucl_num, + coord, 3); + if (rc != QMCKL_SUCCESS) return rc; + } else { + memcpy(coord, ctx->nucleus.coord, 3*nucl_num*sizeof(double)); + } + return QMCKL_SUCCESS; } #+end_src @@ -218,7 +260,7 @@ bool qmckl_nucleus_provided(const qmckl_context context) { #+begin_src c :comments org :tangle (eval h_func) qmckl_exit_code qmckl_set_nucleus_num (qmckl_context context, const int64_t num); qmckl_exit_code qmckl_set_nucleus_charge (qmckl_context context, const double* charge); -qmckl_exit_code qmckl_set_nucleus_coord (qmckl_context context, const double* coord); +qmckl_exit_code qmckl_set_nucleus_coord (qmckl_context context, const char transp, const double* coord); #+end_src #+NAME:pre2 @@ -240,7 +282,7 @@ return QMCKL_SUCCESS; To set the number of nuclei, use - + #+begin_src c :comments org :tangle (eval c) :noweb yes :exports none qmckl_exit_code qmckl_set_nucleus_num(qmckl_context context, const int64_t num) { @@ -261,13 +303,20 @@ qmckl_set_nucleus_num(qmckl_context context, const int64_t num) { } #+end_src - The following function sets the nuclear charges of all the atoms. + The following function sets the nuclear charges of all the atoms. #+begin_src c :comments org :tangle (eval c) :noweb yes :exports none qmckl_exit_code qmckl_set_nucleus_charge(qmckl_context context, const double* charge) { <> + if (charge == NULL) { + return qmckl_failwith( context, + QMCKL_INVALID_ARG_2, + "qmckl_set_nucleus_charge", + "charge is a null pointer"); + } + int64_t num; qmckl_exit_code rc; @@ -275,7 +324,7 @@ qmckl_set_nucleus_charge(qmckl_context context, const double* charge) { rc = qmckl_get_nucleus_num(context, &num); if (rc != QMCKL_SUCCESS) return rc; - + if (ctx->nucleus.charge != NULL) { qmckl_free(context, ctx->nucleus.charge); ctx->nucleus.charge= NULL; @@ -294,7 +343,7 @@ qmckl_set_nucleus_charge(qmckl_context context, const double* charge) { } ctx->nucleus.charge= memcpy(ctx->nucleus.charge, charge, num*sizeof(double)); assert (ctx->nucleus.charge != NULL); - + <> } #+end_src @@ -304,24 +353,24 @@ qmckl_set_nucleus_charge(qmckl_context context, const double* charge) { #+begin_src c :comments org :tangle (eval c) :noweb yes :exports none qmckl_exit_code -qmckl_set_nucleus_coord(qmckl_context context, const double* coord) { +qmckl_set_nucleus_coord(qmckl_context context, const char transp, const double* coord) { <> - int64_t num; + int64_t nucl_num; qmckl_exit_code rc; int32_t mask = 1 << 2; - rc = qmckl_get_nucleus_num(context, &num); + rc = qmckl_get_nucleus_num(context, &nucl_num); if (rc != QMCKL_SUCCESS) return rc; - + if (ctx->nucleus.coord != NULL) { qmckl_free(context, ctx->nucleus.coord); ctx->nucleus.coord = NULL; } qmckl_memory_info_struct mem_info = qmckl_memory_info_struct_zero; - mem_info.size = 3*num*sizeof(double); + mem_info.size = 3*nucl_num*sizeof(double); assert(ctx->nucleus.coord == NULL); @@ -332,9 +381,15 @@ qmckl_set_nucleus_coord(qmckl_context context, const double* coord) { "qmckl_set_nucleus_coord", NULL); } - ctx->nucleus.coord = memcpy(ctx->nucleus.coord, coord, 3*num*sizeof(double)); - assert (ctx->nucleus.coord != NULL); - + if (transp == 'N') { + rc = qmckl_transpose(context, 3, nucl_num, + coord, 3, + ctx->nucleus.coord, nucl_num); + if (rc != QMCKL_SUCCESS) return rc; + } else { + memcpy(ctx->nucleus.coord, coord, 3*nucl_num*sizeof(double)); + } + <> } #+end_src @@ -342,23 +397,10 @@ qmckl_set_nucleus_coord(qmckl_context context, const double* coord) { ** Test #+begin_src c :tangle (eval c_test) -/* Reference input data */ +const int64_t nucl_num = chbrclf_nucl_num; +const double* nucl_charge = chbrclf_charge; +const double* nucl_coord = &(chbrclf_nucl_coord[0][0]); -#define num ((int64_t) 9) - -double charge[num] = { 6., 6., 6., 7., 7., 1., 1., 1., 1. }; - -double coord[3*num] = - { 4.166279566732572e-01, -1.526183863767697e+00, 1.041604719335635e+00, - -1.903457631371503e+00, 2.242154435363994e+00, 6.550163404813796e-01, - -3.575005445908036e+00, -3.063638942318878e+00, 2.086739409279095e+00, - 2.060062599100338e+00, -1.623431626827498e+00, -1.930074272670425e+00, - 9.491495662916423e-01, 3.808343139803397e-01, 4.077482772289367e+00, - 1.841031662652821e+00, -2.945591662994877e+00, -3.670011011125464e+00, - 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, - 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, - 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00}; - /* --- */ qmckl_exit_code rc; @@ -370,42 +412,50 @@ rc = qmckl_get_nucleus_num (context, &n); assert(rc == QMCKL_NOT_PROVIDED); -rc = qmckl_set_nucleus_num (context, num); +rc = qmckl_set_nucleus_num (context, nucl_num); assert(rc == QMCKL_SUCCESS); assert(!qmckl_nucleus_provided(context)); rc = qmckl_get_nucleus_num (context, &n); assert(rc == QMCKL_SUCCESS); -assert(n == num); +assert(n == nucl_num); -double coord2[3*num]; +double nucl_coord2[3*nucl_num]; -rc = qmckl_get_nucleus_coord (context, coord2); +rc = qmckl_get_nucleus_coord (context, 'T', nucl_coord2); assert(rc == QMCKL_NOT_PROVIDED); -rc = qmckl_set_nucleus_coord (context, coord); +rc = qmckl_set_nucleus_coord (context, 'T', &(nucl_coord[0])); assert(rc == QMCKL_SUCCESS); -rc = qmckl_get_nucleus_coord (context, coord2); -assert(rc == QMCKL_SUCCESS); -for (size_t i=0 ; i<3*num ; ++i) { - assert( coord[i] == coord2[i] ); - } - assert(!qmckl_nucleus_provided(context)); -double charge2[num]; +rc = qmckl_get_nucleus_coord (context, 'N', nucl_coord2); +assert(rc == QMCKL_SUCCESS); +for (size_t k=0 ; k<3 ; ++k) { + for (size_t i=0 ; inucleus.provided) return QMCKL_NOT_PROVIDED; - + /* Allocate array */ if (ctx->nucleus.nn_distance == NULL) { - + qmckl_memory_info_struct mem_info = qmckl_memory_info_struct_zero; mem_info.size = ctx->nucleus.num * ctx->nucleus.num * sizeof(double); double* nn_distance = (double*) qmckl_malloc(context, mem_info); - + if (nn_distance == NULL) { return qmckl_failwith( context, QMCKL_ALLOCATION_FAILED, @@ -547,7 +597,7 @@ qmckl_exit_code qmckl_compute_nn_distance ( double* const nn_distance ); #+end_src - + #+CALL: generate_c_interface(table=qmckl_nn_distance_args,rettyp="qmckl_exit_code",fname="qmckl_compute_nn_distance") #+RESULTS: @@ -578,12 +628,11 @@ qmckl_exit_code qmckl_compute_nn_distance ( assert(qmckl_nucleus_provided(context)); -double distance[num*num]; -rc = qmckl_get_nucleus_nn_distance(context, distance); +double distance[nucl_num*nucl_num]; rc = qmckl_get_nucleus_nn_distance(context, distance); assert(distance[0] == 0.); -assert(distance[1] == distance[num]); -assert(fabs(distance[1]-4.164450441785663) < 1.e-12); +assert(distance[1] == distance[nucl_num]); +assert(fabs(distance[1]-2.070304721365169) < 1.e-12); #+end_src @@ -642,7 +691,7 @@ qmckl_exit_code qmckl_provide_nucleus_repulsion(qmckl_context context) rc = qmckl_provide_nn_distance(context); if (rc != QMCKL_SUCCESS) return rc; - + rc = qmckl_compute_nucleus_repulsion(context, ctx->nucleus.num, ctx->nucleus.charge, @@ -651,7 +700,7 @@ qmckl_exit_code qmckl_provide_nucleus_repulsion(qmckl_context context) if (rc != QMCKL_SUCCESS) { return rc; } - + ctx->nucleus.repulsion_date = ctx->date; return QMCKL_SUCCESS; @@ -695,10 +744,9 @@ integer function qmckl_compute_nucleus_repulsion_f(context, nucl_num, charge, nn energy = 0.d0 do j=2, nucl_num do i=1, j-1 - energy = energy + charge(i) * charge(j) / nn_distance(i,j) + energy = energy + charge(i) * charge(j) / nn_distance(i,j) end do end do - print *, energy end function qmckl_compute_nucleus_repulsion_f #+end_src @@ -746,7 +794,7 @@ assert(qmckl_nucleus_provided(context)); double rep; rc = qmckl_get_nucleus_repulsion(context, &rep); -assert(rep - 163.50434957121263 < 1.e-10); +assert(rep - 318.2309879436158 < 1.e-10); #+end_src @@ -787,8 +835,6 @@ assert(rep - 163.50434957121263 < 1.e-10); #+end_src #+RESULTS: - | | color | - | | listings | # -*- mode: org -*- diff --git a/org/qmckl_tests.org b/org/qmckl_tests.org new file mode 100644 index 0000000..c9e48d3 --- /dev/null +++ b/org/qmckl_tests.org @@ -0,0 +1,677 @@ +#+TITLE: Data for Tests + +# -*- org-image-actual-width: 300 -*- + +* CHBrClF + + This test is the all-electron Hartree-Fock wave function of CHClBr, + in the aug-cc-pVTZ basis set. This is a non-symmetric molecule made + of 5 atoms, heavy and light one. The aug-cc-pVTZ basis set has both + diffuse and compact Gaussians, with large and small contractions, + and with a high maximum angular momentum. + + [[./chbrclf.png]] + + | Number of atoms | 5 | + | Number of alpha electrons | 34 | + | Number of beta electrons | 34 | + | Max number of primitives | 15 | + | Highest angular momentum | F | + | Atomic basis set | aug-cc-pVTZ | + | Nuclear repulsion energy | 318.2309879436158 | + | Number of primitives | 502 | + | Number of cartesian basis functions | 263 | + | Number of molecular orbitals | 224 | + | Hartree-Fock energy | -3169.90467157 Ha | + + +** XYZ coordinates + +#+BEGIN_example + 5 +CHBrClF + C 0.580107 0.471341 0.411546 + H 0.618322 0.595674 1.499355 + F 0.786938 1.650849 -0.204021 +Cl 1.850884 -0.689476 -0.067323 +Br -1.218470 -0.187436 -0.028227 +#+END_example + + Nuclear coordinates are stored in atomic units in transposed format. + +#+begin_src c :tangle ../tests/chbrclf.h +#define chbrclf_nucl_num ((int64_t) 5) + +const double chbrclf_charge[chbrclf_nucl_num] = { 6., 1., 9., 17., 35. }; + +const double chbrclf_nucl_coord[3][chbrclf_nucl_num] = +{ { 1.096243353458458e+00, 1.168459237342663e+00, 1.487097297712132e+00, 3.497663849983889e+00, -2.302574592081335e+00 }, + { 8.907054016973815e-01, 1.125660720053393e+00, 3.119652484478797e+00, -1.302920810073182e+00, -3.542027060505035e-01 }, + { 7.777092280258892e-01, 2.833370314829343e+00, -3.855438138411500e-01, -1.272220319439064e-01, -5.334129934317614e-02 } }; +#+end_src + +** Atomic basis set + +#+BEGIN_example +HYDROGEN +S 5 +1 3.387000E+01 6.068000E-03 +2 5.095000E+00 4.530800E-02 +3 1.159000E+00 2.028220E-01 +4 3.258000E-01 5.039030E-01 +5 1.027000E-01 3.834210E-01 +S 1 +1 3.258000E-01 1.000000E+00 +S 1 +1 1.027000E-01 1.000000E+00 +S 1 +1 0.0252600 1.0000000 +P 1 +1 1.407000E+00 1.000000E+00 +P 1 +1 3.880000E-01 1.000000E+00 +P 1 +1 0.1020000 1.0000000 +D 1 +1 1.057000E+00 1.0000000 +D 1 +1 0.2470000 1.0000000 + +CARBON +S 10 +1 8.236000E+03 5.310000E-04 +2 1.235000E+03 4.108000E-03 +3 2.808000E+02 2.108700E-02 +4 7.927000E+01 8.185300E-02 +5 2.559000E+01 2.348170E-01 +6 8.997000E+00 4.344010E-01 +7 3.319000E+00 3.461290E-01 +8 9.059000E-01 3.937800E-02 +9 3.643000E-01 -8.983000E-03 +10 1.285000E-01 2.385000E-03 +S 10 +1 8.236000E+03 -1.130000E-04 +2 1.235000E+03 -8.780000E-04 +3 2.808000E+02 -4.540000E-03 +4 7.927000E+01 -1.813300E-02 +5 2.559000E+01 -5.576000E-02 +6 8.997000E+00 -1.268950E-01 +7 3.319000E+00 -1.703520E-01 +8 9.059000E-01 1.403820E-01 +9 3.643000E-01 5.986840E-01 +10 1.285000E-01 3.953890E-01 +S 1 +1 9.059000E-01 1.000000E+00 +S 1 +1 1.285000E-01 1.000000E+00 +S 1 +1 0.0440200 1.0000000 +P 5 +1 1.871000E+01 1.403100E-02 +2 4.133000E+00 8.686600E-02 +3 1.200000E+00 2.902160E-01 +4 3.827000E-01 5.010080E-01 +5 1.209000E-01 3.434060E-01 +P 1 +1 3.827000E-01 1.000000E+00 +P 1 +1 1.209000E-01 1.000000E+00 +P 1 +1 0.0356900 1.0000000 +D 1 +1 1.097000E+00 1.000000E+00 +D 1 +1 3.180000E-01 1.000000E+00 +D 1 +1 0.1000000 1.0000000 +F 1 +1 7.610000E-01 1.0000000 +F 1 +1 0.2680000 1.0000000 + +FLUORINE +S 10 +1 1.950000E+04 5.070000E-04 +2 2.923000E+03 3.923000E-03 +3 6.645000E+02 2.020000E-02 +4 1.875000E+02 7.901000E-02 +5 6.062000E+01 2.304390E-01 +6 2.142000E+01 4.328720E-01 +7 7.950000E+00 3.499640E-01 +8 2.257000E+00 4.323300E-02 +9 8.815000E-01 -7.892000E-03 +10 3.041000E-01 2.384000E-03 +S 10 +1 1.950000E+04 -1.170000E-04 +2 2.923000E+03 -9.120000E-04 +3 6.645000E+02 -4.717000E-03 +4 1.875000E+02 -1.908600E-02 +5 6.062000E+01 -5.965500E-02 +6 2.142000E+01 -1.400100E-01 +7 7.950000E+00 -1.767820E-01 +8 2.257000E+00 1.716250E-01 +9 8.815000E-01 6.050430E-01 +10 3.041000E-01 3.695120E-01 +S 1 +1 2.257000E+00 1.000000E+00 +S 1 +1 3.041000E-01 1.000000E+00 +S 1 +1 0.0915800 1.0000000 +P 5 +1 4.388000E+01 1.666500E-02 +2 9.926000E+00 1.044720E-01 +3 2.930000E+00 3.172600E-01 +4 9.132000E-01 4.873430E-01 +5 2.672000E-01 3.346040E-01 +P 1 +1 9.132000E-01 1.000000E+00 +P 1 +1 2.672000E-01 1.000000E+00 +P 1 +1 0.0736100 1.0000000 +D 1 +1 3.107000E+00 1.000000E+00 +D 1 +1 8.550000E-01 1.000000E+00 +D 1 +1 0.2920000 1.0000000 +F 1 +1 1.917000E+00 1.0000000 +F 1 +1 0.7240000 1.0000000 + +S 20 +1 1.063900E+07 7.000000E-07 +2 1.593400E+06 5.700000E-06 +3 3.626100E+05 3.030000E-05 +4 1.027000E+05 1.275000E-04 +5 3.350100E+04 4.659000E-04 +6 1.209300E+04 1.509600E-03 +7 4.715900E+03 4.485200E-03 +8 1.955600E+03 1.198350E-02 +9 8.526100E+02 2.895710E-02 +10 3.876700E+02 5.815660E-02 +11 1.826800E+02 8.881330E-02 +12 8.824500E+01 4.452440E-02 +13 3.926300E+01 -2.060387E-01 +14 1.923400E+01 -5.127017E-01 +15 9.405700E+00 -1.509349E-01 +16 4.160100E+00 6.789203E-01 +17 1.899500E+00 5.817697E-01 +18 6.047200E-01 4.675550E-02 +19 3.011400E-01 -1.118250E-02 +20 1.251500E-01 2.440200E-03 +S 20 +1 1.063900E+07 -2.000000E-07 +2 1.593400E+06 -1.800000E-06 +3 3.626100E+05 -9.300000E-06 +4 1.027000E+05 -3.910000E-05 +5 3.350100E+04 -1.428000E-04 +6 1.209300E+04 -4.628000E-04 +7 4.715900E+03 -1.375000E-03 +8 1.955600E+03 -3.678400E-03 +9 8.526100E+02 -8.898100E-03 +10 3.876700E+02 -1.795290E-02 +11 1.826800E+02 -2.757320E-02 +12 8.824500E+01 -1.409530E-02 +13 3.926300E+01 6.725610E-02 +14 1.923400E+01 1.766928E-01 +15 9.405700E+00 5.288610E-02 +16 4.160100E+00 -3.075955E-01 +17 1.899500E+00 -4.700658E-01 +18 6.047200E-01 2.558761E-01 +19 3.011400E-01 6.980341E-01 +20 1.251500E-01 2.967256E-01 +S 1 +1 6.047200E-01 1.000000E+00 +S 1 +1 1.251500E-01 1.000000E+00 +S 1 +1 0.0455930 1.0000000 +P 13 +1 8.676500E+03 4.357000E-04 +2 2.055900E+03 3.781500E-03 +3 6.662300E+02 2.047820E-02 +4 2.531000E+02 7.928340E-02 +5 1.061200E+02 2.178473E-01 +6 4.724200E+01 3.878585E-01 +7 2.182500E+01 3.594350E-01 +8 9.968400E+00 1.121995E-01 +9 4.517100E+00 4.387400E-03 +10 1.998200E+00 1.780900E-03 +11 7.098800E-01 -4.576000E-04 +12 2.814500E-01 2.122000E-04 +13 1.020400E-01 -7.340000E-05 +P 9 +1 6.633000E+02 -6.521450E-04 +2 1.568000E+02 -5.194450E-03 +3 4.998000E+01 -2.469380E-02 +4 1.842000E+01 -7.281670E-02 +5 7.240000E+00 -1.340300E-01 +6 2.922000E+00 -9.477420E-02 +7 1.022000E+00 2.622890E-01 +8 3.818000E-01 5.646670E-01 +9 1.301000E-01 3.412500E-01 +P 1 +1 1.022000E+00 1.000000E+00 +P 1 +1 1.301000E-01 1.000000E+00 +P 1 +1 0.0419000 1.0000000 +D 1 +1 1.046000E+00 1.000000E+00 +D 1 +1 3.440000E-01 1.000000E+00 +D 1 +1 0.1350000 1.0000000 +F 1 +1 7.060000E-01 1.0000000 +F 1 +1 0.3120000 1.0000000 + +CHLORINE +S 15 +1 4.561000E+05 4.929700E-05 +2 6.833000E+04 3.830290E-04 +3 1.555000E+04 2.008540E-03 +4 4.405000E+03 8.385580E-03 +5 1.439000E+03 2.947030E-02 +6 5.204000E+02 8.783250E-02 +7 2.031000E+02 2.114730E-01 +8 8.396000E+01 3.653640E-01 +9 3.620000E+01 3.408840E-01 +10 1.583000E+01 1.021330E-01 +11 6.334000E+00 3.116750E-03 +12 2.694000E+00 1.057510E-03 +13 9.768000E-01 -3.780000E-04 +14 4.313000E-01 1.561360E-04 +15 1.625000E-01 -5.141260E-05 +S 15 +1 4.561000E+05 -1.383040E-05 +2 6.833000E+04 -1.072790E-04 +3 1.555000E+04 -5.650830E-04 +4 4.405000E+03 -2.361350E-03 +5 1.439000E+03 -8.458860E-03 +6 5.204000E+02 -2.596380E-02 +7 2.031000E+02 -6.863620E-02 +8 8.396000E+01 -1.418740E-01 +9 3.620000E+01 -1.993190E-01 +10 1.583000E+01 -1.956620E-02 +11 6.334000E+00 4.997410E-01 +12 2.694000E+00 5.637360E-01 +13 9.768000E-01 7.903250E-02 +14 4.313000E-01 -8.350910E-03 +15 1.625000E-01 2.324560E-03 +S 15 +1 4.561000E+05 4.185460E-06 +2 6.833000E+04 3.243950E-05 +3 1.555000E+04 1.711050E-04 +4 4.405000E+03 7.141760E-04 +5 1.439000E+03 2.567050E-03 +6 5.204000E+02 7.885520E-03 +7 2.031000E+02 2.108670E-02 +8 8.396000E+01 4.422640E-02 +9 3.620000E+01 6.516700E-02 +10 1.583000E+01 6.030120E-03 +11 6.334000E+00 -2.064950E-01 +12 2.694000E+00 -4.058710E-01 +13 9.768000E-01 7.595580E-02 +14 4.313000E-01 7.256610E-01 +15 1.625000E-01 3.944230E-01 +S 1 +1 9.768000E-01 1.000000E+00 +S 1 +1 1.625000E-01 1.000000E+00 +S 1 +1 0.0591000 1.0000000 +P 9 +1 6.633000E+02 2.404480E-03 +2 1.568000E+02 1.921480E-02 +3 4.998000E+01 8.850970E-02 +4 1.842000E+01 2.560200E-01 +5 7.240000E+00 4.369270E-01 +6 2.922000E+00 3.503340E-01 +7 1.022000E+00 5.854950E-02 +8 3.818000E-01 -4.584230E-03 +9 1.301000E-01 2.269700E-03 +P 9 +1 6.633000E+02 -6.521450E-04 +2 1.568000E+02 -5.194450E-03 +3 4.998000E+01 -2.469380E-02 +4 1.842000E+01 -7.281670E-02 +5 7.240000E+00 -1.340300E-01 +6 2.922000E+00 -9.477420E-02 +7 1.022000E+00 2.622890E-01 +8 3.818000E-01 5.646670E-01 +9 1.301000E-01 3.412500E-01 +P 1 +1 1.022000E+00 1.000000E+00 +P 1 +1 1.301000E-01 1.000000E+00 +P 1 +1 0.0419000 1.0000000 +D 1 +1 1.046000E+00 1.000000E+00 +D 1 +1 3.440000E-01 1.000000E+00 +D 1 +1 0.1350000 1.0000000 +F 1 +1 7.060000E-01 1.0000000 +F 1 +1 0.3120000 1.0000000 + +BROMINE +S 20 +1 1.063900E+07 5.900000E-06 +2 1.593400E+06 4.610000E-05 +3 3.626100E+05 2.422000E-04 +4 1.027000E+05 1.022600E-03 +5 3.350100E+04 3.711300E-03 +6 1.209300E+04 1.197850E-02 +7 4.715900E+03 3.469270E-02 +8 1.955600E+03 8.912390E-02 +9 8.526100E+02 1.934557E-01 +10 3.876700E+02 3.209019E-01 +11 1.826800E+02 3.299233E-01 +12 8.824500E+01 1.494121E-01 +13 3.926300E+01 1.499380E-02 +14 1.923400E+01 -9.165000E-04 +15 9.405700E+00 4.380000E-04 +16 4.160100E+00 -2.398000E-04 +17 1.899500E+00 7.360000E-05 +18 6.047200E-01 -3.670000E-05 +19 3.011400E-01 2.390000E-05 +20 1.251500E-01 -5.600000E-06 +S 20 +1 1.063900E+07 -1.900000E-06 +2 1.593400E+06 -1.450000E-05 +3 3.626100E+05 -7.610000E-05 +4 1.027000E+05 -3.210000E-04 +5 3.350100E+04 -1.170900E-03 +6 1.209300E+04 -3.796800E-03 +7 4.715900E+03 -1.123070E-02 +8 1.955600E+03 -2.992770E-02 +9 8.526100E+02 -7.127060E-02 +10 3.876700E+02 -1.403136E-01 +11 1.826800E+02 -2.030763E-01 +12 8.824500E+01 -9.609850E-02 +13 3.926300E+01 3.558086E-01 +14 1.923400E+01 5.921792E-01 +15 9.405700E+00 2.215977E-01 +16 4.160100E+00 1.376480E-02 +17 1.899500E+00 8.395000E-04 +18 6.047200E-01 -4.510000E-05 +19 3.011400E-01 -8.500000E-06 +20 1.251500E-01 -1.240000E-05 +S 20 +1 1.063900E+07 7.000000E-07 +2 1.593400E+06 5.700000E-06 +3 3.626100E+05 3.030000E-05 +4 1.027000E+05 1.275000E-04 +5 3.350100E+04 4.659000E-04 +6 1.209300E+04 1.509600E-03 +7 4.715900E+03 4.485200E-03 +8 1.955600E+03 1.198350E-02 +9 8.526100E+02 2.895710E-02 +10 3.876700E+02 5.815660E-02 +11 1.826800E+02 8.881330E-02 +12 8.824500E+01 4.452440E-02 +13 3.926300E+01 -2.060387E-01 +14 1.923400E+01 -5.127017E-01 +15 9.405700E+00 -1.509349E-01 +16 4.160100E+00 6.789203E-01 +17 1.899500E+00 5.817697E-01 +18 6.047200E-01 4.675550E-02 +19 3.011400E-01 -1.118250E-02 +20 1.251500E-01 2.440200E-03 +S 20 +1 1.063900E+07 -2.000000E-07 +2 1.593400E+06 -1.800000E-06 +3 3.626100E+05 -9.300000E-06 +4 1.027000E+05 -3.910000E-05 +5 3.350100E+04 -1.428000E-04 +6 1.209300E+04 -4.628000E-04 +7 4.715900E+03 -1.375000E-03 +8 1.955600E+03 -3.678400E-03 +9 8.526100E+02 -8.898100E-03 +10 3.876700E+02 -1.795290E-02 +11 1.826800E+02 -2.757320E-02 +12 8.824500E+01 -1.409530E-02 +13 3.926300E+01 6.725610E-02 +14 1.923400E+01 1.766928E-01 +15 9.405700E+00 5.288610E-02 +16 4.160100E+00 -3.075955E-01 +17 1.899500E+00 -4.700658E-01 +18 6.047200E-01 2.558761E-01 +19 3.011400E-01 6.980341E-01 +20 1.251500E-01 2.967256E-01 +S 1 +1 6.047200E-01 1.000000E+00 +S 1 +1 1.251500E-01 1.000000E+00 +S 1 +1 0.0455930 1.0000000 +P 13 +1 8.676500E+03 4.357000E-04 +2 2.055900E+03 3.781500E-03 +3 6.662300E+02 2.047820E-02 +4 2.531000E+02 7.928340E-02 +5 1.061200E+02 2.178473E-01 +6 4.724200E+01 3.878585E-01 +7 2.182500E+01 3.594350E-01 +8 9.968400E+00 1.121995E-01 +9 4.517100E+00 4.387400E-03 +10 1.998200E+00 1.780900E-03 +11 7.098800E-01 -4.576000E-04 +12 2.814500E-01 2.122000E-04 +13 1.020400E-01 -7.340000E-05 +P 13 +1 8.676500E+03 -1.748000E-04 +2 2.055900E+03 -1.526300E-03 +3 6.662300E+02 -8.339900E-03 +4 2.531000E+02 -3.322030E-02 +5 1.061200E+02 -9.541800E-02 +6 4.724200E+01 -1.824026E-01 +7 2.182500E+01 -1.558308E-01 +8 9.968400E+00 1.867899E-01 +9 4.517100E+00 5.427733E-01 +10 1.998200E+00 3.873309E-01 +11 7.098800E-01 4.530690E-02 +12 2.814500E-01 -4.378400E-03 +13 1.020400E-01 1.811100E-03 +P 13 +1 8.676500E+03 4.510000E-05 +2 2.055900E+03 3.964000E-04 +3 6.662300E+02 2.155500E-03 +4 2.531000E+02 8.672000E-03 +5 1.061200E+02 2.486800E-02 +6 4.724200E+01 4.854720E-02 +7 2.182500E+01 3.961560E-02 +8 9.968400E+00 -6.057490E-02 +9 4.517100E+00 -1.871699E-01 +10 1.998200E+00 -1.377757E-01 +11 7.098800E-01 2.928021E-01 +12 2.814500E-01 5.760896E-01 +13 1.020400E-01 3.078617E-01 +P 1 +1 7.098800E-01 1.000000E+00 +P 1 +1 1.020400E-01 1.000000E+00 +P 1 +1 0.0351420 1.0000000 +D 8 +1 4.038300E+02 1.473200E-03 +2 1.211700E+02 1.267250E-02 +3 4.634500E+01 5.804510E-02 +4 1.972100E+01 1.705103E-01 +5 8.862400E+00 3.185958E-01 +6 3.996200E+00 3.845023E-01 +7 1.763600E+00 2.737737E-01 +8 7.061900E-01 7.439670E-02 +D 1 +1 7.061900E-01 1.000000E+00 +D 1 +1 2.639000E-01 1.000000E+00 +D 1 +1 0.1047000 1.0000000 +F 1 +1 5.515000E-01 1.0000000 +F 1 +1 0.2580000 1.0000000 + + #+END_example + +** Electron coordinates + + Electron coordinates are stored in atomic units in normal format. + +#+begin_src c :tangle ../tests/chbrclf.h +#define chbrclf_elec_up_num ((int64_t) 34) +#define chbrclf_elec_dn_num ((int64_t) 34) +#define chbrclf_elec_num ((int64_t) 68) +#define chbrclf_walk_num ((int64_t) 2) + +const double chbrclf_elec_coord[chbrclf_walk_num][chbrclf_elec_num][3] = { { + {-2.26995253563, -5.15737533569, -2.22940072417}, + { 3.51983380318, -1.08717381954, -1.19617708027}, + {-1.66791832447, -3.11651110649, 2.11557179689}, + {-2.54040765762, -6.29868507385, 1.97103276849}, + {-2.29463744164, -3.35111081600, -5.44719845057}, + {-2.78860569000, -3.85001629591, 1.48611024022}, + { 1.26378631592, 3.41475939751, -2.98826307058}, + { 1.09431362152, 8.47581565380, 7.57644295692}, + { 3.76009845734, -1.30891036987, -1.30899637938}, + {-2.40264558792, -4.04087215662, 9.50866565108}, + { 3.04867124557, -6.51501715183, -4.97306495905}, + { 3.84830522537, -1.05451405048, -2.95348644257}, + { 3.50539922714, -1.34033131599, -4.16487485170}, + {-2.73639702797, -4.54458445311, 4.83948200941}, + {-2.10262560844, 4.50256705284, 8.65258097649}, + {-2.21880722046, -1.73338234425, -9.46770235896}, + {-1.88443505764, -3.78501087427, -4.88811969757}, + {-2.49273109436, -8.57867524028, -3.68066996336}, + {-3.13859176636, 1.89580932260, -7.63508498668}, + {-2.14591693878, -6.56111717224, -6.69820383191}, + {-1.92061448097, -1.09247815609, 6.60725891589}, + { 6.78668081760, 1.96723997593, 4.59519505501}, + { 3.13553071022, -1.15522086620, 5.73987923563}, + {-2.29674005508, -3.97602945566, -8.58206078410}, + { 1.61597287655, 7.94150531292, 1.39395284653}, + { 9.63889718056, 3.76062178612, -2.30398878455}, + { 1.49050402641, 2.90106987953, -1.05920815468}, + { 8.01355421543, 2.98550319672, -1.37276327610}, + { 4.67240428925, -1.42258465290, -7.31541633606}, + { 4.78209877014, -1.97110056877, -6.36375367641}, + { 3.47065544128, -1.58680915833, 8.09270441532}, + { 2.78402256966, -1.61627101898, -1.14950299263}, + {-2.43154764175, -4.92580950260, -5.94577729702}, + {-2.07331848145, -8.07791411877, -5.79017937183}, + {-2.20136833191, -2.79306620359, 1.49220023304}, + { 3.50646018982, -1.30311572552, -1.54289022088}, + {-2.57634282112, -2.89503604174, -1.62051007152}, + {-2.28945779800, -3.16228151321, 1.58045440912}, + {-1.96759450436, -1.22897170484, 3.13766419888}, + {-2.32720947266, -4.58756178617, -1.04388400912}, + { 1.34714412689, 3.28201150894, -3.74540209770}, + { 1.02136373520, 8.49682748317, 8.75190198421}, + { 3.80308532715, -9.79767143726, -7.25016415118}, + {-1.72578215599, 5.16327172518, -1.34024426341}, + { 2.54812169075, -1.19696271420, -4.35636699200}, + { 3.44056987762, -1.42631483078, -1.80410727859}, + { 3.56901502609, -1.25196957588, 2.14892253280}, + {-2.25152993202, -3.58026176691, -2.36085981131}, + {-1.81981575489, -1.61404407024, 6.01518213749}, + {-2.34611868858, 5.45890212059, 1.05074942112}, + {-2.48747754097, 3.01646441221, -2.20733918250}, + {-2.08608031273, -4.99503910542, 1.22879549861}, + {-2.62009620667, -4.38899755478, -2.94447898865}, + {-2.46968364716, -2.14957594872, -4.44929867983}, + {-2.27588725090, -4.03139829636, -1.34325772524}, + { 2.07814240456, 3.53174304962, 4.32420790195}, + { 3.19689464569, -1.74846553802, -9.51488316059}, + {-1.77437961102, 8.71710777282, 7.98717916012}, + {-2.43852794170, 1.01102793217, 1.67076694965}, + { 1.68815839291, 2.98291635513, -3.98489713669}, + { 6.72981083393, 3.35125422478, -8.33267033100}, + { 1.64096879959, 3.26126050949, -6.12493693829}, + { 3.77453780174, 4.46122527122, 6.66481316090}, + { 3.43319153786, -1.30005681515, 3.92319053411}, + { 2.63329458237, -1.30157423019, -8.17687213421}, + { 3.57572197914, -1.07295131683, -4.24419552088}, + {-2.67209243774, -1.46084114909, -1.16768456995}, + {-2.09756040573, -9.31840538979, -3.85717511177}}, + { + {-2.34410619736, -3.20016115904, -1.53496759012}, + { 3.17996025085, -1.40260577202, 1.49473607540}, + {-2.23076605797, -2.83948600292, 9.49927791953}, + {-2.43097519875, -8.68766680360, 1.60800144076}, + {-2.30478429794, -3.56340646744, -4.09480594099}, + {-2.14133548737, -1.02651178837, 4.94684696198}, + { 1.62508022785, 2.60330677032, -8.47915709019}, + { 1.27408051491, 3.01226794720, 4.51113164425}, + { 3.35605812073, -1.12264251709, -3.33058685064}, + {-2.37143301964, -5.74941754341, 8.54486040771}, + { 3.18820738792, -1.45322322845, -2.11916580796}, + { 3.41001844406, -1.34255969524, -1.54219895601}, + { 4.52576208115, -6.47054672241, -2.16511666775}, + {-2.40094542503, -7.25721180439, -1.55527725816}, + {-2.77491641045, -1.10882985592, 5.76599717140}, + {-2.20180344582, -1.91131502390, 2.21937447786}, + {-2.13283038139, -2.67622411251, -3.17741572857}, + {-2.18208360672, 5.69592237473, -2.07313925028}, + {-2.77465915680, -5.78670740128, 4.42580580711}, + {-1.85710799694, -7.07677602768, 1.04370221496}, + {-2.38139748573, -4.66007351875, -9.08390283585}, + { 2.70240306854, 4.33306598663, -4.81943219900}, + { 2.12172913551, -1.01243197918, 1.90536692739}, + {-2.59672832489, 1.63385756314, -4.87916678190}, + { 9.92364227772, 1.40893876553, 1.16456234455}, + { 1.39175999165, 3.11557602882, -4.44381356239}, + { 2.11633038521, 2.02847170830, -1.00864779949}, + { 1.14409208298, 3.74614620209, -7.69796907901}, + { 3.99155473709, -1.15835893154, -5.75888492167}, + { 3.81746459007, -1.76095283031, 3.65874171257}, + { 2.39833283424, -1.97481775284, 1.68805599213}, + { 3.50797653198, -9.54507589340, -7.73615688086}, + {-2.22397685051, -2.59196788073, -5.47018386424}, + {-2.05891585350, 5.35349249840, 8.92746448517}, + {-2.42279815674, -4.47994381189, 4.74890284240}, + { 3.47718238831, -1.31481623650, -1.13119445741}, + {-2.13573265076, -3.77991527319, 9.89178344607}, + {-2.39205574989, -4.24590885639, -2.14120149612}, + {-2.32959675789, -1.04270493612, -2.64487534761}, + {-2.28894376755, -3.51045638323, -4.60519827902}, + { 1.60694050789, 3.09509325027, -3.17743927240}, + { 8.79046201706, 1.23586606979, 1.10633921623}, + { 3.66632819176, -7.73513436317, -2.82783180475}, + {-1.56432127953, -8.28551828861, -1.27556353807}, + { 3.64514565468, -8.48878860474, 1.50680422783}, + { 3.56896424294, -1.43446743488, 2.74687930942}, + { 3.87763309479, -1.23341560364, -8.10135483742}, + {-2.39496254921, -3.45572710037, -4.26582060754}, + {-2.46606898308, -7.99975514412, 2.00696870685}, + {-2.78703904152, -5.71972310543, -1.65262192488}, + {-2.10356879234, -5.14238119124, -1.54197901487}, + {-1.46284854412, 6.09897315502, -8.87724041939}, + {-2.40337014198, 4.84354734421, 3.36634337902}, + {-2.31666541100, -3.93751084805, -5.00837624073}, + {-2.69825482368, 1.31541609764, -2.08565697074}, + { 9.76799368858, 2.24494481087, 6.91881835461}, + { 2.17129302025, -1.59818923473, 2.69582271576}, + {-1.90924882889, 1.96396946907, 1.97196662426}, + { 1.54570734501, 9.02010202408, 8.17995429039}, + { 1.24686288834, 3.31178450584, 1.26904413104}, + { 2.53851819038, 3.38208723068, -4.56276416779}, + { 9.43495273590, 3.29948759079, -1.81205761433}, + { 3.28666305542, -1.16521859169, 6.84504806995}, + { 4.27903270721, 7.15266764164, 1.18705637753}, + { 3.30623006821, -1.17509567738, -2.75256365538}, + { 4.33063077927, -6.61120176315, 1.08258962631}, + {-3.12304520607, 4.37339305878, 1.31159663200}, + {-2.16836428642, -6.58241450787, -1.20764113963}} +}; + + +#+END_src diff --git a/org/qmckl_utils.org b/org/qmckl_utils.org new file mode 100644 index 0000000..2a31e22 --- /dev/null +++ b/org/qmckl_utils.org @@ -0,0 +1,229 @@ +#+TITLE: Utility functions +#+SETUPFILE: ../tools/theme.setup +#+INCLUDE: ../tools/lib.org + +* Headers :noexport: + #+begin_src elisp :noexport :results none +(org-babel-lob-ingest "../tools/lib.org") +#+end_src + + #+begin_src c :comments link :tangle (eval c_test) :noweb yes +#include "qmckl.h" +#include "assert.h" +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +int main() { + qmckl_context context; + context = qmckl_context_create(); + + #+end_src + +* Matrix operations + +** ~qmckl_transpose~ + + Transposes a matrix: $B_{ji} = A_{ij}$ + + #+NAME: qmckl_transpose_args + | qmckl_context | context | in | Global state | + | int64_t | m | in | Number of rows of the input matrix | + | int64_t | n | in | Number of columns of the input matrix | + | double | A[][lda] | in | Array containing the $m \times n$ matrix $A$ | + | int64_t | lda | in | Leading dimension of array ~A~ | + | double | B[][ldb] | out | Array containing the $n \times m$ matrix $B$ | + | int64_t | ldb | in | Leading dimension of array ~B~ | + +*** Requirements + + - ~context~ is not ~QMCKL_NULL_CONTEXT~ + - ~m > 0~ + - ~n > 0~ + - ~lda >= m~ + - ~ldb >= n~ + - ~A~ is allocated with at least $m \times n \times 8$ bytes + - ~B~ is allocated with at least $n \times m \times 8$ bytes + +*** C header + + #+CALL: generate_c_header(table=qmckl_transpose_args,rettyp="qmckl_exit_code",fname="qmckl_transpose") + + #+RESULTS: + #+begin_src c :tangle (eval h_func) :comments org + qmckl_exit_code qmckl_transpose ( + const qmckl_context context, + const int64_t m, + const int64_t n, + const double* A, + const int64_t lda, + double* const B, + const int64_t ldb ); + #+end_src + +*** Source + #+begin_src f90 :tangle (eval f) +integer function qmckl_transpose_f(context, m, n, A, LDA, B, LDB) & + result(info) + use qmckl + implicit none + integer(qmckl_context) , intent(in) :: context + integer*8 , intent(in) :: m, n + integer*8 , intent(in) :: lda + real*8 , intent(in) :: A(lda,*) + integer*8 , intent(in) :: ldb + real*8 , intent(out) :: B(ldb,*) + + integer*8 :: i,j + + info = QMCKL_SUCCESS + + if (context == QMCKL_NULL_CONTEXT) then + info = QMCKL_INVALID_CONTEXT + return + endif + + if (m <= 0_8) then + info = QMCKL_INVALID_ARG_2 + return + endif + + if (n <= 0_8) then + info = QMCKL_INVALID_ARG_3 + return + endif + + if (LDA < m) then + info = QMCKL_INVALID_ARG_5 + return + endif + + if (LDB < n) then + info = QMCKL_INVALID_ARG_7 + return + endif + + do j=1,m + do i=1,n + B(i,j) = A(j,i) + end do + end do + +end function qmckl_transpose_f + #+end_src + +*** C interface :noexport: + + #+CALL: generate_c_interface(table=qmckl_transpose_args,rettyp="qmckl_exit_code",fname="qmckl_transpose") + + #+RESULTS: + #+begin_src f90 :tangle (eval f) :comments org :exports none + integer(c_int32_t) function qmckl_transpose & + (context, m, n, A, lda, B, ldb) & + bind(C) result(info) + + use, intrinsic :: iso_c_binding + implicit none + + integer (c_int64_t) , intent(in) , value :: context + integer (c_int64_t) , intent(in) , value :: m + integer (c_int64_t) , intent(in) , value :: n + real (c_double ) , intent(in) :: A(lda,*) + integer (c_int64_t) , intent(in) , value :: lda + real (c_double ) , intent(out) :: B(ldb,*) + integer (c_int64_t) , intent(in) , value :: ldb + + integer(c_int32_t), external :: qmckl_transpose_f + info = qmckl_transpose_f & + (context, m, n, A, lda, B, ldb) + + end function qmckl_transpose + #+end_src + + #+CALL: generate_f_interface(table=qmckl_transpose_args,rettyp="qmckl_exit_code",fname="qmckl_transpose") + + #+RESULTS: + #+begin_src f90 :tangle (eval fh_func) :comments org :exports none + interface + integer(c_int32_t) function qmckl_transpose & + (context, m, n, A, lda, B, ldb) & + bind(C) + use, intrinsic :: iso_c_binding + import + implicit none + + integer (c_int64_t) , intent(in) , value :: context + integer (c_int64_t) , intent(in) , value :: m + integer (c_int64_t) , intent(in) , value :: n + real (c_double ) , intent(in) :: A(lda,*) + integer (c_int64_t) , intent(in) , value :: lda + real (c_double ) , intent(out) :: B(ldb,*) + integer (c_int64_t) , intent(in) , value :: ldb + + end function qmckl_transpose + end interface + #+end_src + +*** Test :noexport: + #+begin_src f90 :tangle (eval f_test) +integer(qmckl_exit_code) function test_qmckl_transpose(context) bind(C) + use qmckl + implicit none + integer(qmckl_context), intent(in), value :: context + + double precision, allocatable :: A(:,:), B(:,:) + integer*8 :: m, n, LDA, LDB + integer*8 :: i,j + double precision :: x + + m = 5 + n = 6 + LDA = m+3 + LDB = n+1 + + allocate( A(LDA,n), B(LDB,m) ) + + A = 0.d0 + B = 0.d0 + do j=1,n + do i=1,m + A(i,j) = -10.d0 + dble(i+j) + end do + end do + + test_qmckl_transpose = qmckl_transpose(context, m, n, A, LDA, B, LDB) + + if (test_qmckl_transpose /= QMCKL_SUCCESS) return + + test_qmckl_transpose = QMCKL_FAILURE + + x = 0.d0 + do j=1,n + do i=1,m + x = x + (A(i,j)-B(j,i))**2 + end do + end do + if (dabs(x) <= 1.d-15) then + test_qmckl_transpose = QMCKL_SUCCESS + endif + + deallocate(A,B) +end function test_qmckl_transpose + #+end_src + + #+begin_src c :comments link :tangle (eval c_test) +qmckl_exit_code test_qmckl_transpose(qmckl_context context); +assert(QMCKL_SUCCESS == test_qmckl_transpose(context)); + #+end_src + +* End of files :noexport: + + #+begin_src c :comments link :tangle (eval c_test) + assert (qmckl_context_destroy(context) == QMCKL_SUCCESS); + return 0; +} + + #+end_src + + +# -*- mode: org -*- +# vim: syntax=c diff --git a/org/table_of_contents b/org/table_of_contents index ad39ea1..e9e2190 100644 --- a/org/table_of_contents +++ b/org/table_of_contents @@ -7,3 +7,5 @@ qmckl_nucleus.org qmckl_electron.org qmckl_ao.org qmckl_distance.org +qmckl_utils.org +qmckl_tests.org