1
0
mirror of https://github.com/TREX-CoE/qmckl.git synced 2024-11-03 20:54:09 +01:00
qmckl/qmckl_jastrow.html

5577 lines
270 KiB
HTML

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2022-07-28 Thu 10:04 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Jastrow Factor</title>
<meta name="generator" content="Org mode" />
<meta name="author" content="TREX CoE" />
<style type="text/css">
<!--/*--><![CDATA[/*><!--*/
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #ccc;
box-shadow: 3px 3px 3px #eee;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: visible;
padding-top: 1.2em;
}
pre.src:before {
display: none;
position: absolute;
background-color: white;
top: -10px;
right: 10px;
padding: 3px;
border: 1px solid black;
}
pre.src:hover:before { display: inline;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-hledger:before { content: 'hledger'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'Javascript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { width: 90%; }
/*]]>*/-->
</style>
<link rel="stylesheet" title="Standard" href="qmckl.css" type="text/css" />
<script type="text/javascript" src="org-info.js">
/**
*
* @source: org-info.js
*
* @licstart The following is the entire license notice for the
* JavaScript code in org-info.js.
*
* Copyright (C) 2012-2019 Free Software Foundation, Inc.
*
*
* The JavaScript code in this tag is free software: you can
* redistribute it and/or modify it under the terms of the GNU
* General Public License (GNU GPL) as published by the Free Software
* Foundation, either version 3 of the License, or (at your option)
* any later version. The code is distributed WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
*
* As additional permission under GNU GPL version 3 section 7, you
* may distribute non-source (e.g., minimized or compacted) forms of
* that code without the copy of the GNU GPL normally required by
* section 4, provided you include this license notice and a URL
* through which recipients can access the Corresponding Source.
*
* @licend The above is the entire license notice
* for the JavaScript code in org-info.js.
*
*/
</script>
<script type="text/javascript">
/*
@licstart The following is the entire license notice for the
JavaScript code in this tag.
Copyright (C) 2012-2019 Free Software Foundation, Inc.
The JavaScript code in this tag is free software: you can
redistribute it and/or modify it under the terms of the GNU
General Public License (GNU GPL) as published by the Free Software
Foundation, either version 3 of the License, or (at your option)
any later version. The code is distributed WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
As additional permission under GNU GPL version 3 section 7, you
may distribute non-source (e.g., minimized or compacted) forms of
that code without the copy of the GNU GPL normally required by
section 4, provided you include this license notice and a URL
through which recipients can access the Corresponding Source.
@licend The above is the entire license notice
for the JavaScript code in this tag.
*/
<!--/*--><![CDATA[/*><!--*/
org_html_manager.set("TOC_DEPTH", "4");
org_html_manager.set("LINK_HOME", "index.html");
org_html_manager.set("LINK_UP", "");
org_html_manager.set("LOCAL_TOC", "1");
org_html_manager.set("VIEW_BUTTONS", "0");
org_html_manager.set("MOUSE_HINT", "underline");
org_html_manager.set("FIXED_TOC", "0");
org_html_manager.set("TOC", "1");
org_html_manager.set("VIEW", "info");
org_html_manager.setup(); // activate after the parameters are set
/*]]>*///-->
</script>
<script type="text/javascript">
/*
@licstart The following is the entire license notice for the
JavaScript code in this tag.
Copyright (C) 2012-2019 Free Software Foundation, Inc.
The JavaScript code in this tag is free software: you can
redistribute it and/or modify it under the terms of the GNU
General Public License (GNU GPL) as published by the Free Software
Foundation, either version 3 of the License, or (at your option)
any later version. The code is distributed WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
As additional permission under GNU GPL version 3 section 7, you
may distribute non-source (e.g., minimized or compacted) forms of
that code without the copy of the GNU GPL normally required by
section 4, provided you include this license notice and a URL
through which recipients can access the Corresponding Source.
@licend The above is the entire license notice
for the JavaScript code in this tag.
*/
<!--/*--><![CDATA[/*><!--*/
function CodeHighlightOn(elem, id)
{
var target = document.getElementById(id);
if(null != target) {
elem.cacheClassElem = elem.className;
elem.cacheClassTarget = target.className;
target.className = "code-highlighted";
elem.className = "code-highlighted";
}
}
function CodeHighlightOff(elem, id)
{
var target = document.getElementById(id);
if(elem.cacheClassElem)
elem.className = elem.cacheClassElem;
if(elem.cacheClassTarget)
target.className = elem.cacheClassTarget;
}
/*]]>*///-->
</script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
displayAlign: "center",
displayIndent: "0em",
"HTML-CSS": { scale: 100,
linebreaks: { automatic: "false" },
webFont: "TeX"
},
SVG: {scale: 100,
linebreaks: { automatic: "false" },
font: "TeX"},
NativeMML: {scale: 100},
TeX: { equationNumbers: {autoNumber: "AMS"},
MultLineWidth: "85%",
TagSide: "right",
TagIndent: ".8em"
}
});
</script>
<script type="text/javascript"
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_HTML"></script>
</head>
<body>
<div id="org-div-home-and-up">
<a accesskey="h" href=""> UP </a>
|
<a accesskey="H" href="index.html"> HOME </a>
</div><div id="content">
<h1 class="title">Jastrow Factor</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#orgf2408a0">1. Introduction</a></li>
<li><a href="#org9c4dc54">2. Context</a>
<ul>
<li><a href="#org9dd9ffd">2.1. Data structure</a></li>
<li><a href="#orgd4bac51">2.2. Access functions</a></li>
<li><a href="#orgc6d600a">2.3. Initialization functions</a></li>
<li><a href="#org86f442f">2.4. Test</a></li>
</ul>
</li>
<li><a href="#org54ad4a7">3. Computation</a>
<ul>
<li><a href="#orgfd6ea7d">3.1. Asymptotic component for \(J_{ee}\)</a>
<ul>
<li><a href="#orgee98321">3.1.1. Get</a></li>
<li><a href="#org10c0de1">3.1.2. Compute</a></li>
<li><a href="#org73c25d0">3.1.3. Test</a></li>
</ul>
</li>
<li><a href="#org6902728">3.2. Electron-electron component \(f_{ee}\)</a>
<ul>
<li><a href="#orgc535af7">3.2.1. Get</a></li>
<li><a href="#orgf33dba1">3.2.2. Compute</a></li>
<li><a href="#org0a94337">3.2.3. Test</a></li>
</ul>
</li>
<li><a href="#orgb7d52d8">3.3. Electron-electron component derivative \(f'_{ee}\)</a>
<ul>
<li><a href="#orge512f64">3.3.1. Get</a></li>
<li><a href="#org741e611">3.3.2. Compute</a></li>
<li><a href="#org5de8ec5">3.3.3. Test</a></li>
</ul>
</li>
<li><a href="#orgd86cd4a">3.4. Electron-nucleus component \(f_{en}\)</a>
<ul>
<li><a href="#org412946e">3.4.1. Get</a></li>
<li><a href="#orgfb89b86">3.4.2. Compute</a></li>
<li><a href="#org1f25990">3.4.3. Test</a></li>
</ul>
</li>
<li><a href="#org78a0c39">3.5. Electron-nucleus component derivative \(f'_{en}\)</a>
<ul>
<li><a href="#org4c49328">3.5.1. Get</a></li>
<li><a href="#orgd4e18c0">3.5.2. Compute</a></li>
<li><a href="#org3320012">3.5.3. Test</a></li>
</ul>
</li>
<li><a href="#orgba7e064">3.6. Electron-electron rescaled distances for each order</a>
<ul>
<li><a href="#org1c7357a">3.6.1. Get</a></li>
<li><a href="#org71d5d20">3.6.2. Compute</a></li>
<li><a href="#org9787e5e">3.6.3. Test</a></li>
</ul>
</li>
<li><a href="#org6a64ea8">3.7. Electron-electron rescaled distances for each order and derivatives</a>
<ul>
<li><a href="#orgd655e39">3.7.1. Get</a></li>
<li><a href="#orga43fe99">3.7.2. Compute</a></li>
<li><a href="#org3b5718e">3.7.3. Test</a></li>
</ul>
</li>
<li><a href="#org8885217">3.8. Electron-nucleus rescaled distances for each order</a>
<ul>
<li><a href="#orgdd50a15">3.8.1. Get</a></li>
<li><a href="#org0cab186">3.8.2. Compute</a></li>
<li><a href="#org4080344">3.8.3. Test</a></li>
</ul>
</li>
<li><a href="#org9bce494">3.9. Electron-nucleus rescaled distances for each order and derivatives</a>
<ul>
<li><a href="#orge8bbb78">3.9.1. Get</a></li>
<li><a href="#org2d3f240">3.9.2. Compute</a></li>
<li><a href="#org4df5c8c">3.9.3. Test</a></li>
</ul>
</li>
<li><a href="#orgf95f3ea">3.10. Prepare for electron-electron-nucleus Jastrow \(f_{een}\)</a>
<ul>
<li><a href="#orgd5455e6">3.10.1. Get</a></li>
<li><a href="#org913940f">3.10.2. Compute dim<sub>cord</sub><sub>vect</sub></a></li>
<li><a href="#orgb99d441">3.10.3. Compute cord<sub>vect</sub><sub>full</sub></a></li>
<li><a href="#orgf325ac8">3.10.4. Compute lkpm<sub>combined</sub><sub>index</sub></a></li>
<li><a href="#orgf3f6189">3.10.5. Compute tmp<sub>c</sub></a></li>
<li><a href="#orgc02a9c1">3.10.6. Compute dtmp<sub>c</sub></a></li>
<li><a href="#org3e7d87e">3.10.7. Test</a></li>
</ul>
</li>
<li><a href="#org5c0a41b">3.11. Electron-electron-nucleus Jastrow \(f_{een}\)</a>
<ul>
<li><a href="#org1718542">3.11.1. Get</a></li>
<li><a href="#orgddcaf8e">3.11.2. Compute naive</a></li>
<li><a href="#org2bb5c01">3.11.3. Compute</a></li>
<li><a href="#org8d2df7e">3.11.4. Test</a></li>
</ul>
</li>
<li><a href="#org4dbc6db">3.12. Electron-electron-nucleus Jastrow \(f_{een}\) derivative</a>
<ul>
<li><a href="#org730e338">3.12.1. Get</a></li>
<li><a href="#org8a0655b">3.12.2. Compute Naive</a></li>
<li><a href="#org27f1516">3.12.3. Compute</a></li>
<li><a href="#orge069ad1">3.12.4. Test</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div id="outline-container-orgf2408a0" class="outline-2">
<h2 id="orgf2408a0"><span class="section-number-2">1</span> Introduction</h2>
<div class="outline-text-2" id="text-1">
<p>
The Jastrow factor depends on the electronic (\(\mathbf{r}\)) and
nuclear (\(\mathbf{R}\)) coordinates. Its defined as \(\exp(J(\mathbf{r},\mathbf{R}))\), where
</p>
<p>
\[
J(\mathbf{r},\mathbf{R}) = J_{\text{eN}}(\mathbf{r},\mathbf{R}) + J_{\text{ee}}(\mathbf{r}) + J_{\text{eeN}}(\mathbf{r},\mathbf{R})
\]
</p>
<p>
In the following, we us the notations \(r_{ij} = |\mathbf{r}_i - \mathbf{r}_j|\) and
\(R_{i\alpha} = |\mathbf{r}_i - \mathbf{R}_\alpha|\).
</p>
<p>
\(J_{\text{eN}}\) contains electron-nucleus terms:
</p>
<p>
\[
J_{\text{eN}}(\mathbf{r},\mathbf{R}) = \sum_{i=1}^{N_\text{elec}} \sum_{\alpha=1}^{N_\text{nucl}}
\frac{a_1\, f(R_{i\alpha})}{1+a_2\, f(R_{i\alpha})} +
\sum_{p=2}^{N_\text{ord}^a} a_{p+1}\, [f(R_{i\alpha})]^p - J_{eN}^\infty
\]
</p>
<p>
\(J_{\text{ee}}\) contains electron-electron terms:
\[
J_{\text{ee}}(\mathbf{r}) =
\sum_{i=1}^{N_\text{elec}} \sum_{j=1}^{i-1}
\frac{b_1\, f(r_{ij})}{1+b_2\, f(r_{ij})} +
\sum_{p=2}^{N_\text{ord}^b} a_{p+1}\, [f(r_{ij})]^p - J_{ee}^\infty
\]
</p>
<p>
and \(J_{\text{eeN}}\) contains electron-electron-Nucleus terms:
</p>
<p>
\[
J_{\text{eeN}}(\mathbf{r},\mathbf{R}) =
\sum_{\alpha=1}^{N_{\text{nucl}}}
\sum_{i=1}^{N_{\text{elec}}}
\sum_{j=1}^{i-1}
\sum_{p=2}^{N_{\text{ord}}}
\sum_{k=0}^{p-1}
\sum_{l=0}^{p-k-2\delta_{k,0}}
c_{lkp\alpha} \left[ g({r}_{ij}) \right]^k
\left[ \left[ g({R}_{i\alpha}) \right]^l + \left[ g({R}_{j\alpha}) \right]^l \right]
\left[ g({R}_{i\,\alpha}) \, g({R}_{j\alpha}) \right]^{(p-k-l)/2}
\]
</p>
<p>
\(c_{lkp\alpha}\) are non-zero only when \(p-k-l\) is even.
</p>
<p>
\(f\) and \(g\) are scaling function defined as
</p>
<p>
\[
f(r) = \frac{1-e^{-\kappa\, r}}{\kappa} \text{ and }
g(r) = e^{-\kappa\, r}.
\]
</p>
<p>
The terms \(J_{\text{ee}}^\infty\) and \(J_{\text{eN}}^\infty\) are shifts to ensure that
\(J_{\text{ee}}\) and \(J_{\text{eN}}\) have an asymptotic value of zero.
</p>
</div>
</div>
<div id="outline-container-org9c4dc54" class="outline-2">
<h2 id="org9c4dc54"><span class="section-number-2">2</span> Context</h2>
<div class="outline-text-2" id="text-2">
<p>
The following data stored in the context:
</p>
<table id="orga61e5ff" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>uninitialized</code></td>
<td class="org-left"><code>int32_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Keeps bits set for uninitialized data</td>
</tr>
<tr>
<td class="org-left"><code>aord_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">The number of a coeffecients</td>
</tr>
<tr>
<td class="org-left"><code>bord_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">The number of b coeffecients</td>
</tr>
<tr>
<td class="org-left"><code>cord_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">The number of c coeffecients</td>
</tr>
<tr>
<td class="org-left"><code>type_nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of Nucleii types</td>
</tr>
<tr>
<td class="org-left"><code>type_nucl_vector</code></td>
<td class="org-left"><code>int64_t[nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">IDs of types of Nuclei</td>
</tr>
<tr>
<td class="org-left"><code>aord_vector</code></td>
<td class="org-left"><code>double[aord_num + 1][type_nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Order of a polynomial coefficients</td>
</tr>
<tr>
<td class="org-left"><code>bord_vector</code></td>
<td class="org-left"><code>double[bord_num + 1]</code></td>
<td class="org-left">in</td>
<td class="org-left">Order of b polynomial coefficients</td>
</tr>
<tr>
<td class="org-left"><code>cord_vector</code></td>
<td class="org-left"><code>double[cord_num][type_nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Order of c polynomial coefficients</td>
</tr>
<tr>
<td class="org-left"><code>factor_ee</code></td>
<td class="org-left"><code>double[walk_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Jastrow factor: electron-electron part</td>
</tr>
<tr>
<td class="org-left"><code>factor_ee_date</code></td>
<td class="org-left"><code>uint64_t</code></td>
<td class="org-left">out</td>
<td class="org-left">Jastrow factor: electron-electron part</td>
</tr>
<tr>
<td class="org-left"><code>factor_en</code></td>
<td class="org-left"><code>double[walk_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Jastrow factor: electron-nucleus part</td>
</tr>
<tr>
<td class="org-left"><code>factor_en_date</code></td>
<td class="org-left"><code>uint64_t</code></td>
<td class="org-left">out</td>
<td class="org-left">Jastrow factor: electron-nucleus part</td>
</tr>
<tr>
<td class="org-left"><code>factor_een</code></td>
<td class="org-left"><code>double[walk_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Jastrow factor: electron-electron-nucleus part</td>
</tr>
<tr>
<td class="org-left"><code>factor_een_date</code></td>
<td class="org-left"><code>uint64_t</code></td>
<td class="org-left">out</td>
<td class="org-left">Jastrow factor: electron-electron-nucleus part</td>
</tr>
<tr>
<td class="org-left"><code>factor_ee_deriv_e</code></td>
<td class="org-left"><code>double[4][nelec][walk_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Derivative of the Jastrow factor: electron-electron-nucleus part</td>
</tr>
<tr>
<td class="org-left"><code>factor_ee_deriv_e_date</code></td>
<td class="org-left"><code>uint64_t</code></td>
<td class="org-left">out</td>
<td class="org-left">Keep track of the date for the derivative</td>
</tr>
<tr>
<td class="org-left"><code>factor_en_deriv_e</code></td>
<td class="org-left"><code>double[4][nelec][walk_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Derivative of the Jastrow factor: electron-electron-nucleus part</td>
</tr>
<tr>
<td class="org-left"><code>factor_en_deriv_e_date</code></td>
<td class="org-left"><code>uint64_t</code></td>
<td class="org-left">out</td>
<td class="org-left">Keep track of the date for the en derivative</td>
</tr>
<tr>
<td class="org-left"><code>factor_een_deriv_e</code></td>
<td class="org-left"><code>double[4][nelec][walk_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Derivative of the Jastrow factor: electron-electron-nucleus part</td>
</tr>
<tr>
<td class="org-left"><code>factor_een_deriv_e_date</code></td>
<td class="org-left"><code>uint64_t</code></td>
<td class="org-left">out</td>
<td class="org-left">Keep track of the date for the een derivative</td>
</tr>
</tbody>
</table>
<p>
computed data:
</p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>dim_cord_vect</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">Number of unique C coefficients</td>
</tr>
<tr>
<td class="org-left"><code>dim_cord_vect_date</code></td>
<td class="org-left"><code>uint64_t</code></td>
<td class="org-left">Number of unique C coefficients</td>
</tr>
<tr>
<td class="org-left"><code>asymp_jasb</code></td>
<td class="org-left"><code>double[2]</code></td>
<td class="org-left">Asymptotic component</td>
</tr>
<tr>
<td class="org-left"><code>asymp_jasb_date</code></td>
<td class="org-left"><code>uint64_t</code></td>
<td class="org-left">Asymptotic component</td>
</tr>
<tr>
<td class="org-left"><code>cord_vect_full</code></td>
<td class="org-left"><code>double[dim_cord_vect][nucl_num]</code></td>
<td class="org-left">vector of non-zero coefficients</td>
</tr>
<tr>
<td class="org-left"><code>cord_vect_full_date</code></td>
<td class="org-left"><code>uint64_t</code></td>
<td class="org-left">Keep track of changes here</td>
</tr>
<tr>
<td class="org-left"><code>lkpm_combined_index</code></td>
<td class="org-left"><code>int64_t[4][dim_cord_vect]</code></td>
<td class="org-left">Transform l,k,p, and m into consecutive indices</td>
</tr>
<tr>
<td class="org-left"><code>lkpm_combined_index_date</code></td>
<td class="org-left"><code>uint64_t</code></td>
<td class="org-left">Transform l,k,p, and m into consecutive indices</td>
</tr>
<tr>
<td class="org-left"><code>tmp_c</code></td>
<td class="org-left"><code>double[walk_num][cord_num][cord_num+1][nucl_num][elec_num]</code></td>
<td class="org-left">vector of non-zero coefficients</td>
</tr>
<tr>
<td class="org-left"><code>dtmp_c</code></td>
<td class="org-left"><code>double[walk_num][elec_num][4][nucl_num][cord_num+1][cord_num]</code></td>
<td class="org-left">vector of non-zero coefficients</td>
</tr>
</tbody>
</table>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<tbody>
<tr>
<td class="org-left"><code>een_rescaled_n</code></td>
<td class="org-left"><code>double[walk_num][cord_num+1][nucl_num][elec_num]</code></td>
<td class="org-left">The electron-electron rescaled distances raised to the powers defined by cord</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_n_date</code></td>
<td class="org-left"><code>uint64_t</code></td>
<td class="org-left">Keep track of the date of creation</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_e_deriv_e</code></td>
<td class="org-left"><code>double[walk_num][cord_num+1][elec_num][4][elec_num]</code></td>
<td class="org-left">The electron-electron rescaled distances raised to the powers defined by cord derivatives wrt electrons</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_e_deriv_e_date</code></td>
<td class="org-left"><code>uint64_t</code></td>
<td class="org-left">Keep track of the date of creation</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_n_deriv_e</code></td>
<td class="org-left"><code>double[walk_num][cord_num+1][nucl_num][4][elec_num]</code></td>
<td class="org-left">The electron-electron rescaled distances raised to the powers defined by cord derivatives wrt electrons</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_n_deriv_e_date</code></td>
<td class="org-left"><code>uint64_t</code></td>
<td class="org-left">Keep track of the date of creation</td>
</tr>
</tbody>
</table>
</div>
<div id="outline-container-org9dd9ffd" class="outline-3">
<h3 id="org9dd9ffd"><span class="section-number-3">2.1</span> Data structure</h3>
<div class="outline-text-3" id="text-2-1">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #a020f0;">typedef</span> <span style="color: #a020f0;">struct</span> <span style="color: #228b22;">qmckl_jastrow_struct</span>{
<span style="color: #228b22;">int32_t</span> <span style="color: #a0522d;">uninitialized</span>;
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">aord_num</span>;
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">bord_num</span>;
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">cord_num</span>;
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">type_nucl_num</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">asymp_jasb_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">tmp_c_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">dtmp_c_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">factor_ee_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">factor_en_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">factor_een_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">factor_ee_deriv_e_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">factor_en_deriv_e_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">factor_een_deriv_e_date</span>;
<span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">type_nucl_vector</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">aord_vector</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">bord_vector</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">cord_vector</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">asymp_jasb</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">factor_ee</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">factor_en</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">factor_een</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">factor_ee_deriv_e</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">factor_en_deriv_e</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">factor_een_deriv_e</span>;
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">dim_cord_vect</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">dim_cord_vect_date</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">cord_vect_full</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">cord_vect_full_date</span>;
<span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">lkpm_combined_index</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">lkpm_combined_index_date</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">tmp_c</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">dtmp_c</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">een_rescaled_e</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">een_rescaled_n</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">een_rescaled_e_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">een_rescaled_n_date</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">een_rescaled_e_deriv_e</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">een_rescaled_n_deriv_e</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">een_rescaled_e_deriv_e_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">een_rescaled_n_deriv_e_date</span>;
<span style="color: #228b22;">bool</span> <span style="color: #a0522d;">provided</span>;
<span style="color: #228b22;">char</span> * <span style="color: #a0522d;">type</span>;
<span style="color: #483d8b;"> #ifdef</span> HAVE_HPC
<span style="color: #228b22;">bool</span> <span style="color: #a0522d;">gpu_offload</span>;
<span style="color: #483d8b;"> #endif</span>
} <span style="color: #228b22;">qmckl_jastrow_struct</span>;
</pre>
</div>
<p>
The <code>uninitialized</code> integer contains one bit set to one for each
initialization function which has not been called. It becomes equal
to zero after all initialization functions have been called. The
struct is then initialized and <code>provided == true</code>.
Some values are initialized by default, and are not concerned by
this mechanism.
</p>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_init_jastrow</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_init_jastrow</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>) {
<span style="color: #a020f0;">if</span> (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) {
<span style="color: #a020f0;">return</span> <span style="color: #008b8b;">false</span>;
}
<span style="color: #228b22;">qmckl_context_struct</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">ctx</span> = (<span style="color: #228b22;">qmckl_context_struct</span>*) context;
assert (ctx != <span style="color: #008b8b;">NULL</span>);
ctx-&gt;jastrow.uninitialized = (1 &lt;&lt; 6) - 1;
/* <span style="color: #b22222;">Default values </span>*/
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
}
</pre>
</div>
</div>
</div>
<div id="outline-container-orgd4bac51" class="outline-3">
<h3 id="orgd4bac51"><span class="section-number-3">2.2</span> Access functions</h3>
<div class="outline-text-3" id="text-2-2">
<p>
Along with these core functions, calculation of the jastrow factor
requires the following additional information to be set:
</p>
<p>
When all the data for the AOs have been provided, the following
function returns <code>true</code>.
</p>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">bool</span> <span style="color: #0000ff;">qmckl_jastrow_provided</span> (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgc6d600a" class="outline-3">
<h3 id="orgc6d600a"><span class="section-number-3">2.3</span> Initialization functions</h3>
<div class="outline-text-3" id="text-2-3">
<p>
To prepare for the Jastrow and its derivative, all the following functions need to be
called.
</p>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_set_jastrow_ord_num</span> (<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">aord_num</span>, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">bord_num</span>, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">cord_num</span>);
<span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_set_jastrow_type_nucl_num</span> (<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">type_nucl_num</span>);
<span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_set_jastrow_type_nucl_vector</span> (<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">type_nucl_vector</span>, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nucl_num</span>);
<span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_set_jastrow_aord_vector</span> (<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span> * <span style="color: #a0522d;">aord_vector</span>, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
<span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_set_jastrow_bord_vector</span> (<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span> * <span style="color: #a0522d;">bord_vector</span>, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
<span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_set_jastrow_cord_vector</span> (<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span> * <span style="color: #a0522d;">cord_vector</span>, <span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
</pre>
</div>
<p>
When the required information is completely entered, other data structures are
computed to accelerate the calculations. The intermediates factors
are precontracted using BLAS LEVEL 3 operations for an optimal flop count.
</p>
</div>
</div>
<div id="outline-container-org86f442f" class="outline-3">
<h3 id="org86f442f"><span class="section-number-3">2.4</span> Test</h3>
<div class="outline-text-3" id="text-2-4">
<div class="org-src-container">
<pre class="src src-c">/* <span style="color: #b22222;">Reference input data </span>*/
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span> = n2_walk_num;
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">elec_num</span> = n2_elec_num;
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">elec_up_num</span> = n2_elec_up_num;
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">elec_dn_num</span> = n2_elec_dn_num;
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">rescale_factor_kappa_ee</span> = 1.0;
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">rescale_factor_kappa_en</span> = 1.0;
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">nucl_rescale_factor_kappa</span> = 1.0;
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">elec_coord</span> = &amp;(n2_elec_coord[0][0][0]);
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">nucl_charge</span> = n2_charge;
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nucl_num</span> = n2_nucl_num;
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">nucl_coord</span> = &amp;(n2_nucl_coord[0][0]);
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>;
/* <span style="color: #b22222;">Provide Electron data </span>*/
<span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #a0522d;">rc</span>;
assert(!qmckl_electron_provided(context));
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">n</span>;
rc = qmckl_get_electron_num (context, &amp;n);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_NOT_PROVIDED);
rc = qmckl_get_electron_up_num (context, &amp;n);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_NOT_PROVIDED);
rc = qmckl_get_electron_down_num (context, &amp;n);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_NOT_PROVIDED);
rc = qmckl_set_electron_num (context, elec_up_num, elec_dn_num);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
assert(!qmckl_electron_provided(context));
rc = qmckl_get_electron_up_num (context, &amp;n);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
<span style="color: #0000ff;">assert</span>(n == elec_up_num);
rc = qmckl_get_electron_down_num (context, &amp;n);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
<span style="color: #0000ff;">assert</span>(n == elec_dn_num);
rc = qmckl_get_electron_num (context, &amp;n);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
<span style="color: #0000ff;">assert</span>(n == elec_num);
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">k_ee</span> = 0.;
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">k_en</span> = 0.;
rc = qmckl_get_electron_rescale_factor_ee (context, &amp;k_ee);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
<span style="color: #0000ff;">assert</span>(k_ee == 1.0);
rc = qmckl_get_electron_rescale_factor_en (context, &amp;k_en);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
<span style="color: #0000ff;">assert</span>(k_en == 1.0);
rc = qmckl_set_electron_rescale_factor_en(context, rescale_factor_kappa_en);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
rc = qmckl_set_electron_rescale_factor_ee(context, rescale_factor_kappa_ee);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
rc = qmckl_get_electron_rescale_factor_ee (context, &amp;k_ee);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
<span style="color: #0000ff;">assert</span>(k_ee == rescale_factor_kappa_ee);
rc = qmckl_get_electron_rescale_factor_en (context, &amp;k_en);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
<span style="color: #0000ff;">assert</span>(k_en == rescale_factor_kappa_en);
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">w</span>;
rc = qmckl_get_electron_walk_num (context, &amp;w);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_NOT_PROVIDED);
rc = qmckl_set_electron_walk_num (context, walk_num);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
rc = qmckl_get_electron_walk_num (context, &amp;w);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
<span style="color: #0000ff;">assert</span>(w == walk_num);
<span style="color: #0000ff;">assert</span>(<span style="color: #228b22;">qmckl_electron_provided</span>(<span style="color: #a0522d;">context</span>));
rc = qmckl_set_electron_coord (context, <span style="color: #8b2252;">'N'</span>, elec_coord, walk_num*3*elec_num);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">elec_coord2</span>[walk_num*3*elec_num];
rc = qmckl_get_electron_coord (context, <span style="color: #8b2252;">'N'</span>, elec_coord2, walk_num*3*elec_num);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">i</span>=0 ; i&lt;3*elec_num ; ++i) {
assert( elec_coord[i] == elec_coord2[i] );
}
/* <span style="color: #b22222;">Provide Nucleus data </span>*/
assert(!qmckl_nucleus_provided(context));
rc = qmckl_get_nucleus_num (context, &amp;n);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_NOT_PROVIDED);
rc = qmckl_set_nucleus_num (context, nucl_num);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
assert(!qmckl_nucleus_provided(context));
rc = qmckl_get_nucleus_num (context, &amp;n);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
<span style="color: #0000ff;">assert</span>(n == nucl_num);
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">k</span>;
rc = qmckl_get_nucleus_rescale_factor (context, &amp;k);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
<span style="color: #0000ff;">assert</span>(k == 1.0);
rc = qmckl_set_nucleus_rescale_factor (context, nucl_rescale_factor_kappa);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
rc = qmckl_get_nucleus_rescale_factor (context, &amp;k);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
<span style="color: #0000ff;">assert</span>(k == nucl_rescale_factor_kappa);
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">nucl_coord2</span>[3*nucl_num];
rc = qmckl_get_nucleus_coord (context, <span style="color: #8b2252;">'T'</span>, nucl_coord2, 3*nucl_num);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_NOT_PROVIDED);
rc = qmckl_set_nucleus_coord (context, <span style="color: #8b2252;">'T'</span>, &amp;(nucl_coord[0]), 3*nucl_num);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
assert(!qmckl_nucleus_provided(context));
rc = qmckl_get_nucleus_coord (context, <span style="color: #8b2252;">'N'</span>, nucl_coord2, nucl_num*3);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">k</span>=0 ; k&lt;3 ; ++k) {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">i</span>=0 ; i&lt;nucl_num ; ++i) {
assert( nucl_coord[nucl_num*k+i] == nucl_coord2[3*i+k] );
}
}
rc = qmckl_get_nucleus_coord (context, <span style="color: #8b2252;">'T'</span>, nucl_coord2, nucl_num*3);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">i</span>=0 ; i&lt;3*nucl_num ; ++i) {
assert( nucl_coord[i] == nucl_coord2[i] );
}
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">nucl_charge2</span>[nucl_num];
rc = qmckl_get_nucleus_charge(context, nucl_charge2, nucl_num);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_NOT_PROVIDED);
rc = qmckl_set_nucleus_charge(context, nucl_charge, nucl_num);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
rc = qmckl_get_nucleus_charge(context, nucl_charge2, nucl_num);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">i</span>=0 ; i&lt;nucl_num ; ++i) {
assert( nucl_charge[i] == nucl_charge2[i] );
}
<span style="color: #0000ff;">assert</span>(<span style="color: #228b22;">qmckl_nucleus_provided</span>(<span style="color: #a0522d;">context</span>));
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org54ad4a7" class="outline-2">
<h2 id="org54ad4a7"><span class="section-number-2">3</span> Computation</h2>
<div class="outline-text-2" id="text-3">
<p>
The computed data is stored in the context so that it can be reused
by different kernels. To ensure that the data is valid, for each
computed data the date of the context is stored when it is computed.
To know if some data needs to be recomputed, we check if the date of
the dependencies are more recent than the date of the data to
compute. If it is the case, then the data is recomputed and the
current date is stored.
</p>
</div>
<div id="outline-container-orgfd6ea7d" class="outline-3">
<h3 id="orgfd6ea7d"><span class="section-number-3">3.1</span> Asymptotic component for \(J_{ee}\)</h3>
<div class="outline-text-3" id="text-3-1">
<p>
Calculate the asymptotic component <code>asymp_jasb</code> to be substracted from the final
electron-electron jastrow factor \(J_{\text{ee}}\). The asymptotic component is calculated
via the <code>bord_vector</code> and the electron-electron rescale factor <code>rescale_factor_kappa</code>.
</p>
<p>
\[
J_{\text{ee}}^{\infty} = \frac{b_1 \kappa^{-1}}{1 + b_2 \kappa^{-1}}
\]
</p>
</div>
<div id="outline-container-orgee98321" class="outline-4">
<h4 id="orgee98321"><span class="section-number-4">3.1.1</span> Get</h4>
<div class="outline-text-4" id="text-3-1-1">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
<span style="color: #0000ff;">qmckl_get_jastrow_asymp_jasb</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">asymp_jasb</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-org10c0de1" class="outline-4">
<h4 id="org10c0de1"><span class="section-number-4">3.1.2</span> Compute</h4>
<div class="outline-text-4" id="text-3-1-2">
<table id="org91db779" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>bord_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Order of the polynomial</td>
</tr>
<tr>
<td class="org-left"><code>bord_vector</code></td>
<td class="org-left"><code>double[bord_num+1]</code></td>
<td class="org-left">in</td>
<td class="org-left">Values of b</td>
</tr>
<tr>
<td class="org-left"><code>rescale_factor_kappa_ee</code></td>
<td class="org-left"><code>double</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron coordinates</td>
</tr>
<tr>
<td class="org-left"><code>asymp_jasb</code></td>
<td class="org-left"><code>double[2]</code></td>
<td class="org-left">out</td>
<td class="org-left">Asymptotic value</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_asymp_jasb_f</span><span style="color: #000000; background-color: #ffffff;">(context, bord_num, bord_vector, rescale_factor_kappa_ee, asymp_jasb)</span><span style="color: #a0522d;"> </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">result</span>(info)
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> bord_num</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> bord_vector(bord_num + 1)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> rescale_factor_kappa_ee</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> asymp_jasb(2)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, p</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> kappa_inv, x, asym_one</span>
kappa_inv = 1.0d0 / rescale_factor_kappa_ee
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (bord_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
asym_one = bord_vector(1) * kappa_inv / (1.0d0 + bord_vector(2) * kappa_inv)
asymp_jasb(:) = (/asym_one, 0.5d0 * asym_one/)
<span style="color: #a020f0;">do</span> i = 1, 2
x = kappa_inv
<span style="color: #a020f0;">do</span> p = 2, bord_num
x = x * kappa_inv
asymp_jasb(i) = asymp_jasb(i) + bord_vector(p + 1) * x
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_asymp_jasb_f</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_asymp_jasb</span> (
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">bord_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">bord_vector</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span> <span style="color: #a0522d;">rescale_factor_kappa_ee</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">asymp_jasb</span> ) {
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT){
<span style="color: #a020f0;">return</span> QMCKL_INVALID_CONTEXT;
}
<span style="color: #a020f0;">if</span> (bord_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_2;
}
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span> <span style="color: #a0522d;">kappa_inv</span> = 1.0 / rescale_factor_kappa_ee;
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span> <span style="color: #a0522d;">asym_one</span> = bord_vector[0] * kappa_inv / (1.0 + bord_vector[1] * kappa_inv);
asymp_jasb[0] = asym_one;
asymp_jasb[1] = 0.5 * asym_one;
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0 ; i &lt;= 1; ++i) {
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">x</span> = kappa_inv;
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">p</span> = 1; p &lt; bord_num; ++p){
x *= kappa_inv;
asymp_jasb[i] = asymp_jasb[i] + bord_vector[p + 1] * x;
}
}
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
}
</pre>
</div>
</div>
</div>
<div id="outline-container-org73c25d0" class="outline-4">
<h4 id="org73c25d0"><span class="section-number-4">3.1.3</span> Test</h4>
<div class="outline-text-4" id="text-3-1-3">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #0000ff;">assert</span>(<span style="color: #228b22;">qmckl_electron_provided</span>(<span style="color: #a0522d;">context</span>));
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">type_nucl_num</span> = n2_type_nucl_num;
<span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">type_nucl_vector</span> = &amp;(n2_type_nucl_vector[0]);
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">aord_num</span> = n2_aord_num;
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">bord_num</span> = n2_bord_num;
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">cord_num</span> = n2_cord_num;
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">aord_vector</span> = &amp;(n2_aord_vector[0][0]);
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">bord_vector</span> = &amp;(n2_bord_vector[0]);
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">cord_vector</span> = &amp;(n2_cord_vector[0][0]);
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">dim_cord_vect</span>=0;
/* <span style="color: #b22222;">Initialize the Jastrow data </span>*/
rc = qmckl_init_jastrow(context);
assert(!qmckl_jastrow_provided(context));
/* <span style="color: #b22222;">Set the data </span>*/
rc = qmckl_set_jastrow_ord_num(context, aord_num, bord_num, cord_num);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
rc = qmckl_set_jastrow_type_nucl_num(context, type_nucl_num);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
rc = qmckl_set_jastrow_type_nucl_vector(context, type_nucl_vector, nucl_num);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
rc = qmckl_set_jastrow_aord_vector(context, aord_vector,(aord_num+1)*type_nucl_num);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
rc = qmckl_set_jastrow_bord_vector(context, bord_vector,(bord_num+1));
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
rc = qmckl_get_jastrow_dim_cord_vect(context, &amp;dim_cord_vect);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
rc = qmckl_set_jastrow_cord_vector(context, cord_vector,dim_cord_vect*type_nucl_num);
<span style="color: #0000ff;">assert</span>(rc == QMCKL_SUCCESS);
/* <span style="color: #b22222;">Check if Jastrow is properly initialized </span>*/
<span style="color: #0000ff;">assert</span>(<span style="color: #228b22;">qmckl_jastrow_provided</span>(<span style="color: #a0522d;">context</span>));
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">asymp_jasb</span>[2];
rc = qmckl_get_jastrow_asymp_jasb(context, asymp_jasb,2);
// <span style="color: #b22222;">calculate asymp_jasb</span>
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">asymp_jasb</span>[0]-0.5323750557252571) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">asymp_jasb</span>[1]-0.31567342786262853) &lt; 1.e-12);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org6902728" class="outline-3">
<h3 id="org6902728"><span class="section-number-3">3.2</span> Electron-electron component \(f_{ee}\)</h3>
<div class="outline-text-3" id="text-3-2">
<p>
Calculate the electron-electron jastrow component <code>factor_ee</code> using the <code>asymp_jasb</code>
componenet and the electron-electron rescaled distances <code>ee_distance_rescaled</code>.
</p>
<p>
\[
f_{ee} = \sum_{i,j<i} \left\{ \frac{ \eta B_0 C_{ij}}{1 - B_1 C_{ij}} - J_{asymp} + \sum^{nord}_{k}B_k C_{ij}^k \right\}
\]
</p>
</div>
<div id="outline-container-orgc535af7" class="outline-4">
<h4 id="orgc535af7"><span class="section-number-4">3.2.1</span> Get</h4>
<div class="outline-text-4" id="text-3-2-1">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
<span style="color: #0000ff;">qmckl_get_jastrow_factor_ee</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">factor_ee</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf33dba1" class="outline-4">
<h4 id="orgf33dba1"><span class="section-number-4">3.2.2</span> Compute</h4>
<div class="outline-text-4" id="text-3-2-2">
<table id="org6348d29" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>up_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of alpha electrons</td>
</tr>
<tr>
<td class="org-left"><code>bord_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of coefficients</td>
</tr>
<tr>
<td class="org-left"><code>bord_vector</code></td>
<td class="org-left"><code>double[bord_num+1]</code></td>
<td class="org-left">in</td>
<td class="org-left">List of coefficients</td>
</tr>
<tr>
<td class="org-left"><code>ee_distance_rescaled</code></td>
<td class="org-left"><code>double[walk_num][elec_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-electron distances</td>
</tr>
<tr>
<td class="org-left"><code>asymp_jasb</code></td>
<td class="org-left"><code>double[2]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-electron distances</td>
</tr>
<tr>
<td class="org-left"><code>factor_ee</code></td>
<td class="org-left"><code>double[walk_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Electron-electron distances</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> function qmckl_compute_factor_ee_f(context, walk_num, elec_num, up_num, bord_num, </span><span style="color: #a020f0;">&amp;</span>
bord_vector, ee_distance_rescaled, asymp_jasb, factor_ee) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">result</span>(info)
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> walk_num, elec_num, bord_num, up_num</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> bord_vector(bord_num + 1)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> ee_distance_rescaled(elec_num, elec_num, walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> asymp_jasb(2)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> factor_ee(walk_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, j, p, ipar, nw</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, power_ser, spin_fact</span>
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (bord_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
factor_ee = 0.0d0
<span style="color: #a020f0;">do</span> nw =1, walk_num
<span style="color: #a020f0;">do</span> j = 1, elec_num
<span style="color: #a020f0;">do</span> i = 1, j - 1
x = ee_distance_rescaled(i,j,nw)
power_ser = 0.0d0
spin_fact = 1.0d0
ipar = 1
<span style="color: #a020f0;">do</span> p = 2, bord_num
x = x * ee_distance_rescaled(i,j,nw)
power_ser = power_ser + bord_vector(p + 1) * x
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">if</span>(j &lt;= up_num <span style="color: #a020f0;">.OR.</span> i &gt; up_num) <span style="color: #a020f0;">then</span>
spin_fact = 0.5d0
ipar = 2
<span style="color: #a020f0;">endif</span>
factor_ee(nw) = factor_ee(nw) + spin_fact * bord_vector(1) * <span style="color: #a020f0;">&amp;</span>
ee_distance_rescaled(i,j,nw) / <span style="color: #a020f0;">&amp;</span>
(1.0d0 + bord_vector(2) * <span style="color: #a020f0;">&amp;</span>
ee_distance_rescaled(i,j,nw)) <span style="color: #a020f0;">&amp;</span>
-asymp_jasb(ipar) + power_ser
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_factor_ee_f</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_factor_ee</span> (
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">elec_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">up_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">bord_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">bord_vector</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ee_distance_rescaled</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">asymp_jasb</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">factor_ee</span> ) {
<span style="color: #228b22;">int</span> <span style="color: #a0522d;">ipar</span>; // <span style="color: #b22222;">can we use a smaller integer?</span>
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">x</span>, <span style="color: #a0522d;">x1</span>, <span style="color: #a0522d;">spin_fact</span>, <span style="color: #a0522d;">power_ser</span>;
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_CONTEXT;
}
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_2;
}
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_3;
}
<span style="color: #a020f0;">if</span> (bord_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_4;
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">nw</span> = 0; nw &lt; walk_num; ++nw) {
factor_ee[nw] = 0.0; // <span style="color: #b22222;">put init array here.</span>
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i &lt; elec_num; ++i ) {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">j</span> = 0; j &lt; i; ++j) {
//<span style="color: #b22222;">x = ee_distance_rescaled[j * (walk_num * elec_num) + i * (walk_num) + nw];</span>
x = ee_distance_rescaled[j + i * elec_num + nw*(elec_num * elec_num)];
x1 = x;
power_ser = 0.0;
spin_fact = 1.0;
ipar = 0; // <span style="color: #b22222;">index of asymp_jasb</span>
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">p</span> = 1; p &lt; bord_num; ++p) {
x = x * x1;
power_ser = power_ser + bord_vector[p + 1] * x;
}
<span style="color: #a020f0;">if</span>(i &lt; up_num || j &gt;= up_num) {
spin_fact = 0.5;
ipar = 1;
}
factor_ee[nw] = factor_ee[nw] + spin_fact * bord_vector[0] * \
x1 / \
(1.0 + bord_vector[1] * \
x1) \
-asymp_jasb[ipar] + power_ser;
}
}
}
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
}
</pre>
</div>
</div>
</div>
<div id="outline-container-org0a94337" class="outline-4">
<h4 id="org0a94337"><span class="section-number-4">3.2.3</span> Test</h4>
<div class="outline-text-4" id="text-3-2-3">
<div class="org-src-container">
<pre class="src src-c">/* <span style="color: #b22222;">Check if Jastrow is properly initialized </span>*/
<span style="color: #0000ff;">assert</span>(<span style="color: #228b22;">qmckl_jastrow_provided</span>(<span style="color: #a0522d;">context</span>));
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">factor_ee</span>[walk_num];
rc = qmckl_get_jastrow_factor_ee(context, factor_ee, walk_num);
// <span style="color: #b22222;">calculate factor_ee</span>
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">factor_ee</span>[0]+4.282760865958113) &lt; 1.e-12);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgb7d52d8" class="outline-3">
<h3 id="orgb7d52d8"><span class="section-number-3">3.3</span> Electron-electron component derivative \(f'_{ee}\)</h3>
<div class="outline-text-3" id="text-3-3">
<p>
Calculate the derivative of the <code>factor_ee</code> using the <code>ee_distance_rescaled</code> and
the electron-electron rescaled distances derivatives <code>ee_distance_rescaled_deriv_e</code>.
There are four components, the gradient which has 3 components in the \(x, y, z\)
directions and the laplacian as the last component.
</p>
<p>
TODO: Add equation
</p>
</div>
<div id="outline-container-orge512f64" class="outline-4">
<h4 id="orge512f64"><span class="section-number-4">3.3.1</span> Get</h4>
<div class="outline-text-4" id="text-3-3-1">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
<span style="color: #0000ff;">qmckl_get_jastrow_factor_ee_deriv_e</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">factor_ee_deriv_e</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-org741e611" class="outline-4">
<h4 id="org741e611"><span class="section-number-4">3.3.2</span> Compute</h4>
<div class="outline-text-4" id="text-3-3-2">
<table id="org9c3eab9" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>up_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of alpha electrons</td>
</tr>
<tr>
<td class="org-left"><code>bord_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of coefficients</td>
</tr>
<tr>
<td class="org-left"><code>bord_vector</code></td>
<td class="org-left"><code>double[bord_num+1]</code></td>
<td class="org-left">in</td>
<td class="org-left">List of coefficients</td>
</tr>
<tr>
<td class="org-left"><code>ee_distance_rescaled</code></td>
<td class="org-left"><code>double[walk_num][elec_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-electron distances</td>
</tr>
<tr>
<td class="org-left"><code>ee_distance_rescaled_deriv_e</code></td>
<td class="org-left"><code>double[walk_num][4][elec_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-electron distances</td>
</tr>
<tr>
<td class="org-left"><code>factor_ee_deriv_e</code></td>
<td class="org-left"><code>double[walk_num][4][elec_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Electron-electron distances</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> function qmckl_compute_factor_ee_deriv_e_doc_f( </span><span style="color: #a020f0;">&amp;</span>
context, walk_num, elec_num, up_num, bord_num, <span style="color: #a020f0;">&amp;</span>
bord_vector, ee_distance_rescaled, ee_distance_rescaled_deriv_e, <span style="color: #a020f0;">&amp;</span>
factor_ee_deriv_e) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">result</span>(info)
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> walk_num, elec_num, bord_num, up_num</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> bord_vector(bord_num + 1)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> ee_distance_rescaled(elec_num, elec_num,walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> ee_distance_rescaled_deriv_e(4,elec_num, elec_num,walk_num) </span>!<span style="color: #b22222;">TODO</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> factor_ee_deriv_e(elec_num,4,walk_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, j, p, nw, ii</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, spin_fact, y</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> den, invden, invden2, invden3, xinv</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> lap1, lap2, lap3, third</span>
<span style="color: #228b22;">double precision</span>, <span style="color: #a020f0;">dimension</span>(3) ::<span style="color: #a0522d;"> pow_ser_g</span>
<span style="color: #228b22;">double precision</span>, <span style="color: #a020f0;">dimension</span>(4) ::<span style="color: #a0522d;"> dx</span>
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (bord_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
factor_ee_deriv_e = 0.0d0
third = 1.0d0 / 3.0d0
<span style="color: #a020f0;">do</span> nw =1, walk_num
<span style="color: #a020f0;">do</span> j = 1, elec_num
<span style="color: #a020f0;">do</span> i = 1, elec_num
x = ee_distance_rescaled(i,j,nw)
<span style="color: #a020f0;">if</span>(<span style="color: #a020f0;">abs</span>(x) &lt; 1.0d-18) <span style="color: #a020f0;">cycle</span>
pow_ser_g = 0.0d0
spin_fact = 1.0d0
den = 1.0d0 + bord_vector(2) * x
invden = 1.0d0 / den
invden2 = invden * invden
invden3 = invden2 * invden
xinv = 1.0d0 / (x + 1.0d-18)
dx(1) = ee_distance_rescaled_deriv_e(1, i, j, nw)
dx(2) = ee_distance_rescaled_deriv_e(2, i, j, nw)
dx(3) = ee_distance_rescaled_deriv_e(3, i, j, nw)
dx(4) = ee_distance_rescaled_deriv_e(4, i, j, nw)
<span style="color: #a020f0;">if</span>((i <span style="color: #a020f0;">.LE.</span> up_num <span style="color: #a020f0;">.AND.</span> j <span style="color: #a020f0;">.LE.</span> up_num ) <span style="color: #a020f0;">.OR.</span> <span style="color: #a020f0;">&amp;</span>
(i <span style="color: #a020f0;">.GT.</span> up_num <span style="color: #a020f0;">.AND.</span> j <span style="color: #a020f0;">.GT.</span> up_num)) <span style="color: #a020f0;">then</span>
spin_fact = 0.5d0
<span style="color: #a020f0;">endif</span>
lap1 = 0.0d0
lap2 = 0.0d0
lap3 = 0.0d0
<span style="color: #a020f0;">do</span> ii = 1, 3
x = ee_distance_rescaled(i, j, nw)
<span style="color: #a020f0;">if</span>(<span style="color: #a020f0;">abs</span>(x) &lt; 1.0d-18) <span style="color: #a020f0;">cycle</span>
<span style="color: #a020f0;">do</span> p = 2, bord_num
y = p * bord_vector(p + 1) * x
pow_ser_g(ii) = pow_ser_g(ii) + y * dx(ii)
lap1 = lap1 + (p - 1) * y * xinv * dx(ii) * dx(ii)
lap2 = lap2 + y
x = x * ee_distance_rescaled(i, j, nw)
<span style="color: #a020f0;">end do</span>
lap3 = lap3 - 2.0d0 * bord_vector(2) * dx(ii) * dx(ii)
factor_ee_deriv_e( j, ii, nw) = factor_ee_deriv_e( j, ii, nw) + spin_fact * bord_vector(1) * <span style="color: #a020f0;">&amp;</span>
dx(ii) * invden2 + pow_ser_g(ii)
<span style="color: #a020f0;">end do</span>
ii = 4
lap2 = lap2 * dx(ii) * third
lap3 = lap3 + den * dx(ii)
lap3 = lap3 * (spin_fact * bord_vector(1) * invden3)
factor_ee_deriv_e( j, ii, nw) = factor_ee_deriv_e( j, ii, nw) + lap1 + lap2 + lap3
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_factor_ee_deriv_e_doc_f</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_factor_ee_deriv_e_hpc</span>(
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">elec_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">up_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">bord_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">bord_vector</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ee_distance_rescaled</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ee_distance_rescaled_deriv_e</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">factor_ee_deriv_e</span> ) {
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">ii</span>;
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">pow_ser_g</span>[3];
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">dx</span>[4];
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">x</span>, <span style="color: #a0522d;">spin_fact</span>, <span style="color: #a0522d;">y</span>;
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">den</span>, <span style="color: #a0522d;">invden</span>, <span style="color: #a0522d;">invden2</span>, <span style="color: #a0522d;">invden3</span>, <span style="color: #a0522d;">xinv</span>;
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">lap1</span>, <span style="color: #a0522d;">lap2</span>, <span style="color: #a0522d;">lap3</span>, <span style="color: #a0522d;">third</span>;
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_CONTEXT;
}
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_2;
}
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_3;
}
<span style="color: #a020f0;">if</span> (bord_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_4;
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">nw</span> = 0; nw &lt; walk_num; ++nw) {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">ii</span> = 0; ii &lt; 4; ++ii) {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">j</span> = 0; j &lt; elec_num; ++j) {
factor_ee_deriv_e[j + ii * elec_num + nw * elec_num * 4] = 0.0;
}
}
}
third = 1.0 / 3.0;
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">nw</span> = 0; nw &lt; walk_num; ++nw) {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i &lt; elec_num; ++i) {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">j</span> = 0; j &lt; elec_num; ++j) {
x = ee_distance_rescaled[j + i * elec_num + nw * elec_num * elec_num];
<span style="color: #a020f0;">if</span> (fabs(x) &lt; 1.0e-18) <span style="color: #a020f0;">continue</span>;
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">ii</span> = 0; ii &lt; 3; ++ii){
pow_ser_g[ii] = 0.0;
}
spin_fact = 1.0;
den = 1.0 + bord_vector[1] * x;
invden = 1.0 / den;
invden2 = invden * invden;
invden3 = invden2 * invden;
xinv = 1.0 / (x + 1.0e-18);
dx[0] = ee_distance_rescaled_deriv_e[0 \
+ j * 4 + i * 4 * elec_num \
+ nw * 4 * elec_num * elec_num];
dx[1] = ee_distance_rescaled_deriv_e[1 \
+ j * 4 + i * 4 * elec_num \
+ nw * 4 * elec_num * elec_num];
dx[2] = ee_distance_rescaled_deriv_e[2 \
+ j * 4 + i * 4 * elec_num \
+ nw * 4 * elec_num * elec_num];
dx[3] = ee_distance_rescaled_deriv_e[3 \
+ j * 4 + i * 4 * elec_num \
+ nw * 4 * elec_num * elec_num];
<span style="color: #a020f0;">if</span>((i &lt;= (up_num-1) &amp;&amp; j &lt;= (up_num-1) ) || (i &gt; (up_num-1) &amp;&amp; j &gt; (up_num-1))) {
spin_fact = 0.5;
}
lap1 = 0.0;
lap2 = 0.0;
lap3 = 0.0;
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">ii</span> = 0; ii &lt; 3; ++ii) {
x = ee_distance_rescaled[j + i * elec_num + nw * elec_num * elec_num];
<span style="color: #a020f0;">if</span> (fabs(x) &lt; 1.0e-18) <span style="color: #a020f0;">continue</span>;
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">p</span> = 2; p &lt; bord_num+1; ++p) {
y = p * bord_vector[(p-1) + 1] * x;
pow_ser_g[ii] = pow_ser_g[ii] + y * dx[ii];
lap1 = lap1 + (p - 1) * y * xinv * dx[ii] * dx[ii];
lap2 = lap2 + y;
x = x * ee_distance_rescaled[j + i * elec_num + nw * elec_num * elec_num];
}
lap3 = lap3 - 2.0 * bord_vector[1] * dx[ii] * dx[ii];
factor_ee_deriv_e[i + ii * elec_num + nw * elec_num * 4 ] += \
+ spin_fact * bord_vector[0] * dx[ii] * invden2 \
+ pow_ser_g[ii] ;
}
ii = 3;
lap2 = lap2 * dx[ii] * third;
lap3 = lap3 + den * dx[ii];
lap3 = lap3 * (spin_fact * bord_vector[0] * invden3);
factor_ee_deriv_e[i + ii*elec_num + nw * elec_num * 4] += lap1 + lap2 + lap3;
}
}
}
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_factor_ee_deriv_e_hpc</span> (
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">elec_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">up_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">bord_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">bord_vector</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ee_distance_rescaled</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ee_distance_rescaled_deriv_e</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">factor_ee_deriv_e</span> );
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_factor_ee_deriv_e_doc</span> (
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">elec_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">up_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">bord_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">bord_vector</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ee_distance_rescaled</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ee_distance_rescaled_deriv_e</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">factor_ee_deriv_e</span> );
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"> <span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_factor_ee_deriv_e</span> (
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">elec_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">up_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">bord_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">bord_vector</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ee_distance_rescaled</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ee_distance_rescaled_deriv_e</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">factor_ee_deriv_e</span> ) {
<span style="color: #483d8b;"> #ifdef</span> HAVE_HPC
<span style="color: #a020f0;">return</span> qmckl_compute_factor_ee_deriv_e_hpc(context, walk_num, elec_num, up_num, bord_num, bord_vector, ee_distance_rescaled, ee_distance_rescaled_deriv_e, factor_ee_deriv_e );
<span style="color: #483d8b;"> #else</span>
<span style="color: #a020f0;">return</span> qmckl_compute_factor_ee_deriv_e_doc(context, walk_num, elec_num, up_num, bord_num, bord_vector, ee_distance_rescaled, ee_distance_rescaled_deriv_e, factor_ee_deriv_e );
<span style="color: #483d8b;"> #endif</span>
}
</pre>
</div>
</div>
</div>
<div id="outline-container-org5de8ec5" class="outline-4">
<h4 id="org5de8ec5"><span class="section-number-4">3.3.3</span> Test</h4>
<div class="outline-text-4" id="text-3-3-3">
<div class="org-src-container">
<pre class="src src-c">/* <span style="color: #b22222;">Check if Jastrow is properly initialized </span>*/
<span style="color: #0000ff;">assert</span>(<span style="color: #228b22;">qmckl_jastrow_provided</span>(<span style="color: #a0522d;">context</span>));
// <span style="color: #b22222;">calculate factor_ee_deriv_e</span>
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">factor_ee_deriv_e</span>[walk_num][4][elec_num];
rc = qmckl_get_jastrow_factor_ee_deriv_e(context, &amp;(factor_ee_deriv_e[0][0][0]),walk_num*4*elec_num);
// <span style="color: #b22222;">check factor_ee_deriv_e</span>
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">factor_ee_deriv_e</span>[0][0][0]-0.16364894652107934) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">factor_ee_deriv_e</span>[0][1][0]+0.6927548119830084 ) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">factor_ee_deriv_e</span>[0][2][0]-0.073267755223968 ) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">factor_ee_deriv_e</span>[0][3][0]-1.5111672803213185 ) &lt; 1.e-12);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgd86cd4a" class="outline-3">
<h3 id="orgd86cd4a"><span class="section-number-3">3.4</span> Electron-nucleus component \(f_{en}\)</h3>
<div class="outline-text-3" id="text-3-4">
<p>
Calculate the electron-electron jastrow component <code>factor_en</code> using the <code>aord_vector</code>
coeffecients and the electron-nucleus rescaled distances <code>en_distance_rescaled</code>.
</p>
<p>
\[
f_{en} = \sum_{i,j<i} \left\{ \frac{ A_0 C_{ij}}{1 - A_1 C_{ij}} + \sum^{nord}_{k}A_k C_{ij}^k \right\}
\]
</p>
</div>
<div id="outline-container-org412946e" class="outline-4">
<h4 id="org412946e"><span class="section-number-4">3.4.1</span> Get</h4>
<div class="outline-text-4" id="text-3-4-1">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
<span style="color: #0000ff;">qmckl_get_jastrow_factor_en</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">factor_en</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgfb89b86" class="outline-4">
<h4 id="orgfb89b86"><span class="section-number-4">3.4.2</span> Compute</h4>
<div class="outline-text-4" id="text-3-4-2">
<table id="org7c61426" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of nucleii</td>
</tr>
<tr>
<td class="org-left"><code>type_nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of unique nuclei</td>
</tr>
<tr>
<td class="org-left"><code>type_nucl_vector</code></td>
<td class="org-left"><code>int64_t[nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">IDs of unique nucleii</td>
</tr>
<tr>
<td class="org-left"><code>aord_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of coefficients</td>
</tr>
<tr>
<td class="org-left"><code>aord_vector</code></td>
<td class="org-left"><code>double[aord_num+1][type_nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">List of coefficients</td>
</tr>
<tr>
<td class="org-left"><code>en_distance_rescaled</code></td>
<td class="org-left"><code>double[walk_num][nucl_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus distances</td>
</tr>
<tr>
<td class="org-left"><code>factor_en</code></td>
<td class="org-left"><code>double[walk_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Electron-nucleus jastrow</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> function qmckl_compute_factor_en_f( </span><span style="color: #a020f0;">&amp;</span>
context, walk_num, elec_num, nucl_num, type_nucl_num, <span style="color: #a020f0;">&amp;</span>
type_nucl_vector, aord_num, aord_vector, <span style="color: #a020f0;">&amp;</span>
en_distance_rescaled, factor_en) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">result</span>(info)
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> walk_num, elec_num, aord_num, nucl_num, type_nucl_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> type_nucl_vector(nucl_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> aord_vector(aord_num + 1, type_nucl_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_distance_rescaled(elec_num, nucl_num, walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> factor_en(walk_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, p, nw</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, power_ser</span>
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (aord_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_7
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
factor_en = 0.0d0
<span style="color: #a020f0;">do</span> nw =1, walk_num
<span style="color: #a020f0;">do</span> a = 1, nucl_num
<span style="color: #a020f0;">do</span> i = 1, elec_num
x = en_distance_rescaled(i, a, nw)
power_ser = 0.0d0
<span style="color: #a020f0;">do</span> p = 2, aord_num
x = x * en_distance_rescaled(i, a, nw)
power_ser = power_ser + aord_vector(p + 1, type_nucl_vector(a)) * x
<span style="color: #a020f0;">end do</span>
factor_en(nw) = factor_en(nw) + aord_vector(1, type_nucl_vector(a)) * <span style="color: #a020f0;">&amp;</span>
en_distance_rescaled(i, a, nw) / <span style="color: #a020f0;">&amp;</span>
(1.0d0 + aord_vector(2, type_nucl_vector(a)) * <span style="color: #a020f0;">&amp;</span>
en_distance_rescaled(i, a, nw)) <span style="color: #a020f0;">&amp;</span>
+ power_ser
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_factor_en_f</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_factor_en</span> (
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">elec_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nucl_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">type_nucl_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">type_nucl_vector</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">aord_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">aord_vector</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">en_distance_rescaled</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">factor_en</span> ) {
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">x</span>, <span style="color: #a0522d;">x1</span>, <span style="color: #a0522d;">power_ser</span>;
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_CONTEXT;
}
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_2;
}
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_3;
}
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_4;
}
<span style="color: #a020f0;">if</span> (type_nucl_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_5;
}
<span style="color: #a020f0;">if</span> (type_nucl_vector == <span style="color: #008b8b;">NULL</span>) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_6;
}
<span style="color: #a020f0;">if</span> (aord_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_7;
}
<span style="color: #a020f0;">if</span> (aord_vector == <span style="color: #008b8b;">NULL</span>) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_8;
}
<span style="color: #a020f0;">if</span> (en_distance_rescaled == <span style="color: #008b8b;">NULL</span>) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_9;
}
<span style="color: #a020f0;">if</span> (factor_en == <span style="color: #008b8b;">NULL</span>) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_10;
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">nw</span> = 0; nw &lt; walk_num; ++nw ) {
// <span style="color: #b22222;">init array</span>
factor_en[nw] = 0.0;
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">a</span> = 0; a &lt; nucl_num; ++a ) {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i &lt; elec_num; ++i ) {
// <span style="color: #b22222;">x = ee_distance_rescaled[j * (walk_num * elec_num) + i * (walk_num) + nw];</span>
x = en_distance_rescaled[i + a * elec_num + nw * (elec_num * nucl_num)];
x1 = x;
power_ser = 0.0;
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">p</span> = 2; p &lt; aord_num+1; ++p) {
x = x * x1;
power_ser = power_ser + aord_vector[(p+1)-1 + (type_nucl_vector[a]-1) * aord_num] * x;
}
factor_en[nw] = factor_en[nw] + aord_vector[0 + (type_nucl_vector[a]-1)*aord_num] * x1 / \
(1.0 + aord_vector[1 + (type_nucl_vector[a]-1) * aord_num] * x1) + \
power_ser;
}
}
}
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
}
</pre>
</div>
</div>
</div>
<div id="outline-container-org1f25990" class="outline-4">
<h4 id="org1f25990"><span class="section-number-4">3.4.3</span> Test</h4>
<div class="outline-text-4" id="text-3-4-3">
<div class="org-src-container">
<pre class="src src-c">/* <span style="color: #b22222;">Check if Jastrow is properly initialized </span>*/
<span style="color: #0000ff;">assert</span>(<span style="color: #228b22;">qmckl_jastrow_provided</span>(<span style="color: #a0522d;">context</span>));
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">factor_en</span>[walk_num];
rc = qmckl_get_jastrow_factor_en(context, factor_en,walk_num);
// <span style="color: #b22222;">calculate factor_en</span>
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">factor_en</span>[0]+5.865822569188727) &lt; 1.e-12);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org78a0c39" class="outline-3">
<h3 id="org78a0c39"><span class="section-number-3">3.5</span> Electron-nucleus component derivative \(f'_{en}\)</h3>
<div class="outline-text-3" id="text-3-5">
<p>
Calculate the electron-electron jastrow component <code>factor_en_deriv_e</code> derivative
with respect to the electron coordinates using the <code>en_distance_rescaled</code> and
<code>en_distance_rescaled_deriv_e</code> which are already calculated previously.
</p>
<p>
TODO: write equations.
</p>
</div>
<div id="outline-container-org4c49328" class="outline-4">
<h4 id="org4c49328"><span class="section-number-4">3.5.1</span> Get</h4>
<div class="outline-text-4" id="text-3-5-1">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
<span style="color: #0000ff;">qmckl_get_jastrow_factor_en_deriv_e</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">factor_en_deriv_e</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgd4e18c0" class="outline-4">
<h4 id="orgd4e18c0"><span class="section-number-4">3.5.2</span> Compute</h4>
<div class="outline-text-4" id="text-3-5-2">
<table id="org149b928" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of nucleii</td>
</tr>
<tr>
<td class="org-left"><code>type_nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of unique nuclei</td>
</tr>
<tr>
<td class="org-left"><code>type_nucl_vector</code></td>
<td class="org-left"><code>int64_t[nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">IDs of unique nucleii</td>
</tr>
<tr>
<td class="org-left"><code>aord_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of coefficients</td>
</tr>
<tr>
<td class="org-left"><code>aord_vector</code></td>
<td class="org-left"><code>double[aord_num+1][type_nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">List of coefficients</td>
</tr>
<tr>
<td class="org-left"><code>en_distance_rescaled</code></td>
<td class="org-left"><code>double[walk_num][nucl_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus distances</td>
</tr>
<tr>
<td class="org-left"><code>en_distance_rescaled_deriv_e</code></td>
<td class="org-left"><code>double[walk_num][4][nucl_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus distance derivatives</td>
</tr>
<tr>
<td class="org-left"><code>factor_en_deriv_e</code></td>
<td class="org-left"><code>double[walk_num][4][elec_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Electron-nucleus jastrow</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> function qmckl_compute_factor_en_deriv_e_f( </span><span style="color: #a020f0;">&amp;</span>
context, walk_num, elec_num, nucl_num, type_nucl_num, <span style="color: #a020f0;">&amp;</span>
type_nucl_vector, aord_num, aord_vector, <span style="color: #a020f0;">&amp;</span>
en_distance_rescaled, en_distance_rescaled_deriv_e, factor_en_deriv_e) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">result</span>(info)
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> walk_num, elec_num, aord_num, nucl_num, type_nucl_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> type_nucl_vector(nucl_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> aord_vector(aord_num + 1, type_nucl_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_distance_rescaled(elec_num, nucl_num, walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_distance_rescaled_deriv_e(4, elec_num, nucl_num, walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> factor_en_deriv_e(elec_num,4,walk_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, p, ipar, nw, ii</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, den, invden, invden2, invden3, xinv</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> y, lap1, lap2, lap3, third</span>
<span style="color: #228b22;">double precision</span>, <span style="color: #a020f0;">dimension</span>(3) ::<span style="color: #a0522d;"> power_ser_g</span>
<span style="color: #228b22;">double precision</span>, <span style="color: #a020f0;">dimension</span>(4) ::<span style="color: #a0522d;"> dx</span>
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (aord_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_7
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
factor_en_deriv_e = 0.0d0
third = 1.0d0 / 3.0d0
<span style="color: #a020f0;">do</span> nw =1, walk_num
<span style="color: #a020f0;">do</span> a = 1, nucl_num
<span style="color: #a020f0;">do</span> i = 1, elec_num
x = en_distance_rescaled(i,a,nw)
<span style="color: #a020f0;">if</span>(<span style="color: #a020f0;">abs</span>(x) &lt; 1.0d-18) <span style="color: #a020f0;">continue</span>
power_ser_g = 0.0d0
den = 1.0d0 + aord_vector(2, type_nucl_vector(a)) * x
invden = 1.0d0 / den
invden2 = invden * invden
invden3 = invden2 * invden
xinv = 1.0d0 / x
<span style="color: #a020f0;">do</span> ii = 1, 4
dx(ii) = en_distance_rescaled_deriv_e(ii,i,a,nw)
<span style="color: #a020f0;">end do</span>
lap1 = 0.0d0
lap2 = 0.0d0
lap3 = 0.0d0
<span style="color: #a020f0;">do</span> ii = 1, 3
x = en_distance_rescaled(i, a, nw)
<span style="color: #a020f0;">do</span> p = 2, aord_num
y = p * aord_vector(p + 1, type_nucl_vector(a)) * x
power_ser_g(ii) = power_ser_g(ii) + y * dx(ii)
lap1 = lap1 + (p - 1) * y * xinv * dx(ii) * dx(ii)
lap2 = lap2 + y
x = x * en_distance_rescaled(i, a, nw)
<span style="color: #a020f0;">end do</span>
lap3 = lap3 - 2.0d0 * aord_vector(2, type_nucl_vector(a)) * dx(ii) * dx(ii)
factor_en_deriv_e(i, ii, nw) = factor_en_deriv_e(i, ii, nw) + aord_vector(1, type_nucl_vector(a)) <span style="color: #a020f0;">&amp;</span>
* dx(ii) * invden2 <span style="color: #a020f0;">&amp;</span>
+ power_ser_g(ii)
<span style="color: #a020f0;">end do</span>
ii = 4
lap2 = lap2 * dx(ii) * third
lap3 = lap3 + den * dx(ii)
lap3 = lap3 * aord_vector(1, type_nucl_vector(a)) * invden3
factor_en_deriv_e(i, ii, nw) = factor_en_deriv_e(i, ii, nw) + lap1 + lap2 + lap3
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_factor_en_deriv_e_f</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org3320012" class="outline-4">
<h4 id="org3320012"><span class="section-number-4">3.5.3</span> Test</h4>
<div class="outline-text-4" id="text-3-5-3">
<div class="org-src-container">
<pre class="src src-c">/* <span style="color: #b22222;">Check if Jastrow is properly initialized </span>*/
<span style="color: #0000ff;">assert</span>(<span style="color: #228b22;">qmckl_jastrow_provided</span>(<span style="color: #a0522d;">context</span>));
// <span style="color: #b22222;">calculate factor_en_deriv_e</span>
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">factor_en_deriv_e</span>[walk_num][4][elec_num];
rc = qmckl_get_jastrow_factor_en_deriv_e(context, &amp;(factor_en_deriv_e[0][0][0]),walk_num*4*elec_num);
// <span style="color: #b22222;">check factor_en_deriv_e</span>
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">factor_en_deriv_e</span>[0][0][0]-0.11609919541763383) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">factor_en_deriv_e</span>[0][1][0]+0.23301394780804574) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">factor_en_deriv_e</span>[0][2][0]-0.17548337641865783) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">factor_en_deriv_e</span>[0][3][0]+0.9667363412285741 ) &lt; 1.e-12);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgba7e064" class="outline-3">
<h3 id="orgba7e064"><span class="section-number-3">3.6</span> Electron-electron rescaled distances for each order</h3>
<div class="outline-text-3" id="text-3-6">
<p>
<code>een_rescaled_e</code> stores the table of the rescaled distances between all
pairs of electrons and raised to the power \(p\) defined by <code>cord_num</code>:
</p>
<p>
\[
C_{ij,p} = \left( 1 - \exp{-\kappa C_{ij}} \right)^p
\]
</p>
<p>
where \(C_{ij}\) is the matrix of electron-electron distances.
</p>
</div>
<div id="outline-container-org1c7357a" class="outline-4">
<h4 id="org1c7357a"><span class="section-number-4">3.6.1</span> Get</h4>
<div class="outline-text-4" id="text-3-6-1">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
<span style="color: #0000ff;">qmckl_get_jastrow_een_rescaled_e</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">distance_rescaled</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-org71d5d20" class="outline-4">
<h4 id="org71d5d20"><span class="section-number-4">3.6.2</span> Compute</h4>
<div class="outline-text-4" id="text-3-6-2">
<table id="orgfcad0e6" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>cord_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Order of polynomials</td>
</tr>
<tr>
<td class="org-left"><code>rescale_factor_kappa_ee</code></td>
<td class="org-left"><code>double</code></td>
<td class="org-left">in</td>
<td class="org-left">Factor to rescale ee distances</td>
</tr>
<tr>
<td class="org-left"><code>ee_distance</code></td>
<td class="org-left"><code>double[walk_num][elec_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-electron distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_e</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num][elec_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Electron-electron rescaled distances</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> function qmckl_compute_een_rescaled_e_doc_f( </span><span style="color: #a020f0;">&amp;</span>
context, walk_num, elec_num, cord_num, rescale_factor_kappa_ee, <span style="color: #a020f0;">&amp;</span>
ee_distance, een_rescaled_e) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">result</span>(info)
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> walk_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> elec_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> cord_num</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> rescale_factor_kappa_ee</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> ee_distance(elec_num,elec_num,walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> een_rescaled_e(elec_num,elec_num,0:cord_num,walk_num)</span>
<span style="color: #228b22;">double precision</span>,<span style="color: #a020f0;">dimension</span>(:,:),<span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> een_rescaled_e_ij</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, j, k, l, nw</span>
<span style="color: #a020f0;">allocate</span>(een_rescaled_e_ij(elec_num * (elec_num - 1) / 2, cord_num + 1))
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (cord_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
! <span style="color: #b22222;">Prepare table of exponentiated distances raised to appropriate power</span>
een_rescaled_e = 0.0d0
<span style="color: #a020f0;">do</span> nw = 1, walk_num
een_rescaled_e_ij = 0.0d0
een_rescaled_e_ij(:, 1) = 1.0d0
k = 0
<span style="color: #a020f0;">do</span> j = 1, elec_num
<span style="color: #a020f0;">do</span> i = 1, j - 1
k = k + 1
een_rescaled_e_ij(k, 2) = dexp(-rescale_factor_kappa_ee * ee_distance(i, j, nw))
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">do</span> l = 2, cord_num
<span style="color: #a020f0;">do</span> k = 1, elec_num * (elec_num - 1)/2
een_rescaled_e_ij(k, l + 1) = een_rescaled_e_ij(k, l + 1 - 1) * een_rescaled_e_ij(k, 2)
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
! <span style="color: #b22222;">prepare the actual een table</span>
een_rescaled_e(:, :, 0, nw) = 1.0d0
<span style="color: #a020f0;">do</span> l = 1, cord_num
k = 0
<span style="color: #a020f0;">do</span> j = 1, elec_num
<span style="color: #a020f0;">do</span> i = 1, j - 1
k = k + 1
x = een_rescaled_e_ij(k, l + 1)
een_rescaled_e(i, j, l, nw) = x
een_rescaled_e(j, i, l, nw) = x
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">do</span> l = 0, cord_num
<span style="color: #a020f0;">do</span> j = 1, elec_num
een_rescaled_e(j, j, l, nw) = 0.0d0
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_een_rescaled_e_doc_f</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_een_rescaled_e_hpc</span> (
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">elec_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">cord_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span> <span style="color: #a0522d;">rescale_factor_kappa_ee</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ee_distance</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">een_rescaled_e</span> ) {
<span style="color: #228b22;">double</span> *<span style="color: #a0522d;">een_rescaled_e_ij</span>;
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">x</span>;
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">elec_pairs</span> = (elec_num * (elec_num - 1)) / 2;
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">len_een_ij</span> = elec_pairs * (cord_num + 1);
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">k</span>;
// <span style="color: #b22222;">number of element for the een_rescaled_e_ij[N_e*(N_e-1)/2][cord+1]</span>
// <span style="color: #b22222;">probably in C is better [cord+1, Ne*(Ne-1)/2]</span>
//<span style="color: #b22222;">elec_pairs = (elec_num * (elec_num - 1)) / 2;</span>
//<span style="color: #b22222;">len_een_ij = elec_pairs * (cord_num + 1);</span>
een_rescaled_e_ij = (<span style="color: #228b22;">double</span> *) malloc (<span style="color: #228b22;">len_een_ij</span> * <span style="color: #a020f0;">sizeof</span>(<span style="color: #228b22;">double</span>));
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_CONTEXT;
}
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_2;
}
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_3;
}
<span style="color: #a020f0;">if</span> (cord_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_4;
}
// <span style="color: #b22222;">Prepare table of exponentiated distances raised to appropriate power</span>
// <span style="color: #b22222;">init</span>
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">kk</span> = 0; kk &lt; walk_num*(cord_num+1)*elec_num*elec_num; ++kk) {
een_rescaled_e[kk]= 0.0;
}
/*
<span style="color: #b22222;"> for (int nw = 0; nw &lt; walk_num; ++nw) {</span>
<span style="color: #b22222;"> for (int l = 0; l &lt; (cord_num + 1); ++l) {</span>
<span style="color: #b22222;"> for (int i = 0; i &lt; elec_num; ++i) {</span>
<span style="color: #b22222;"> for (int j = 0; j &lt; elec_num; ++j) {</span>
<span style="color: #b22222;"> een_rescaled_e[j + i*elec_num + l*elec_num*elec_num + nw*(cord_num+1)*elec_num*elec_num]= 0.0;</span>
<span style="color: #b22222;"> }</span>
<span style="color: #b22222;"> }</span>
<span style="color: #b22222;"> }</span>
<span style="color: #b22222;"> }</span>
<span style="color: #b22222;"> </span>*/
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">nw</span> = 0; nw &lt; walk_num; ++nw) {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">kk</span> = 0; kk &lt; len_een_ij; ++kk) {
// <span style="color: #b22222;">this array initialized at 0 except een_rescaled_e_ij(:, 1) = 1.0d0</span>
// <span style="color: #b22222;">and the arrangement of indices is [cord_num+1, ne*(ne-1)/2]</span>
een_rescaled_e_ij[kk]= ( kk &lt; (elec_pairs) ? 1.0 : 0.0 );
}
k = 0;
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i &lt; elec_num; ++i) {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">j</span> = 0; j &lt; i; ++j) {
// <span style="color: #b22222;">een_rescaled_e_ij(k, 2) = dexp(-rescale_factor_kappa_ee * ee_distance(i, j, nw));</span>
een_rescaled_e_ij[k + elec_pairs] = exp(-rescale_factor_kappa_ee * \
ee_distance[j + i*elec_num + nw*(elec_num*elec_num)]);
k = k + 1;
}
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">l</span> = 2; l &lt; (cord_num+1); ++l) {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">k</span> = 0; k &lt; elec_pairs; ++k) {
// <span style="color: #b22222;">een_rescaled_e_ij(k, l + 1) = een_rescaled_e_ij(k, l + 1 - 1) * een_rescaled_e_ij(k, 2)</span>
een_rescaled_e_ij[k+l*elec_pairs] = een_rescaled_e_ij[k + (l - 1)*elec_pairs] * \
een_rescaled_e_ij[k + elec_pairs];
}
}
// <span style="color: #b22222;">prepare the actual een table</span>
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i &lt; elec_num; ++i){
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">j</span> = 0; j &lt; elec_num; ++j) {
een_rescaled_e[j + i*elec_num + 0 + nw*(cord_num+1)*elec_num*elec_num] = 1.0;
}
}
// <span style="color: #b22222;">Up to here it should work.</span>
<span style="color: #a020f0;">for</span> ( <span style="color: #228b22;">int</span> <span style="color: #a0522d;">l</span> = 1; l &lt; (cord_num+1); ++l) {
k = 0;
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i &lt; elec_num; ++i) {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">j</span> = 0; j &lt; i; ++j) {
x = een_rescaled_e_ij[k + l*elec_pairs];
een_rescaled_e[j + i*elec_num + l*elec_num*elec_num + nw*elec_num*elec_num*(cord_num+1)] = x;
een_rescaled_e[i + j*elec_num + l*elec_num*elec_num + nw*elec_num*elec_num*(cord_num+1)] = x;
k = k + 1;
}
}
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">l</span> = 0; l &lt; (cord_num + 1); ++l) {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">j</span> = 0; j &lt; elec_num; ++j) {
een_rescaled_e[j + j*elec_num + l*elec_num*elec_num + nw*elec_num*elec_num*(cord_num+1)] = 0.0;
}
}
}
free(een_rescaled_e_ij);
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_een_rescaled_e_doc</span> (
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">elec_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">cord_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span> <span style="color: #a0522d;">rescale_factor_kappa_ee</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ee_distance</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">een_rescaled_e</span> );
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_een_rescaled_e_hpc</span> (
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">elec_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">cord_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span> <span style="color: #a0522d;">rescale_factor_kappa_ee</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ee_distance</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">een_rescaled_e</span> );
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_een_rescaled_e</span> (
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">elec_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">cord_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span> <span style="color: #a0522d;">rescale_factor_kappa_ee</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ee_distance</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">een_rescaled_e</span> ) {
<span style="color: #483d8b;">#ifdef</span> HAVE_HPC
<span style="color: #a020f0;">return</span> qmckl_compute_een_rescaled_e_hpc(context, walk_num, elec_num, cord_num, rescale_factor_kappa_ee, ee_distance, een_rescaled_e);
<span style="color: #483d8b;">#else</span>
<span style="color: #a020f0;">return</span> qmckl_compute_een_rescaled_e_doc(context, walk_num, elec_num, cord_num, rescale_factor_kappa_ee, ee_distance, een_rescaled_e);
<span style="color: #483d8b;">#endif</span>
}
</pre>
</div>
</div>
</div>
<div id="outline-container-org9787e5e" class="outline-4">
<h4 id="org9787e5e"><span class="section-number-4">3.6.3</span> Test</h4>
<div class="outline-text-4" id="text-3-6-3">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #0000ff;">assert</span>(<span style="color: #228b22;">qmckl_electron_provided</span>(<span style="color: #a0522d;">context</span>));
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">een_rescaled_e</span>[walk_num][(cord_num + 1)][elec_num][elec_num];
rc = qmckl_get_jastrow_een_rescaled_e(context, &amp;(een_rescaled_e[0][0][0][0]),elec_num*elec_num*(cord_num+1)*walk_num);
// <span style="color: #b22222;">value of (0,2,1)</span>
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_e</span>[0][1][0][2]-0.08084493981483197) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_e</span>[0][1][0][3]-0.1066745707571846) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_e</span>[0][1][0][4]-0.01754273169464735) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_e</span>[0][2][1][3]-0.02214680362033448) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_e</span>[0][2][1][4]-0.0005700154999202759) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_e</span>[0][2][1][5]-0.3424402276009091) &lt; 1.e-12);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org6a64ea8" class="outline-3">
<h3 id="org6a64ea8"><span class="section-number-3">3.7</span> Electron-electron rescaled distances for each order and derivatives</h3>
<div class="outline-text-3" id="text-3-7">
<p>
<code>een_rescaled_e_deriv_e</code> stores the table of the derivatives of the
rescaled distances between all pairs of electrons and raised to the
power \(p\) defined by <code>cord_num</code>. Here we take its derivatives
required for the een jastrow.
</p>
<p>
TODO: write formulae
</p>
</div>
<div id="outline-container-orgd655e39" class="outline-4">
<h4 id="orgd655e39"><span class="section-number-4">3.7.1</span> Get</h4>
<div class="outline-text-4" id="text-3-7-1">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
<span style="color: #0000ff;">qmckl_get_jastrow_een_rescaled_e_deriv_e</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">distance_rescaled</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-orga43fe99" class="outline-4">
<h4 id="orga43fe99"><span class="section-number-4">3.7.2</span> Compute</h4>
<div class="outline-text-4" id="text-3-7-2">
<table id="orgc590224" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>cord_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Order of polynomials</td>
</tr>
<tr>
<td class="org-left"><code>rescale_factor_kappa_ee</code></td>
<td class="org-left"><code>double</code></td>
<td class="org-left">in</td>
<td class="org-left">Factor to rescale ee distances</td>
</tr>
<tr>
<td class="org-left"><code>coord_new</code></td>
<td class="org-left"><code>double[walk_num][3][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron coordinates</td>
</tr>
<tr>
<td class="org-left"><code>ee_distance</code></td>
<td class="org-left"><code>double[walk_num][elec_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-electron distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_e</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-electron distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_e_deriv_e</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num][4][elec_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Electron-electron rescaled distances</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> function qmckl_compute_factor_een_rescaled_e_deriv_e_f( </span><span style="color: #a020f0;">&amp;</span>
context, walk_num, elec_num, cord_num, rescale_factor_kappa_ee, <span style="color: #a020f0;">&amp;</span>
coord_new, ee_distance, een_rescaled_e, een_rescaled_e_deriv_e) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">result</span>(info)
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> walk_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> elec_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> cord_num</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> rescale_factor_kappa_ee</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coord_new(elec_num,3,walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> ee_distance(elec_num,elec_num,walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_e(elec_num,elec_num,0:cord_num,walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> een_rescaled_e_deriv_e(elec_num,4,elec_num,0:cord_num,walk_num)</span>
<span style="color: #228b22;">double precision</span>,<span style="color: #a020f0;">dimension</span>(:,:,:),<span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> elec_dist_deriv_e</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, rij_inv, kappa_l</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, j, k, l, nw, ii</span>
<span style="color: #a020f0;">allocate</span>(elec_dist_deriv_e(4,elec_num,elec_num))
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (cord_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
! <span style="color: #b22222;">Prepare table of exponentiated distances raised to appropriate power</span>
een_rescaled_e_deriv_e = 0.0d0
<span style="color: #a020f0;">do</span> nw = 1, walk_num
<span style="color: #a020f0;">do</span> j = 1, elec_num
<span style="color: #a020f0;">do</span> i = 1, elec_num
rij_inv = 1.0d0 / ee_distance(i, j, nw)
<span style="color: #a020f0;">do</span> ii = 1, 3
elec_dist_deriv_e(ii, i, j) = (coord_new(i, ii, nw) - coord_new(j, ii, nw)) * rij_inv
<span style="color: #a020f0;">end do</span>
elec_dist_deriv_e(4, i, j) = 2.0d0 * rij_inv
<span style="color: #a020f0;">end do</span>
elec_dist_deriv_e(:, j, j) = 0.0d0
<span style="color: #a020f0;">end do</span>
! <span style="color: #b22222;">prepare the actual een table</span>
<span style="color: #a020f0;">do</span> l = 1, cord_num
kappa_l = - <span style="color: #a020f0;">dble</span>(l) * rescale_factor_kappa_ee
<span style="color: #a020f0;">do</span> j = 1, elec_num
<span style="color: #a020f0;">do</span> i = 1, elec_num
een_rescaled_e_deriv_e(i, 1, j, l, nw) = kappa_l * elec_dist_deriv_e(1, i, j)
een_rescaled_e_deriv_e(i, 2, j, l, nw) = kappa_l * elec_dist_deriv_e(2, i, j)
een_rescaled_e_deriv_e(i, 3, j, l, nw) = kappa_l * elec_dist_deriv_e(3, i, j)
een_rescaled_e_deriv_e(i, 4, j, l, nw) = kappa_l * elec_dist_deriv_e(4, i, j)
een_rescaled_e_deriv_e(i, 4, j, l, nw) = een_rescaled_e_deriv_e(i, 4, j, l, nw) <span style="color: #a020f0;">&amp;</span>
+ een_rescaled_e_deriv_e(i, 1, j, l, nw) * een_rescaled_e_deriv_e(i, 1, j, l, nw) <span style="color: #a020f0;">&amp;</span>
+ een_rescaled_e_deriv_e(i, 2, j, l, nw) * een_rescaled_e_deriv_e(i, 2, j, l, nw) <span style="color: #a020f0;">&amp;</span>
+ een_rescaled_e_deriv_e(i, 3, j, l, nw) * een_rescaled_e_deriv_e(i, 3, j, l, nw)
een_rescaled_e_deriv_e(i, 1, j, l, nw) = een_rescaled_e_deriv_e(i, 1, j, l, nw) * <span style="color: #a020f0;">&amp;</span>
een_rescaled_e(i, j, l, nw)
een_rescaled_e_deriv_e(i, 3, j, l, nw) = een_rescaled_e_deriv_e(i, 2, j, l, nw) * <span style="color: #a020f0;">&amp;</span>
een_rescaled_e(i, j, l, nw)
een_rescaled_e_deriv_e(i, 3, j, l, nw) = een_rescaled_e_deriv_e(i, 3, j, l, nw) * <span style="color: #a020f0;">&amp;</span>
een_rescaled_e(i, j, l, nw)
een_rescaled_e_deriv_e(i, 4, j, l, nw) = een_rescaled_e_deriv_e(i, 4, j, l, nw) * <span style="color: #a020f0;">&amp;</span>
een_rescaled_e(i, j, l, nw)
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_factor_een_rescaled_e_deriv_e_f</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org3b5718e" class="outline-4">
<h4 id="org3b5718e"><span class="section-number-4">3.7.3</span> Test</h4>
<div class="outline-text-4" id="text-3-7-3">
<div class="org-src-container">
<pre class="src src-c">//<span style="color: #b22222;">assert(qmckl_electron_provided(context));</span>
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">een_rescaled_e_deriv_e</span>[walk_num][(cord_num + 1)][elec_num][4][elec_num];
size_max=walk_num*(cord_num + 1)*elec_num*4*elec_num;
rc = qmckl_get_jastrow_een_rescaled_e_deriv_e(context,
&amp;(een_rescaled_e_deriv_e[0][0][0][0][0]),size_max);
// <span style="color: #b22222;">value of (0,0,0,2,1)</span>
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_e_deriv_e</span>[0][1][0][0][2] + 0.05991352796887283 ) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_e_deriv_e</span>[0][1][0][0][3] + 0.011714035071545248 ) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_e_deriv_e</span>[0][1][0][0][4] + 0.00441398875758468 ) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_e_deriv_e</span>[0][2][1][0][3] + 0.013553180060167595 ) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_e_deriv_e</span>[0][2][1][0][4] + 0.00041342909359870457) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_e_deriv_e</span>[0][2][1][0][5] + 0.5880599146214673 ) &lt; 1.e-12);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org8885217" class="outline-3">
<h3 id="org8885217"><span class="section-number-3">3.8</span> Electron-nucleus rescaled distances for each order</h3>
<div class="outline-text-3" id="text-3-8">
<p>
<code>een_rescaled_n</code> stores the table of the rescaled distances between
electrons and nucleii raised to the power \(p\) defined by <code>cord_num</code>:
</p>
<p>
\[
C_{ia,p} = \left( 1 - \exp{-\kappa C_{ia}} \right)^p
\]
</p>
<p>
where \(C_{ia}\) is the matrix of electron-nucleus distances.
</p>
</div>
<div id="outline-container-orgdd50a15" class="outline-4">
<h4 id="orgdd50a15"><span class="section-number-4">3.8.1</span> Get</h4>
<div class="outline-text-4" id="text-3-8-1">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
<span style="color: #0000ff;">qmckl_get_jastrow_een_rescaled_n</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">distance_rescaled</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-org0cab186" class="outline-4">
<h4 id="org0cab186"><span class="section-number-4">3.8.2</span> Compute</h4>
<div class="outline-text-4" id="text-3-8-2">
<table id="org2848589" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of atoms</td>
</tr>
<tr>
<td class="org-left"><code>cord_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Order of polynomials</td>
</tr>
<tr>
<td class="org-left"><code>rescale_factor_kappa_en</code></td>
<td class="org-left"><code>double</code></td>
<td class="org-left">in</td>
<td class="org-left">Factor to rescale ee distances</td>
</tr>
<tr>
<td class="org-left"><code>en_distance</code></td>
<td class="org-left"><code>double[walk_num][elec_num][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_n</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Electron-nucleus rescaled distances</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> function qmckl_compute_een_rescaled_n_f( </span><span style="color: #a020f0;">&amp;</span>
context, walk_num, elec_num, nucl_num, cord_num, rescale_factor_kappa_en, <span style="color: #a020f0;">&amp;</span>
en_distance, een_rescaled_n) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">result</span>(info)
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> walk_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> elec_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> nucl_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> cord_num</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> rescale_factor_kappa_en</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_distance(elec_num,nucl_num,walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> een_rescaled_n(elec_num,nucl_num,0:cord_num,walk_num)</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, k, l, nw</span>
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (cord_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_5
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
! <span style="color: #b22222;">Prepare table of exponentiated distances raised to appropriate power</span>
een_rescaled_n = 0.0d0
<span style="color: #a020f0;">do</span> nw = 1, walk_num
! <span style="color: #b22222;">prepare the actual een table</span>
een_rescaled_n(:, :, 0, nw) = 1.0d0
<span style="color: #a020f0;">do</span> a = 1, nucl_num
<span style="color: #a020f0;">do</span> i = 1, elec_num
een_rescaled_n(i, a, 1, nw) = dexp(-rescale_factor_kappa_en * en_distance(i, a, nw))
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">do</span> l = 2, cord_num
<span style="color: #a020f0;">do</span> a = 1, nucl_num
<span style="color: #a020f0;">do</span> i = 1, elec_num
een_rescaled_n(i, a, l, nw) = een_rescaled_n(i, a, l - 1, nw) * een_rescaled_n(i, a, 1, nw)
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_een_rescaled_n_f</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_een_rescaled_n</span> (
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">elec_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nucl_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">cord_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span> <span style="color: #a0522d;">rescale_factor_kappa_en</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">en_distance</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">een_rescaled_n</span> ) {
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_CONTEXT;
}
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_2;
}
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_3;
}
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_4;
}
<span style="color: #a020f0;">if</span> (cord_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_5;
}
// <span style="color: #b22222;">Prepare table of exponentiated distances raised to appropriate power</span>
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i &lt; (walk_num*(cord_num+1)*nucl_num*elec_num); ++i) {
een_rescaled_n[i] = 17.0;
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">nw</span> = 0; nw &lt; walk_num; ++nw) {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">a</span> = 0; a &lt; nucl_num; ++a) {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i &lt; elec_num; ++i) {
// <span style="color: #b22222;">prepare the actual een table</span>
//<span style="color: #b22222;">een_rescaled_n(:, :, 0, nw) = 1.0d0</span>
een_rescaled_n[i + a * elec_num + 0 + nw * elec_num*nucl_num*(cord_num+1)] = 1.0;
//<span style="color: #b22222;">een_rescaled_n(i, a, 1, nw) = dexp(-rescale_factor_kappa_en * en_distance(i, a, nw))</span>
een_rescaled_n[i + a*elec_num + elec_num*nucl_num + nw*elec_num*nucl_num*(cord_num+1)] = exp(-rescale_factor_kappa_en * \
en_distance[i + a*elec_num + nw*elec_num*nucl_num]);
}
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">l</span> = 2; l &lt; (cord_num+1); ++l){
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">a</span> = 0; a &lt; nucl_num; ++a) {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i &lt; elec_num; ++i) {
een_rescaled_n[i + a*elec_num + l*elec_num*nucl_num + nw*elec_num*nucl_num*(cord_num+1)] = een_rescaled_n[i + a*elec_num + (l-1)*elec_num*nucl_num + nw*elec_num*nucl_num*(cord_num+1)] *\
een_rescaled_n[i + a*elec_num + elec_num*nucl_num + nw*elec_num*nucl_num*(cord_num+1)];
}
}
}
}
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
}
</pre>
</div>
</div>
</div>
<div id="outline-container-org4080344" class="outline-4">
<h4 id="org4080344"><span class="section-number-4">3.8.3</span> Test</h4>
<div class="outline-text-4" id="text-3-8-3">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #0000ff;">assert</span>(<span style="color: #228b22;">qmckl_electron_provided</span>(<span style="color: #a0522d;">context</span>));
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">een_rescaled_n</span>[walk_num][(cord_num + 1)][nucl_num][elec_num];
size_max=walk_num*(cord_num + 1)*nucl_num*elec_num;
rc = qmckl_get_jastrow_een_rescaled_n(context, &amp;(een_rescaled_n[0][0][0][0]),size_max);
// <span style="color: #b22222;">value of (0,2,1)</span>
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_n</span>[0][1][0][2]-0.10612983920006765) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_n</span>[0][1][0][3]-0.135652809635553) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_n</span>[0][1][0][4]-0.023391817607642338) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_n</span>[0][2][1][3]-0.880957224822116) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_n</span>[0][2][1][4]-0.027185942659395074) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_n</span>[0][2][1][5]-0.01343938025140174) &lt; 1.e-12);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org9bce494" class="outline-3">
<h3 id="org9bce494"><span class="section-number-3">3.9</span> Electron-nucleus rescaled distances for each order and derivatives</h3>
<div class="outline-text-3" id="text-3-9">
<p>
<code>een_rescaled_n_deriv_e</code> stores the table of the rescaled distances between
electrons and nucleii raised to the power \(p\) defined by <code>cord_num</code>:
</p>
</div>
<div id="outline-container-orge8bbb78" class="outline-4">
<h4 id="orge8bbb78"><span class="section-number-4">3.9.1</span> Get</h4>
<div class="outline-text-4" id="text-3-9-1">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
<span style="color: #0000ff;">qmckl_get_jastrow_een_rescaled_n_deriv_e</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">distance_rescaled</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-org2d3f240" class="outline-4">
<h4 id="org2d3f240"><span class="section-number-4">3.9.2</span> Compute</h4>
<div class="outline-text-4" id="text-3-9-2">
<table id="org9231012" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of atoms</td>
</tr>
<tr>
<td class="org-left"><code>cord_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Order of polynomials</td>
</tr>
<tr>
<td class="org-left"><code>rescale_factor_kappa_en</code></td>
<td class="org-left"><code>double</code></td>
<td class="org-left">in</td>
<td class="org-left">Factor to rescale ee distances</td>
</tr>
<tr>
<td class="org-left"><code>coord_new</code></td>
<td class="org-left"><code>double[walk_num][3][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron coordinates</td>
</tr>
<tr>
<td class="org-left"><code>coord</code></td>
<td class="org-left"><code>double[3][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Nuclear coordinates</td>
</tr>
<tr>
<td class="org-left"><code>en_distance</code></td>
<td class="org-left"><code>double[walk_num][elec_num][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_n</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_n_deriv_e</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4][elec_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Electron-nucleus rescaled distances</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> function qmckl_compute_factor_een_rescaled_n_deriv_e_f( </span><span style="color: #a020f0;">&amp;</span>
context, walk_num, elec_num, nucl_num, <span style="color: #a020f0;">&amp;</span>
cord_num, rescale_factor_kappa_en, <span style="color: #a020f0;">&amp;</span>
coord_new, coord, en_distance, een_rescaled_n, een_rescaled_n_deriv_e) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">result</span>(info)
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> walk_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> elec_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> nucl_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> cord_num</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> rescale_factor_kappa_en</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coord_new(elec_num,3,walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coord(nucl_num,3)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_distance(elec_num,nucl_num,walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n(elec_num,nucl_num,0:cord_num,walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> een_rescaled_n_deriv_e(elec_num,4,nucl_num,0:cord_num,walk_num)</span>
<span style="color: #228b22;">double precision</span>,<span style="color: #a020f0;">dimension</span>(:,:,:),<span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> elnuc_dist_deriv_e</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, ria_inv, kappa_l</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, k, l, nw, ii</span>
<span style="color: #a020f0;">allocate</span>(elnuc_dist_deriv_e(4, elec_num, nucl_num))
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (cord_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_5
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
! <span style="color: #b22222;">Prepare table of exponentiated distances raised to appropriate power</span>
een_rescaled_n_deriv_e = 0.0d0
<span style="color: #a020f0;">do</span> nw = 1, walk_num
! <span style="color: #b22222;">prepare the actual een table</span>
<span style="color: #a020f0;">do</span> a = 1, nucl_num
<span style="color: #a020f0;">do</span> i = 1, elec_num
ria_inv = 1.0d0 / en_distance(i, a, nw)
<span style="color: #a020f0;">do</span> ii = 1, 3
elnuc_dist_deriv_e(ii, i, a) = (coord_new(i, ii, nw) - coord(a, ii)) * ria_inv
<span style="color: #a020f0;">end do</span>
elnuc_dist_deriv_e(4, i, a) = 2.0d0 * ria_inv
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">do</span> l = 0, cord_num
kappa_l = - <span style="color: #a020f0;">dble</span>(l) * rescale_factor_kappa_en
<span style="color: #a020f0;">do</span> a = 1, nucl_num
<span style="color: #a020f0;">do</span> i = 1, elec_num
een_rescaled_n_deriv_e(i, 1, a, l, nw) = kappa_l * elnuc_dist_deriv_e(1, i, a)
een_rescaled_n_deriv_e(i, 2, a, l, nw) = kappa_l * elnuc_dist_deriv_e(2, i, a)
een_rescaled_n_deriv_e(i, 3, a, l, nw) = kappa_l * elnuc_dist_deriv_e(3, i, a)
een_rescaled_n_deriv_e(i, 4, a, l, nw) = kappa_l * elnuc_dist_deriv_e(4, i, a)
een_rescaled_n_deriv_e(i, 4, a, l, nw) = een_rescaled_n_deriv_e(i, 4, a, l, nw) <span style="color: #a020f0;">&amp;</span>
+ een_rescaled_n_deriv_e(i, 1, a, l, nw) * een_rescaled_n_deriv_e(i, 1, a, l, nw) <span style="color: #a020f0;">&amp;</span>
+ een_rescaled_n_deriv_e(i, 2, a, l, nw) * een_rescaled_n_deriv_e(i, 2, a, l, nw) <span style="color: #a020f0;">&amp;</span>
+ een_rescaled_n_deriv_e(i, 3, a, l, nw) * een_rescaled_n_deriv_e(i, 3, a, l, nw)
een_rescaled_n_deriv_e(i, 1, a, l, nw) = een_rescaled_n_deriv_e(i, 1, a, l, nw) * <span style="color: #a020f0;">&amp;</span>
een_rescaled_n(i, a, l, nw)
een_rescaled_n_deriv_e(i, 2, a, l, nw) = een_rescaled_n_deriv_e(i, 2, a, l, nw) * <span style="color: #a020f0;">&amp;</span>
een_rescaled_n(i, a, l, nw)
een_rescaled_n_deriv_e(i, 3, a, l, nw) = een_rescaled_n_deriv_e(i, 3, a, l, nw) * <span style="color: #a020f0;">&amp;</span>
een_rescaled_n(i, a, l, nw)
een_rescaled_n_deriv_e(i, 4, a, l, nw) = een_rescaled_n_deriv_e(i, 4, a, l, nw) * <span style="color: #a020f0;">&amp;</span>
een_rescaled_n(i, a, l, nw)
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_factor_een_rescaled_n_deriv_e_f</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org4df5c8c" class="outline-4">
<h4 id="org4df5c8c"><span class="section-number-4">3.9.3</span> Test</h4>
<div class="outline-text-4" id="text-3-9-3">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #0000ff;">assert</span>(<span style="color: #228b22;">qmckl_electron_provided</span>(<span style="color: #a0522d;">context</span>));
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">een_rescaled_n_deriv_e</span>[walk_num][(cord_num + 1)][nucl_num][4][elec_num];
size_max=walk_num*(cord_num + 1)*nucl_num*4*elec_num;
rc = qmckl_get_jastrow_een_rescaled_n_deriv_e(context, &amp;(een_rescaled_n_deriv_e[0][0][0][0][0]),size_max);
// <span style="color: #b22222;">value of (0,2,1)</span>
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_n_deriv_e</span>[0][1][0][0][2]+0.07633444246999128 ) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_n_deriv_e</span>[0][1][0][0][3]-0.00033282346259738276) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_n_deriv_e</span>[0][1][0][0][4]+0.004775370547333061 ) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_n_deriv_e</span>[0][2][1][0][3]-0.1362654644223866 ) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_n_deriv_e</span>[0][2][1][0][4]+0.0231253431662794 ) &lt; 1.e-12);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">een_rescaled_n_deriv_e</span>[0][2][1][0][5]-0.001593334817691633 ) &lt; 1.e-12);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgf95f3ea" class="outline-3">
<h3 id="orgf95f3ea"><span class="section-number-3">3.10</span> Prepare for electron-electron-nucleus Jastrow \(f_{een}\)</h3>
<div class="outline-text-3" id="text-3-10">
<p>
Prepare <code>cord_vect_full</code> and <code>lkpm_combined_index</code> tables required for the
calculation of the three-body jastrow <code>factor_een</code> and its derivative
<code>factor_een_deriv_e</code>.
</p>
</div>
<div id="outline-container-orgd5455e6" class="outline-4">
<h4 id="orgd5455e6"><span class="section-number-4">3.10.1</span> Get</h4>
<div class="outline-text-4" id="text-3-10-1">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_get_jastrow_dim_cord_vect</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>, <span style="color: #228b22;">int64_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">dim_cord_vect</span>);
<span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_get_jastrow_cord_vect_full</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>, <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">cord_vect_full</span>);
<span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_get_jastrow_lkpm_combined_index</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>, <span style="color: #228b22;">int64_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">lkpm_combined_index</span>);
<span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_get_jastrow_tmp_c</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>, <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">tmp_c</span>);
<span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_get_jastrow_dtmp_c</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>, <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">dtmp_c</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-org913940f" class="outline-4">
<h4 id="org913940f"><span class="section-number-4">3.10.2</span> Compute dim<sub>cord</sub><sub>vect</sub></h4>
<div class="outline-text-4" id="text-3-10-2">
<table id="org2ad8827" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>cord_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Order of polynomials</td>
</tr>
<tr>
<td class="org-left"><code>dim_cord_vect</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">out</td>
<td class="org-left">dimension of cord<sub>vect</sub><sub>full</sub> table</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> function qmckl_compute_dim_cord_vect_f( </span><span style="color: #a020f0;">&amp;</span>
context, cord_num, dim_cord_vect) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">result</span>(info)
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> cord_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> dim_cord_vect</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, k, l, p, lmax</span>
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (cord_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
dim_cord_vect = 0
<span style="color: #a020f0;">do</span> p = 2, cord_num
<span style="color: #a020f0;">do</span> k = p - 1, 0, -1
<span style="color: #a020f0;">if</span> (k <span style="color: #a020f0;">.ne.</span> 0) <span style="color: #a020f0;">then</span>
lmax = p - k
<span style="color: #a020f0;">else</span>
lmax = p - k - 2
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">do</span> l = lmax, 0, -1
<span style="color: #a020f0;">if</span> (<span style="color: #a020f0;">iand</span>(p - k - l, 1_8) == 1) <span style="color: #a020f0;">cycle</span>
dim_cord_vect = dim_cord_vect + 1
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_dim_cord_vect_f</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_dim_cord_vect</span> (
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">cord_num</span>,
<span style="color: #228b22;">int64_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">dim_cord_vect</span>){
<span style="color: #228b22;">int</span> <span style="color: #a0522d;">lmax</span>;
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_CONTEXT;
}
<span style="color: #a020f0;">if</span> (cord_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_2;
}
*dim_cord_vect = 0;
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">p</span>=2; p &lt;= cord_num; ++p){
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">k</span>=p-1; k &gt;= 0; --k) {
<span style="color: #a020f0;">if</span> (k != 0) {
lmax = p - k;
} <span style="color: #a020f0;">else</span> {
lmax = p - k - 2;
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">l</span> = lmax; l &gt;= 0; --l) {
<span style="color: #a020f0;">if</span> ( ((p - k - l) &amp; 1)==1) <span style="color: #a020f0;">continue</span>;
*dim_cord_vect=*dim_cord_vect+1;
}
}
}
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
}
</pre>
</div>
</div>
</div>
<div id="outline-container-orgb99d441" class="outline-4">
<h4 id="orgb99d441"><span class="section-number-4">3.10.3</span> Compute cord<sub>vect</sub><sub>full</sub></h4>
<div class="outline-text-4" id="text-3-10-3">
<table id="org617e8e3" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of atoms</td>
</tr>
<tr>
<td class="org-left"><code>dim_cord_vect</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">dimension of cord full table</td>
</tr>
<tr>
<td class="org-left"><code>type_nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">dimension of cord full table</td>
</tr>
<tr>
<td class="org-left"><code>type_nucl_vector</code></td>
<td class="org-left"><code>int64_t[nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">dimension of cord full table</td>
</tr>
<tr>
<td class="org-left"><code>cord_vector</code></td>
<td class="org-left"><code>double[dim_cord_vect][type_nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">dimension of cord full table</td>
</tr>
<tr>
<td class="org-left"><code>cord_vect_full</code></td>
<td class="org-left"><code>double[dim_cord_vect][nucl_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Full list of coefficients</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> function qmckl_compute_cord_vect_full_doc_f( </span><span style="color: #a020f0;">&amp;</span>
context, nucl_num, dim_cord_vect, type_nucl_num, <span style="color: #a020f0;">&amp;</span>
type_nucl_vector, cord_vector, cord_vect_full) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">result</span>(info)
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> nucl_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> dim_cord_vect</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> type_nucl_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> type_nucl_vector(nucl_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> cord_vector(type_nucl_num, dim_cord_vect)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> cord_vect_full(nucl_num,dim_cord_vect)</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, k, l, nw</span>
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (type_nucl_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (dim_cord_vect &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_5
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">do</span> a = 1, nucl_num
cord_vect_full(a,1:dim_cord_vect) = cord_vector(type_nucl_vector(a),1:dim_cord_vect)
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_cord_vect_full_doc_f</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_cord_vect_full_hpc</span> (
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nucl_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">dim_cord_vect</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">type_nucl_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">type_nucl_vector</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">cord_vector</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">cord_vect_full</span> ) {
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_CONTEXT;
}
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_2;
}
<span style="color: #a020f0;">if</span> (type_nucl_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_4;
}
<span style="color: #a020f0;">if</span> (dim_cord_vect &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_5;
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span>=0; i &lt; dim_cord_vect; ++i) {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">a</span>=0; a &lt; nucl_num; ++a){
cord_vect_full[a + i*nucl_num] = cord_vector[(type_nucl_vector[a]-1)+i*type_nucl_num];
}
}
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_cord_vect_full_doc</span> (
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nucl_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">dim_cord_vect</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">type_nucl_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">type_nucl_vector</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">cord_vector</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">cord_vect_full</span> );
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_cord_vect_full_hpc</span> (
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nucl_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">dim_cord_vect</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">type_nucl_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">type_nucl_vector</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">cord_vector</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">cord_vect_full</span> );
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_cord_vect_full</span> (
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nucl_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">dim_cord_vect</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">type_nucl_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">type_nucl_vector</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">cord_vector</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">cord_vect_full</span> ) {
<span style="color: #483d8b;"> #ifdef</span> HAVE_HPC
<span style="color: #a020f0;">return</span> qmckl_compute_cord_vect_full_hpc(context, nucl_num, dim_cord_vect, type_nucl_num, type_nucl_vector, cord_vector, cord_vect_full);
<span style="color: #483d8b;"> #else</span>
<span style="color: #a020f0;">return</span> qmckl_compute_cord_vect_full_doc(context, nucl_num, dim_cord_vect, type_nucl_num, type_nucl_vector, cord_vector, cord_vect_full);
<span style="color: #483d8b;"> #endif</span>
}
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf325ac8" class="outline-4">
<h4 id="orgf325ac8"><span class="section-number-4">3.10.4</span> Compute lkpm<sub>combined</sub><sub>index</sub></h4>
<div class="outline-text-4" id="text-3-10-4">
<table id="org7f22234" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>cord_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Order of polynomials</td>
</tr>
<tr>
<td class="org-left"><code>dim_cord_vect</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">dimension of cord full table</td>
</tr>
<tr>
<td class="org-left"><code>lkpm_combined_index</code></td>
<td class="org-left"><code>int64_t[4][dim_cord_vect]</code></td>
<td class="org-left">out</td>
<td class="org-left">Full list of combined indices</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> function qmckl_compute_lkpm_combined_index_f( </span><span style="color: #a020f0;">&amp;</span>
context, cord_num, dim_cord_vect, lkpm_combined_index) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">result</span>(info)
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> cord_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> dim_cord_vect</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> lkpm_combined_index(dim_cord_vect, 4)</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, k, l, kk, p, lmax, m</span>
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (cord_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (dim_cord_vect &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
kk = 0
<span style="color: #a020f0;">do</span> p = 2, cord_num
<span style="color: #a020f0;">do</span> k = p - 1, 0, -1
<span style="color: #a020f0;">if</span> (k <span style="color: #a020f0;">.ne.</span> 0) <span style="color: #a020f0;">then</span>
lmax = p - k
<span style="color: #a020f0;">else</span>
lmax = p - k - 2
<span style="color: #a020f0;">end if</span>
<span style="color: #a020f0;">do</span> l = lmax, 0, -1
<span style="color: #a020f0;">if</span> (<span style="color: #a020f0;">iand</span>(p - k - l, 1_8) <span style="color: #a020f0;">.eq.</span> 1) <span style="color: #a020f0;">cycle</span>
m = (p - k - l)/2
kk = kk + 1
lkpm_combined_index(kk, 1) = l
lkpm_combined_index(kk, 2) = k
lkpm_combined_index(kk, 3) = p
lkpm_combined_index(kk, 4) = m
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_lkpm_combined_index_f</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_lkpm_combined_index</span> (
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">cord_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">dim_cord_vect</span>,
<span style="color: #228b22;">int64_t</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">lkpm_combined_index</span> ) {
<span style="color: #228b22;">int</span> <span style="color: #a0522d;">kk</span>, <span style="color: #a0522d;">lmax</span>, <span style="color: #a0522d;">m</span>;
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_CONTEXT;
}
<span style="color: #a020f0;">if</span> (cord_num &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_2;
}
<span style="color: #a020f0;">if</span> (dim_cord_vect &lt;= 0) {
<span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_3;
}
/*
*/
kk = 0;
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">p</span> = 2; p &lt;= cord_num; ++p) {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">k</span>=(p-1); k &gt;= 0; --k) {
<span style="color: #a020f0;">if</span> (k != 0) {
lmax = p - k;
} <span style="color: #a020f0;">else</span> {
lmax = p - k - 2;
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">l</span>=lmax; l &gt;= 0; --l) {
<span style="color: #a020f0;">if</span> (((p - k - l) &amp; 1) == 1) <span style="color: #a020f0;">continue</span>;
m = (p - k - l)/2;
lkpm_combined_index[kk ] = l;
lkpm_combined_index[kk + dim_cord_vect] = k;
lkpm_combined_index[kk + 2*dim_cord_vect] = p;
lkpm_combined_index[kk + 3*dim_cord_vect] = m;
kk = kk + 1;
}
}
}
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
}
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf3f6189" class="outline-4">
<h4 id="orgf3f6189"><span class="section-number-4">3.10.5</span> Compute tmp<sub>c</sub></h4>
<div class="outline-text-4" id="text-3-10-5">
<table id="orgef8a9c3" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>cord_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Order of polynomials</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of nucleii</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_e</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-electron rescaled factor</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_n</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus rescaled factor</td>
</tr>
<tr>
<td class="org-left"><code>tmp_c</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][elec_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">vector of non-zero coefficients</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_tmp_c</span> (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">cord_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">elec_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nucl_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_e</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_n</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">tmp_c</span> )
{
<span style="color: #483d8b;">#ifdef</span> HAVE_HPC
<span style="color: #a020f0;">return</span> qmckl_compute_tmp_c_hpc(context, cord_num, elec_num, nucl_num, walk_num, een_rescaled_e, een_rescaled_n, tmp_c);
<span style="color: #483d8b;">#else</span>
<span style="color: #a020f0;">return</span> qmckl_compute_tmp_c_doc(context, cord_num, elec_num, nucl_num, walk_num, een_rescaled_e, een_rescaled_n, tmp_c);
<span style="color: #483d8b;">#endif</span>
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> function qmckl_compute_tmp_c_doc_f( </span><span style="color: #a020f0;">&amp;</span>
context, cord_num, elec_num, nucl_num, <span style="color: #a020f0;">&amp;</span>
walk_num, een_rescaled_e, een_rescaled_n, tmp_c) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">result</span>(info)
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> cord_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> elec_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> nucl_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> walk_num</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_e(elec_num, elec_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n(elec_num, nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> tmp_c(elec_num, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, j, a, l, kk, p, lmax, nw</span>
<span style="color: #228b22;">character</span> ::<span style="color: #a0522d;"> TransA, TransB</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> alpha, beta</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> M, N, K, LDA, LDB, LDC</span>
TransA = <span style="color: #8b2252;">'N'</span>
TransB = <span style="color: #8b2252;">'N'</span>
alpha = 1.0d0
beta = 0.0d0
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (cord_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
M = elec_num
N = nucl_num*(cord_num + 1)
K = elec_num
LDA = <span style="color: #a020f0;">size</span>(een_rescaled_e,1)
LDB = <span style="color: #a020f0;">size</span>(een_rescaled_n,1)
LDC = <span style="color: #a020f0;">size</span>(tmp_c,1)
<span style="color: #a020f0;">do</span> nw=1, walk_num
<span style="color: #a020f0;">do</span> i=0, cord_num-1
info = qmckl_dgemm(context, TransA, TransB, M, N, K, alpha, <span style="color: #a020f0;">&amp;</span>
een_rescaled_e(1,1,i,nw),LDA*1_8, <span style="color: #a020f0;">&amp;</span>
een_rescaled_n(1,1,0,nw),LDB*1_8, <span style="color: #a020f0;">&amp;</span>
beta, <span style="color: #a020f0;">&amp;</span>
tmp_c(1,1,0,i,nw),LDC)
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_tmp_c_doc_f</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_tmp_c_doc</span> (
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">cord_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">elec_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nucl_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_e</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_n</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">tmp_c</span> );
</pre>
</div>
</div>
</div>
<div id="outline-container-orgc02a9c1" class="outline-4">
<h4 id="orgc02a9c1"><span class="section-number-4">3.10.6</span> Compute dtmp<sub>c</sub></h4>
<div class="outline-text-4" id="text-3-10-6">
<table id="org27169ed" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>cord_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Order of polynomials</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of nucleii</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_e_deriv_e</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num][4][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-electron rescaled factor derivatives</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_n</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus rescaled factor</td>
</tr>
<tr>
<td class="org-left"><code>dtmp_c</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][elec_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">vector of non-zero coefficients</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
<span style="color: #0000ff;">qmckl_compute_dtmp_c</span> (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">cord_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">elec_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nucl_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_e_deriv_e</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_n</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">dtmp_c</span> )
{
<span style="color: #483d8b;">#ifdef</span> HAVE_HPC
<span style="color: #a020f0;">return</span> qmckl_compute_dtmp_c_hpc (context, cord_num, elec_num, nucl_num, walk_num, een_rescaled_e_deriv_e,
een_rescaled_n, dtmp_c );
<span style="color: #483d8b;">#else</span>
<span style="color: #a020f0;">return</span> qmckl_compute_dtmp_c_doc (context, cord_num, elec_num, nucl_num, walk_num, een_rescaled_e_deriv_e,
een_rescaled_n, dtmp_c );
<span style="color: #483d8b;">#endif</span>
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> function qmckl_compute_dtmp_c_doc_f( </span><span style="color: #a020f0;">&amp;</span>
context, cord_num, elec_num, nucl_num, <span style="color: #a020f0;">&amp;</span>
walk_num, een_rescaled_e_deriv_e, een_rescaled_n, dtmp_c) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">result</span>(info)
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> cord_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> elec_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> nucl_num</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> walk_num</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_e_deriv_e(elec_num, 4, elec_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n(elec_num, nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> dtmp_c(elec_num, 4, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, j, a, l, kk, p, lmax, nw, ii</span>
<span style="color: #228b22;">character</span> ::<span style="color: #a0522d;"> TransA, TransB</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> alpha, beta</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> M, N, K, LDA, LDB, LDC</span>
TransA = <span style="color: #8b2252;">'N'</span>
TransB = <span style="color: #8b2252;">'N'</span>
alpha = 1.0d0
beta = 0.0d0
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (cord_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
M = 4*elec_num
N = nucl_num*(cord_num + 1)
K = elec_num
LDA = 4*<span style="color: #a020f0;">size</span>(een_rescaled_e_deriv_e,1)
LDB = <span style="color: #a020f0;">size</span>(een_rescaled_n,1)
LDC = 4*<span style="color: #a020f0;">size</span>(dtmp_c,1)
<span style="color: #a020f0;">do</span> nw=1, walk_num
<span style="color: #a020f0;">do</span> i=0, cord_num-1
info = qmckl_dgemm(context,TransA, TransB, M, N, K, alpha, <span style="color: #a020f0;">&amp;</span>
een_rescaled_e_deriv_e(1,1,1,i,nw),LDA*1_8, <span style="color: #a020f0;">&amp;</span>
een_rescaled_n(1,1,0,nw),LDB*1_8, <span style="color: #a020f0;">&amp;</span>
beta, <span style="color: #a020f0;">&amp;</span>
dtmp_c(1,1,1,0,i,nw),LDC)
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_dtmp_c_doc_f</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org3e7d87e" class="outline-4">
<h4 id="org3e7d87e"><span class="section-number-4">3.10.7</span> Test</h4>
<div class="outline-text-4" id="text-3-10-7">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #0000ff;">assert</span>(<span style="color: #228b22;">qmckl_electron_provided</span>(<span style="color: #a0522d;">context</span>));
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">tmp_c</span>[walk_num][cord_num][cord_num+1][nucl_num][elec_num];
rc = qmckl_get_jastrow_tmp_c(context, &amp;(tmp_c[0][0][0][0][0]));
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">dtmp_c</span>[walk_num][cord_num][cord_num+1][nucl_num][4][elec_num];
rc = qmckl_get_jastrow_dtmp_c(context, &amp;(dtmp_c[0][0][0][0][0][0]));
printf(<span style="color: #8b2252;">"%e\n%e\n"</span>, tmp_c[0][0][1][0][0], 2.7083473948352403);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">tmp_c</span>[0][0][1][0][0] - 2.7083473948352403) &lt; 1e-12);
printf(<span style="color: #8b2252;">"%e\n%e\n"</span>, tmp_c[0][1][0][0][0],0.237440520852232);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">dtmp_c</span>[0][1][0][0][0][0] - 0.237440520852232) &lt; 1e-12);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org5c0a41b" class="outline-3">
<h3 id="org5c0a41b"><span class="section-number-3">3.11</span> Electron-electron-nucleus Jastrow \(f_{een}\)</h3>
<div class="outline-text-3" id="text-3-11">
<p>
Calculate the electron-electron-nuclear three-body jastrow component <code>factor_een</code>
using the above prepared tables.
</p>
<p>
TODO: write equations.
</p>
</div>
<div id="outline-container-org1718542" class="outline-4">
<h4 id="org1718542"><span class="section-number-4">3.11.1</span> Get</h4>
<div class="outline-text-4" id="text-3-11-1">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
<span style="color: #0000ff;">qmckl_get_jastrow_factor_een</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">factor_een</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgddcaf8e" class="outline-4">
<h4 id="orgddcaf8e"><span class="section-number-4">3.11.2</span> Compute naive</h4>
<div class="outline-text-4" id="text-3-11-2">
<table id="org42d61a7" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of nucleii</td>
</tr>
<tr>
<td class="org-left"><code>cord_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">order of polynomials</td>
</tr>
<tr>
<td class="org-left"><code>dim_cord_vect</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">dimension of full coefficient vector</td>
</tr>
<tr>
<td class="org-left"><code>cord_vect_full</code></td>
<td class="org-left"><code>double[dim_cord_vect][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">full coefficient vector</td>
</tr>
<tr>
<td class="org-left"><code>lkpm_combined_index</code></td>
<td class="org-left"><code>int64_t[4][dim_cord_vect]</code></td>
<td class="org-left">in</td>
<td class="org-left">combined indices</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_e</code></td>
<td class="org-left"><code>double[walk_num][elec_num][elec_num][0:cord_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus rescaled</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_n</code></td>
<td class="org-left"><code>double[walk_num][elec_num][nucl_num][0:cord_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus rescaled factor</td>
</tr>
<tr>
<td class="org-left"><code>factor_een</code></td>
<td class="org-left"><code>double[walk_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Electron-nucleus jastrow</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> function qmckl_compute_factor_een_naive_f( </span><span style="color: #a020f0;">&amp;</span>
context, walk_num, elec_num, nucl_num, cord_num,<span style="color: #a020f0;">&amp;</span>
dim_cord_vect, cord_vect_full, lkpm_combined_index, <span style="color: #a020f0;">&amp;</span>
een_rescaled_e, een_rescaled_n, factor_een) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">result</span>(info)
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> walk_num, elec_num, cord_num, nucl_num, dim_cord_vect</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> lkpm_combined_index(dim_cord_vect,4)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> cord_vect_full(nucl_num, dim_cord_vect)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_e(0:cord_num, elec_num, elec_num, walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n(0:cord_num, nucl_num, elec_num, walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> factor_een(walk_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, p, m, n, nw</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> accu, accu2, cn</span>
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (cord_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_5
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
factor_een = 0.0d0
<span style="color: #a020f0;">do</span> nw =1, walk_num
<span style="color: #a020f0;">do</span> n = 1, dim_cord_vect
l = lkpm_combined_index(n, 1)
k = lkpm_combined_index(n, 2)
p = lkpm_combined_index(n, 3)
m = lkpm_combined_index(n, 4)
<span style="color: #a020f0;">do</span> a = 1, nucl_num
accu2 = 0.0d0
cn = cord_vect_full(a, n)
<span style="color: #a020f0;">do</span> j = 1, elec_num
accu = 0.0d0
<span style="color: #a020f0;">do</span> i = 1, elec_num
accu = accu + een_rescaled_e(k,i,j,nw) * <span style="color: #a020f0;">&amp;</span>
een_rescaled_n(m,a,i,nw)
!<span style="color: #b22222;">if(nw .eq. 1) then</span>
! <span style="color: #b22222;">print *,l,k,p,m,j,i,een_rescaled_e(k,i,j,nw), een_rescaled_n(m,a,i,nw), accu</span>
!<span style="color: #b22222;">endif</span>
<span style="color: #a020f0;">end do</span>
accu2 = accu2 + accu * een_rescaled_n(m + l,a,j,nw)
!<span style="color: #b22222;">print *, l,m,nw,accu, accu2, een_rescaled_n(m + l, a, j, nw), cn, factor_een(nw)</span>
<span style="color: #a020f0;">end do</span>
factor_een(nw) = factor_een(nw) + accu2 * cn
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_factor_een_naive_f</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org2bb5c01" class="outline-4">
<h4 id="org2bb5c01"><span class="section-number-4">3.11.3</span> Compute</h4>
<div class="outline-text-4" id="text-3-11-3">
<table id="orgb7c1581" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of nucleii</td>
</tr>
<tr>
<td class="org-left"><code>cord_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">order of polynomials</td>
</tr>
<tr>
<td class="org-left"><code>dim_cord_vect</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">dimension of full coefficient vector</td>
</tr>
<tr>
<td class="org-left"><code>cord_vect_full</code></td>
<td class="org-left"><code>double[dim_cord_vect][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">full coefficient vector</td>
</tr>
<tr>
<td class="org-left"><code>lkpm_combined_index</code></td>
<td class="org-left"><code>int64_t[4][dim_cord_vect]</code></td>
<td class="org-left">in</td>
<td class="org-left">combined indices</td>
</tr>
<tr>
<td class="org-left"><code>tmp_c</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][elec_num]</code></td>
<td class="org-left">vector of non-zero coefficients</td>
<td class="org-left">&#xa0;</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_n</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus rescaled factor</td>
</tr>
<tr>
<td class="org-left"><code>factor_een</code></td>
<td class="org-left"><code>double[walk_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Electron-nucleus jastrow</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> function qmckl_compute_factor_een_f( </span><span style="color: #a020f0;">&amp;</span>
context, walk_num, elec_num, nucl_num, cord_num, <span style="color: #a020f0;">&amp;</span>
dim_cord_vect, cord_vect_full, lkpm_combined_index, <span style="color: #a020f0;">&amp;</span>
tmp_c, een_rescaled_n, factor_een) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">result</span>(info)
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> walk_num, elec_num, cord_num, nucl_num, dim_cord_vect</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> lkpm_combined_index(dim_cord_vect,4)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> cord_vect_full(nucl_num, dim_cord_vect)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> tmp_c(elec_num, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n(elec_num, nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> factor_een(walk_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, p, m, n, nw</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> accu, accu2, cn</span>
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (cord_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_5
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
factor_een = 0.0d0
<span style="color: #a020f0;">do</span> nw =1, walk_num
<span style="color: #a020f0;">do</span> n = 1, dim_cord_vect
l = lkpm_combined_index(n, 1)
k = lkpm_combined_index(n, 2)
p = lkpm_combined_index(n, 3)
m = lkpm_combined_index(n, 4)
<span style="color: #a020f0;">do</span> a = 1, nucl_num
cn = cord_vect_full(a, n)
<span style="color: #a020f0;">if</span>(cn == 0.d0) <span style="color: #a020f0;">cycle</span>
accu = 0.0d0
<span style="color: #a020f0;">do</span> j = 1, elec_num
accu = accu + een_rescaled_n(j,a,m,nw) * tmp_c(j,a,m+l,k,nw)
<span style="color: #a020f0;">end do</span>
factor_een(nw) = factor_een(nw) + accu * cn
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_factor_een_f</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org8d2df7e" class="outline-4">
<h4 id="org8d2df7e"><span class="section-number-4">3.11.4</span> Test</h4>
<div class="outline-text-4" id="text-3-11-4">
<div class="org-src-container">
<pre class="src src-c">/* <span style="color: #b22222;">Check if Jastrow is properly initialized </span>*/
<span style="color: #0000ff;">assert</span>(<span style="color: #228b22;">qmckl_jastrow_provided</span>(<span style="color: #a0522d;">context</span>));
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">factor_een</span>[walk_num];
rc = qmckl_get_jastrow_factor_een(context, &amp;(factor_een[0]),walk_num);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">factor_een</span>[0] + 0.37407972141304213) &lt; 1e-12);
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org4dbc6db" class="outline-3">
<h3 id="org4dbc6db"><span class="section-number-3">3.12</span> Electron-electron-nucleus Jastrow \(f_{een}\) derivative</h3>
<div class="outline-text-3" id="text-3-12">
<p>
Calculate the electron-electron-nuclear three-body jastrow component <code>factor_een_deriv_e</code>
using the above prepared tables.
</p>
<p>
TODO: write equations.
</p>
</div>
<div id="outline-container-org730e338" class="outline-4">
<h4 id="org730e338"><span class="section-number-4">3.12.1</span> Get</h4>
<div class="outline-text-4" id="text-3-12-1">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
<span style="color: #0000ff;">qmckl_get_jastrow_factor_een_deriv_e</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">factor_een_deriv_e</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-org8a0655b" class="outline-4">
<h4 id="org8a0655b"><span class="section-number-4">3.12.2</span> Compute Naive</h4>
<div class="outline-text-4" id="text-3-12-2">
<table id="org912eb45" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of nucleii</td>
</tr>
<tr>
<td class="org-left"><code>cord_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">order of polynomials</td>
</tr>
<tr>
<td class="org-left"><code>dim_cord_vect</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">dimension of full coefficient vector</td>
</tr>
<tr>
<td class="org-left"><code>cord_vect_full</code></td>
<td class="org-left"><code>double[dim_cord_vect][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">full coefficient vector</td>
</tr>
<tr>
<td class="org-left"><code>lkpm_combined_index</code></td>
<td class="org-left"><code>int64_t[4][dim_cord_vect]</code></td>
<td class="org-left">in</td>
<td class="org-left">combined indices</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_e</code></td>
<td class="org-left"><code>double[walk_num][elec_num][elec_num][0:cord_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus rescaled</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_n</code></td>
<td class="org-left"><code>double[walk_num][elec_num][nucl_num][0:cord_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus rescaled factor</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_e_deriv_e</code></td>
<td class="org-left"><code>double[walk_num][elec_num][4][elec_num][0:cord_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus rescaled</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_n_deriv_e</code></td>
<td class="org-left"><code>double[walk_num][elec_num][4][nucl_num][0:cord_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus rescaled factor</td>
</tr>
<tr>
<td class="org-left"><code>factor_een_deriv_e</code></td>
<td class="org-left"><code>double[walk_num][4][elec_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Electron-nucleus jastrow</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> function qmckl_compute_factor_een_deriv_e_naive_f( </span><span style="color: #a020f0;">&amp;</span>
context, walk_num, elec_num, nucl_num, cord_num, dim_cord_vect, <span style="color: #a020f0;">&amp;</span>
cord_vect_full, lkpm_combined_index, een_rescaled_e, een_rescaled_n, <span style="color: #a020f0;">&amp;</span>
een_rescaled_e_deriv_e, een_rescaled_n_deriv_e, factor_een_deriv_e)<span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">result</span>(info)
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> walk_num, elec_num, cord_num, nucl_num, dim_cord_vect</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> lkpm_combined_index(dim_cord_vect, 4)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> cord_vect_full(nucl_num, dim_cord_vect)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_e(0:cord_num, elec_num, elec_num, walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n(0:cord_num, nucl_num, elec_num, walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_e_deriv_e(0:cord_num, elec_num, 4, elec_num, walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n_deriv_e(0:cord_num, nucl_num, 4, elec_num, walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> factor_een_deriv_e(elec_num, 4, walk_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, p, m, n, nw</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> accu, accu2, cn</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> daccu(1:4), daccu2(1:4)</span>
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (cord_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_5
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
factor_een_deriv_e = 0.0d0
<span style="color: #a020f0;">do</span> nw =1, walk_num
<span style="color: #a020f0;">do</span> n = 1, dim_cord_vect
l = lkpm_combined_index(n, 1)
k = lkpm_combined_index(n, 2)
p = lkpm_combined_index(n, 3)
m = lkpm_combined_index(n, 4)
<span style="color: #a020f0;">do</span> a = 1, nucl_num
cn = cord_vect_full(a, n)
<span style="color: #a020f0;">do</span> j = 1, elec_num
accu = 0.0d0
accu2 = 0.0d0
daccu = 0.0d0
daccu2 = 0.0d0
<span style="color: #a020f0;">do</span> i = 1, elec_num
accu = accu + een_rescaled_e(k, i, j, nw) * <span style="color: #a020f0;">&amp;</span>
een_rescaled_n(m, a, i, nw)
accu2 = accu2 + een_rescaled_e(k, i, j, nw) * <span style="color: #a020f0;">&amp;</span>
een_rescaled_n(m + l, a, i, nw)
daccu(1:4) = daccu(1:4) + een_rescaled_e_deriv_e(k, j, 1:4, i, nw) * <span style="color: #a020f0;">&amp;</span>
een_rescaled_n(m, a, i, nw)
daccu2(1:4) = daccu2(1:4) + een_rescaled_e_deriv_e(k, j, 1:4, i, nw) * <span style="color: #a020f0;">&amp;</span>
een_rescaled_n(m + l, a, i, nw)
<span style="color: #a020f0;">end do</span>
factor_een_deriv_e(j, 1:4, nw) = factor_een_deriv_e(j, 1:4, nw) + <span style="color: #a020f0;">&amp;</span>
(accu * een_rescaled_n_deriv_e(m + l, a, 1:4, j, nw) <span style="color: #a020f0;">&amp;</span>
+ daccu(1:4) * een_rescaled_n(m + l, a, j, nw) <span style="color: #a020f0;">&amp;</span>
+ daccu2(1:4) * een_rescaled_n(m, a, j, nw) <span style="color: #a020f0;">&amp;</span>
+ accu2 * een_rescaled_n_deriv_e(m, a, 1:4, j, nw)) * cn
factor_een_deriv_e(j, 4, nw) = factor_een_deriv_e(j, 4, nw) + 2.0d0 * ( <span style="color: #a020f0;">&amp;</span>
daccu (1) * een_rescaled_n_deriv_e(m + l, a, 1, j, nw) + <span style="color: #a020f0;">&amp;</span>
daccu (2) * een_rescaled_n_deriv_e(m + l, a, 2, j, nw) + <span style="color: #a020f0;">&amp;</span>
daccu (3) * een_rescaled_n_deriv_e(m + l, a, 3, j, nw) + <span style="color: #a020f0;">&amp;</span>
daccu2(1) * een_rescaled_n_deriv_e(m, a, 1, j, nw ) + <span style="color: #a020f0;">&amp;</span>
daccu2(2) * een_rescaled_n_deriv_e(m, a, 2, j, nw ) + <span style="color: #a020f0;">&amp;</span>
daccu2(3) * een_rescaled_n_deriv_e(m, a, 3, j, nw ) ) * cn
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_factor_een_deriv_e_naive_f</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org27f1516" class="outline-4">
<h4 id="org27f1516"><span class="section-number-4">3.12.3</span> Compute</h4>
<div class="outline-text-4" id="text-3-12-3">
<table id="org4cae147" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of nucleii</td>
</tr>
<tr>
<td class="org-left"><code>cord_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">order of polynomials</td>
</tr>
<tr>
<td class="org-left"><code>dim_cord_vect</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">dimension of full coefficient vector</td>
</tr>
<tr>
<td class="org-left"><code>cord_vect_full</code></td>
<td class="org-left"><code>double[dim_cord_vect][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">full coefficient vector</td>
</tr>
<tr>
<td class="org-left"><code>lkpm_combined_index</code></td>
<td class="org-left"><code>int64_t[4][dim_cord_vect]</code></td>
<td class="org-left">in</td>
<td class="org-left">combined indices</td>
</tr>
<tr>
<td class="org-left"><code>tmp_c</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Temporary intermediate tensor</td>
</tr>
<tr>
<td class="org-left"><code>dtmp_c</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][4][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">vector of non-zero coefficients</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_n</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus rescaled factor</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_n_deriv_e</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Derivative of Electron-nucleus rescaled factor</td>
</tr>
<tr>
<td class="org-left"><code>factor_een_deriv_e</code></td>
<td class="org-left"><code>double[walk_num][4][elec_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Derivative of Electron-nucleus jastrow</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> function qmckl_compute_factor_een_deriv_e_f( </span><span style="color: #a020f0;">&amp;</span>
context, walk_num, elec_num, nucl_num, <span style="color: #a020f0;">&amp;</span>
cord_num, dim_cord_vect, cord_vect_full, lkpm_combined_index, <span style="color: #a020f0;">&amp;</span>
tmp_c, dtmp_c, een_rescaled_n, een_rescaled_n_deriv_e, factor_een_deriv_e)<span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">result</span>(info)
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> walk_num, elec_num, cord_num, nucl_num, dim_cord_vect</span>
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> lkpm_combined_index(dim_cord_vect,4)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> cord_vect_full(nucl_num, dim_cord_vect)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> tmp_c(elec_num, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> dtmp_c(elec_num, 4, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n(elec_num, nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n_deriv_e(elec_num, 4, nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> factor_een_deriv_e(elec_num,4,walk_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, p, m, n, nw, ii</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> accu, accu2, cn</span>
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (cord_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_5
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
factor_een_deriv_e = 0.0d0
<span style="color: #a020f0;">do</span> nw =1, walk_num
<span style="color: #a020f0;">do</span> n = 1, dim_cord_vect
l = lkpm_combined_index(n, 1)
k = lkpm_combined_index(n, 2)
p = lkpm_combined_index(n, 3)
m = lkpm_combined_index(n, 4)
<span style="color: #a020f0;">do</span> a = 1, nucl_num
cn = cord_vect_full(a, n)
<span style="color: #a020f0;">if</span>(cn == 0.d0) <span style="color: #a020f0;">cycle</span>
<span style="color: #a020f0;">do</span> ii = 1, 4
<span style="color: #a020f0;">do</span> j = 1, elec_num
factor_een_deriv_e(j,ii,nw) = factor_een_deriv_e(j,ii,nw) + (<span style="color: #a020f0;">&amp;</span>
tmp_c(j,a,m,k,nw) * een_rescaled_n_deriv_e(j,ii,a,m+l,nw) + <span style="color: #a020f0;">&amp;</span>
(dtmp_c(j,ii,a,m,k,nw)) * een_rescaled_n(j,a,m+l,nw) + <span style="color: #a020f0;">&amp;</span>
(dtmp_c(j,ii,a,m+l,k,nw)) * een_rescaled_n(j,a,m ,nw) + <span style="color: #a020f0;">&amp;</span>
tmp_c(j,a,m+l,k,nw) * een_rescaled_n_deriv_e(j,ii,a,m,nw) <span style="color: #a020f0;">&amp;</span>
) * cn
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
cn = cn + cn
<span style="color: #a020f0;">do</span> j = 1, elec_num
factor_een_deriv_e(j,4,nw) = factor_een_deriv_e(j,4,nw) + (<span style="color: #a020f0;">&amp;</span>
(dtmp_c(j,1,a,m ,k,nw)) * een_rescaled_n_deriv_e(j,1,a,m+l,nw) + <span style="color: #a020f0;">&amp;</span>
(dtmp_c(j,2,a,m ,k,nw)) * een_rescaled_n_deriv_e(j,2,a,m+l,nw) + <span style="color: #a020f0;">&amp;</span>
(dtmp_c(j,3,a,m ,k,nw)) * een_rescaled_n_deriv_e(j,3,a,m+l,nw) + <span style="color: #a020f0;">&amp;</span>
(dtmp_c(j,1,a,m+l,k,nw)) * een_rescaled_n_deriv_e(j,1,a,m ,nw) + <span style="color: #a020f0;">&amp;</span>
(dtmp_c(j,2,a,m+l,k,nw)) * een_rescaled_n_deriv_e(j,2,a,m ,nw) + <span style="color: #a020f0;">&amp;</span>
(dtmp_c(j,3,a,m+l,k,nw)) * een_rescaled_n_deriv_e(j,3,a,m ,nw) <span style="color: #a020f0;">&amp;</span>
) * cn
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_factor_een_deriv_e_f</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orge069ad1" class="outline-4">
<h4 id="orge069ad1"><span class="section-number-4">3.12.4</span> Test</h4>
<div class="outline-text-4" id="text-3-12-4">
<div class="org-src-container">
<pre class="src src-c">/* <span style="color: #b22222;">Check if Jastrow is properly initialized </span>*/
<span style="color: #0000ff;">assert</span>(<span style="color: #228b22;">qmckl_jastrow_provided</span>(<span style="color: #a0522d;">context</span>));
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">factor_een_deriv_e</span>[4][walk_num][elec_num];
rc = qmckl_get_jastrow_factor_een_deriv_e(context, &amp;(factor_een_deriv_e[0][0][0]),4*walk_num*elec_num);
<span style="color: #0000ff;">assert</span>(fabs(<span style="color: #228b22;">factor_een_deriv_e</span>[0][0][0] + 0.0005481671107226865) &lt; 1e-12);
</pre>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Author: TREX CoE</p>
<p class="date">Created: 2022-07-28 Thu 10:04</p>
<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
</html>