1
0
mirror of https://github.com/TREX-CoE/qmckl.git synced 2025-05-01 12:54:46 +02:00
qmckl/qmckl_jastrow_champ_single.html

6014 lines
338 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>
<!-- 2025-04-29 Tue 08:44 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>CHAMP Jastrow Factor Single</title>
<meta name="author" content="TREX CoE" />
<meta name="generator" content="Org Mode" />
<style>
#content { max-width: 60em; margin: auto; }
.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 #e6e6e6;
border-radius: 3px;
background-color: #f2f2f2;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: auto;
}
pre.src:before {
display: none;
position: absolute;
top: -8px;
right: 12px;
padding: 3px;
color: #555;
background-color: #f2f2f299;
}
pre.src:hover:before { display: inline; margin-top: 14px;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-authinfo::before { content: 'Authinfo'; }
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; }
.equation-container {
display: table;
text-align: center;
width: 100%;
}
.equation {
vertical-align: middle;
}
.equation-label {
display: table-cell;
text-align: right;
vertical-align: middle;
}
.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 { }
</style>
<link rel="stylesheet" title="Standard" href="qmckl.css" type="text/css" />
<script src="org-info.js">
// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&amp;dn=gpl-3.0.txt GPL-v3-or-Later
// @license-end
</script>
<script>
// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&amp;dn=gpl-3.0.txt GPL-v3-or-Later
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
// @license-end
</script>
<script>
window.MathJax = {
tex: {
ams: {
multlineWidth: '85%'
},
tags: 'ams',
tagSide: 'right',
tagIndent: '.8em'
},
chtml: {
scale: 1.0,
displayAlign: 'center',
displayIndent: '0em'
},
svg: {
scale: 1.0,
displayAlign: 'center',
displayIndent: '0em'
},
output: {
font: 'mathjax-modern',
displayOverflow: 'overflow'
}
};
</script>
<script
id="MathJax-script"
async
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">
</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" class="content">
<h1 class="title">CHAMP Jastrow Factor Single</h1>
<div id="table-of-contents" role="doc-toc">
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="#orgfc61824">1. Introduction</a></li>
<li><a href="#org1122ff3">2. Context</a>
<ul>
<li><a href="#orgb51fc80">2.1. Data structure</a></li>
</ul>
</li>
<li><a href="#orgf4c5abf">3. Single point</a>
<ul>
<li><a href="#org5d3744f">3.1. Set</a></li>
<li><a href="#org295fa70">3.2. Touch</a></li>
</ul>
</li>
<li><a href="#org98a8ef3">4. Electron-electron and electron-nucleus distances for single point</a>
<ul>
<li><a href="#orgee9b5cd">4.1. Electron-electron distances</a>
<ul>
<li><a href="#org19eb2c6">4.1.1. Get</a></li>
<li><a href="#org56ba431">4.1.2. Compute</a></li>
</ul>
</li>
<li><a href="#org0875b58">4.2. Electron-nucleus distances</a>
<ul>
<li><a href="#org37d8465">4.2.1. Get</a></li>
<li><a href="#org3178ea8">4.2.2. Compute</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#org27edc40">5. Electron-electron-nucleus Jastrow</a>
<ul>
<li><a href="#orgf692897">5.1. Electron-electron rescaled distances</a>
<ul>
<li><a href="#orgf3cd9c7">5.1.1. Get</a></li>
<li><a href="#org4be8179">5.1.2. Compute</a></li>
</ul>
</li>
<li><a href="#org9a7ab24">5.2. Electron-nucleus rescaled distances</a>
<ul>
<li><a href="#org519a63b">5.2.1. Get</a></li>
<li><a href="#org891e551">5.2.2. Compute</a></li>
</ul>
</li>
<li><a href="#orgc9430c2">5.3. \(\delta P\) matrix</a>
<ul>
<li><a href="#orgce7689f">5.3.1. Get</a></li>
<li><a href="#org6a8bf97">5.3.2. Compute</a></li>
</ul>
</li>
<li><a href="#orgef0997a">5.4. Electron-electron-nucleus Jastrow value</a>
<ul>
<li><a href="#org633e0b5">5.4.1. Get</a></li>
<li><a href="#org03d6a88">5.4.2. Compute</a></li>
</ul>
</li>
<li><a href="#org9251069">5.5. Electron-nucleus rescaled distance derivative</a>
<ul>
<li><a href="#org48e8202">5.5.1. Get</a></li>
<li><a href="#org60f753a">5.5.2. Compute</a></li>
</ul>
</li>
<li><a href="#orgfdca020">5.6. Electron-electron rescaled distances derivative</a>
<ul>
<li><a href="#orgd883675">5.6.1. Get</a></li>
<li><a href="#orgb45e5a6">5.6.2. Compute</a></li>
</ul>
</li>
<li><a href="#org7b28016">5.7. \(\delta P\) matrix gradients and Laplacian</a>
<ul>
<li><a href="#orgf304e93">5.7.1. Get</a></li>
<li><a href="#org2ab66c1">5.7.2. Compute</a></li>
</ul>
</li>
<li><a href="#orgbf5025c">5.8. Electron-electron-nucleus Jastrow gradients and Laplacian</a>
<ul>
<li><a href="#org79819a2">5.8.1. Get</a></li>
<li><a href="#orgefe2876">5.8.2. Compute</a></li>
</ul>
</li>
<li><a href="#orgd89842a">5.9. \(\delta P\) matrix gradient only</a>
<ul>
<li><a href="#org7cd2604">5.9.1. Get</a></li>
<li><a href="#orgccaa59e">5.9.2. Compute</a></li>
</ul>
</li>
<li><a href="#org9d21d33">5.10. Electron-electron-nucleus Jastrow gradients</a>
<ul>
<li><a href="#org6bfa162">5.10.1. Get</a></li>
<li><a href="#org0b4d7cd">5.10.2. Compute</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#orgb148091">6. Electron-electron Jastrow</a>
<ul>
<li><a href="#org8f52cee">6.1. Electron-electron rescaled distance</a>
<ul>
<li><a href="#org14f5b44">6.1.1. Get</a></li>
<li><a href="#orgec8117b">6.1.2. Compute</a></li>
</ul>
</li>
<li><a href="#org2557842">6.2. Electron-electron Jastrow value</a>
<ul>
<li><a href="#org4c240d5">6.2.1. Get</a></li>
<li><a href="#org333e3fe">6.2.2. Compute</a></li>
</ul>
</li>
<li><a href="#org1e40ea1">6.3. Electron-electron rescaled distances derivatives</a>
<ul>
<li><a href="#orged85a72">6.3.1. Get</a></li>
<li><a href="#orgf4511b4">6.3.2. Compute</a></li>
</ul>
</li>
<li><a href="#org0ce7313">6.4. Electron-electron Jastrow gradients and Laplacian</a>
<ul>
<li><a href="#org9538621">6.4.1. Get</a></li>
<li><a href="#orgc134e8b">6.4.2. Compute</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#orgbf0e336">7. Electron-nucleus Jastrow</a>
<ul>
<li><a href="#orgbdc1f14">7.1. Electron-nucleus rescaled distance</a>
<ul>
<li><a href="#org03340ae">7.1.1. Get</a></li>
<li><a href="#orgfc6a2ec">7.1.2. Compute</a></li>
</ul>
</li>
<li><a href="#org36ed085">7.2. Single electron-nucleus Jastrow value</a>
<ul>
<li><a href="#orgf0f9820">7.2.1. Get</a></li>
<li><a href="#org173d970">7.2.2. Compute</a></li>
</ul>
</li>
<li><a href="#org5138156">7.3. Electron-nucleus rescaled distances derivatives</a>
<ul>
<li><a href="#orgb7b718d">7.3.1. Get</a></li>
<li><a href="#org54a571c">7.3.2. Compute</a></li>
</ul>
</li>
<li><a href="#org97e6ae7">7.4. Electron-nucleus Jastrow gradients and Laplacian</a>
<ul>
<li><a href="#orgb4a13cf">7.4.1. Get</a></li>
<li><a href="#orge222f69">7.4.2. Compute</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#orge57cc8d">8. Accept single electron move</a>
<ul>
<li><a href="#org7a55cff">8.1. Code</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div id="outline-container-orgfc61824" class="outline-2">
<h2 id="orgfc61824"><span class="section-number-2">1.</span> Introduction</h2>
<div class="outline-text-2" id="text-1">
<p>
Single-electron move version of the Jastrow factor functions. The single-electron move calculates the difference between the old Jastrow values, gradients and derivatives and the new ones (if the single electron would have been moved).
That is to say, it calculates
\[
\delta J = J(\mathbf{r}^\prime,\mathbf{R}) - J(\mathbf{r},\mathbf{R})
\]
for all the neccessery quantities.
</p>
</div>
</div>
<div id="outline-container-org1122ff3" class="outline-2">
<h2 id="org1122ff3"><span class="section-number-2">2.</span> Context</h2>
<div class="outline-text-2" id="text-2">
</div>
<div id="outline-container-orgb51fc80" class="outline-3">
<h3 id="orgb51fc80"><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_champ_single_struct</span>{
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">num</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">date</span>;
<span style="color: #228b22;">qmckl_matrix</span> <span style="color: #a0522d;">coord</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">een_rescaled_single_e</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">een_rescaled_single_e_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">een_rescaled_single_e_maxsize</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">een_rescaled_single_n</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">een_rescaled_single_n_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">een_rescaled_single_n_maxsize</span>;
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">single_ee_distance</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">single_ee_distance_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">single_ee_distance_maxsize</span>;
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">single_en_distance</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">single_en_distance_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">single_en_distance_maxsize</span>;
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">delta_een</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_een_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_een_maxsize</span>;
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">delta_p</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_p_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_p_maxsize</span>;
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ee_rescaled_single</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">ee_rescaled_single_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">ee_rescaled_single_maxsize</span>;
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">en_rescaled_single</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">en_rescaled_single_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">en_rescaled_single_maxsize</span>;
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">delta_en</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_en_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_en_maxsize</span>;
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">delta_ee</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_ee_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_ee_maxsize</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">een_rescaled_single_e_gl</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">een_rescaled_single_e_gl_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">een_rescaled_single_e_gl_maxsize</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">een_rescaled_single_n_gl</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">een_rescaled_single_n_gl_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">een_rescaled_single_n_gl_maxsize</span>;
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">delta_p_gl</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_p_gl_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_p_gl_maxsize</span>;
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">delta_p_g</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_p_g_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_p_g_maxsize</span>;
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">delta_een_gl</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_een_gl_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_een_gl_maxsize</span>;
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">delta_een_g</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_een_g_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_een_g_maxsize</span>;
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ee_rescaled_single_gl</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">ee_rescaled_single_gl_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">ee_rescaled_single_gl_maxsize</span>;
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">en_rescaled_single_gl</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">en_rescaled_single_gl_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">en_rescaled_single_gl_maxsize</span>;
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">delta_en_gl</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_en_gl_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_en_gl_maxsize</span>;
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">delta_ee_gl</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_ee_gl_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_ee_gl_maxsize</span>;
} <span style="color: #228b22;">qmckl_jastrow_champ_single_struct</span>;
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgf4c5abf" class="outline-2">
<h2 id="orgf4c5abf"><span class="section-number-2">3.</span> Single point</h2>
<div class="outline-text-2" id="text-3">
</div>
<div id="outline-container-org5d3744f" class="outline-3">
<h3 id="org5d3744f"><span class="section-number-3">3.1.</span> Set</h3>
<div class="outline-text-3" id="text-3-1">
<p>
We set the coordinates of the <code>num</code>-th electron for all walkers, where <code>num</code> is the electron which has to be moved.
The dimension of <code>coord</code> is
</p>
<ul class="org-ul">
<li>[walk<sub>num</sub>][3] if <code>transp</code> is <code>'N'</code></li>
<li>[3][walk<sub>num</sub>] if <code>transp</code> is <code>'T'</code></li>
</ul>
<p>
Internally, the coordinates are stored in 'N' format as opposed to elec<sub>coord</sub>.
This function has to be called before any other functions from this module.
</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_single_point</span> (<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">char</span> <span style="color: #a0522d;">transp</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">coord</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
</pre>
</div>
<p>
The Fortran function shifts the <code>num</code> by 1 because of 1-based
indexing.
</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_single_point_f</span> (<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">char</span> <span style="color: #a0522d;">transp</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">coord</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</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_set_single_point</span> (<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">char</span> <span style="color: #a0522d;">transp</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">coord</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>)
{
<span style="color: #a020f0;">if</span> (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) {
<span style="color: #a020f0;">return</span> QMCKL_NULL_CONTEXT;
}
<span style="color: #a020f0;">if</span> (num &lt; 0) {
<span style="color: #a020f0;">return</span> qmckl_failwith( context,
QMCKL_INVALID_ARG_3,
<span style="color: #8b2252;">"qmckl_set_single_point"</span>,
<span style="color: #8b2252;">"Incorrect point number"</span>);
}
<span style="color: #a020f0;">if</span> (transp != <span style="color: #8b2252;">'N'</span> &amp;&amp; transp != <span style="color: #8b2252;">'T'</span>) {
<span style="color: #a020f0;">return</span> qmckl_failwith( context,
QMCKL_INVALID_ARG_2,
<span style="color: #8b2252;">"qmckl_set_single_point"</span>,
<span style="color: #8b2252;">"transp should be 'N' or 'T'"</span>);
}
<span style="color: #a020f0;">if</span> (coord == <span style="color: #008b8b;">NULL</span>) {
<span style="color: #a020f0;">return</span> qmckl_failwith( context,
QMCKL_INVALID_ARG_3,
<span style="color: #8b2252;">"qmckl_set_single_point"</span>,
<span style="color: #8b2252;">"coord is a NULL pointer"</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>);
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span> = ctx-&gt;electron.walker.num;
<span style="color: #a020f0;">if</span> (size_max &lt; 3*walk_num) {
<span style="color: #a020f0;">return</span> qmckl_failwith( context,
QMCKL_INVALID_ARG_4,
<span style="color: #8b2252;">"qmckl_set_single_point"</span>,
<span style="color: #8b2252;">"Array too small"</span>);
}
//<span style="color: #b22222;">qmckl_exit_code rc;</span>
//<span style="color: #b22222;">if (ctx-&gt;single_point.coord.data != NULL) {</span>
// <span style="color: #b22222;">rc = qmckl_matrix_free(context, &amp;(ctx-&gt;single_point.coord));</span>
// <span style="color: #b22222;">assert (rc == QMCKL_SUCCESS);</span>
//<span style="color: #b22222;">}</span>
<span style="color: #a020f0;">if</span> (ctx-&gt;single_point.coord.data == <span style="color: #008b8b;">NULL</span>) {
ctx-&gt;single_point.coord = qmckl_matrix_alloc(context, walk_num, 3);
<span style="color: #a020f0;">if</span> (ctx-&gt;single_point.coord.data == <span style="color: #008b8b;">NULL</span>) {
<span style="color: #a020f0;">return</span> qmckl_failwith( context,
QMCKL_ALLOCATION_FAILED,
<span style="color: #8b2252;">"qmckl_set_single_point"</span>,
<span style="color: #008b8b;">NULL</span>);
}
}
ctx-&gt;single_point.num = num;
<span style="color: #a020f0;">if</span> (transp == <span style="color: #8b2252;">'N'</span>) {
<span style="color: #228b22;">double</span> *<span style="color: #a0522d;">a</span> = ctx-&gt;single_point.coord.data;
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">i</span>=0 ; i&lt;3*walk_num ; ++i) {
a[i] = coord[i];
}
} <span style="color: #a020f0;">else</span> {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">i</span>=0 ; i&lt;walk_num ; ++i) {
qmckl_mat(ctx-&gt;single_point.coord, i, 0) = coord[i*walk_num + 0];
qmckl_mat(ctx-&gt;single_point.coord, i, 1) = coord[i*walk_num + 1];
qmckl_mat(ctx-&gt;single_point.coord, i, 2) = coord[i*walk_num + 2];
}
}
/* <span style="color: #b22222;">Increment the date of the single point</span> */
ctx-&gt;single_point.date += 1UL;
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
}
<span style="color: #228b22;">qmckl_exit_code</span>
<span style="color: #0000ff;">qmckl_set_single_point_f</span> (<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">char</span> <span style="color: #a0522d;">transp</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">coord</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>)
{
<span style="color: #a020f0;">return</span> qmckl_set_single_point(context, transp, num-1, coord, size_max);
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_set_single_point</span><span style="color: #a0522d;">(context, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> transp, num, coord, size_max) bind(C, name=</span><span style="color: #8b2252;">"qmckl_set_single_point_f"</span><span style="color: #a0522d;">)</span>
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<span style="color: #a020f0;">import</span>
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">character</span>(<span style="color: #008b8b;">c_char</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> transp</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coord(*)</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
<span style="color: #a020f0;">end function</span>
<span style="color: #a020f0;">end interface</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org295fa70" class="outline-3">
<h3 id="org295fa70"><span class="section-number-3">3.2.</span> Touch</h3>
<div class="outline-text-3" id="text-3-2">
<div class="org-src-container">
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
<span style="color: #0000ff;">qmckl_single_touch</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>
<div id="outline-container-org98a8ef3" class="outline-2">
<h2 id="org98a8ef3"><span class="section-number-2">4.</span> Electron-electron and electron-nucleus distances for single point</h2>
<div class="outline-text-2" id="text-4">
<p>
In order to calculate the \(\delta J\), the updated electron-electron and electron-nucleus distances are required.
</p>
</div>
<div id="outline-container-orgee9b5cd" class="outline-3">
<h3 id="orgee9b5cd"><span class="section-number-3">4.1.</span> Electron-electron distances</h3>
<div class="outline-text-3" id="text-4-1">
<p>
Electron-electron distance between the single electron and all
electrons for all walkers.
Dimension is <code>[walk_num][elec_num]</code>.
</p>
</div>
<div id="outline-container-org19eb2c6" class="outline-4">
<h4 id="org19eb2c6"><span class="section-number-4">4.1.1.</span> Get</h4>
<div class="outline-text-4" id="text-4-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_single_electron_ee_distance</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</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-org56ba431" class="outline-4">
<h4 id="org56ba431"><span class="section-number-4">4.1.2.</span> Compute</h4>
<div class="outline-text-4" id="text-4-1-2">
<table id="org7026c89" 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>num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Index of single electron</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>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>coord</code></td>
<td class="org-left"><code>double[3][walk_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron coordinates</td>
</tr>
<tr>
<td class="org-left"><code>single_coord</code></td>
<td class="org-left"><code>double[walk_num][3]</code></td>
<td class="org-left">in</td>
<td class="org-left">Single electron coordinates</td>
</tr>
<tr>
<td class="org-left"><code>single_ee_distance</code></td>
<td class="org-left"><code>double[walk_num][elec_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Electron-electron distances for single electron</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_single_ee_distance</span><span style="color: #a0522d;">(context, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> num_in, elec_num, walk_num, coord, single_coord, single_ee_distance) </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> result(info) bind(C)</span>
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<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> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num, num_in</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coord(elec_num,walk_num,3)</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> single_coord(3,walk_num)</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> single_ee_distance(elec_num,walk_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> k, i, j, num</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, y, z</span>
info = QMCKL_SUCCESS
num = num_in + 1
<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> (elec_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> (walk_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;">do</span> k=1,walk_num
info = qmckl_distance(context, <span style="color: #8b2252;">'T'</span>, <span style="color: #8b2252;">'N'</span>, elec_num, 1_8, <span style="color: #a020f0;">&amp;</span>
coord(1,k,1), elec_num*walk_num, <span style="color: #a020f0;">&amp;</span>
single_coord(1,k), 3_8, <span style="color: #a020f0;">&amp;</span>
single_ee_distance(1,k), elec_num)
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">then</span>
<span style="color: #a020f0;">exit</span>
<span style="color: #a020f0;">endif</span>
single_ee_distance(num,k) = 0.0d0
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_single_ee_distance</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org0875b58" class="outline-3">
<h3 id="org0875b58"><span class="section-number-3">4.2.</span> Electron-nucleus distances</h3>
<div class="outline-text-3" id="text-4-2">
<p>
Electron-nucleus distance between the single electron and all
nuclei for all walkers.
Dimension is <code>[walk_num][nucl_num]</code>.
</p>
</div>
<div id="outline-container-org37d8465" class="outline-4">
<h4 id="org37d8465"><span class="section-number-4">4.2.1.</span> Get</h4>
<div class="outline-text-4" id="text-4-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_single_electron_en_distance</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">distance</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-org3178ea8" class="outline-4">
<h4 id="org3178ea8"><span class="section-number-4">4.2.2.</span> Compute</h4>
<div class="outline-text-4" id="text-4-2-2">
<table id="orgd8eaa48" 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 nuclei</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_coord</code></td>
<td class="org-left"><code>double[3][walk_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron coordinates</td>
</tr>
<tr>
<td class="org-left"><code>nucl_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>single_en_distance</code></td>
<td class="org-left"><code>double[walk_num][nucl_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Electron-nucleus distances for single-electron</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_single_en_distance</span><span style="color: #a0522d;">(context, nucl_num, walk_num, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> elec_coord, nucl_coord, single_en_distance) result(info) bind(C)</span>
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<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> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> nucl_num, walk_num</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> elec_coord(3,walk_num)</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> nucl_coord(nucl_num,3)</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> single_en_distance(nucl_num, walk_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> k</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>
info = qmckl_distance(context, <span style="color: #8b2252;">'T'</span>, <span style="color: #8b2252;">'N'</span>, nucl_num, walk_num, <span style="color: #a020f0;">&amp;</span>
nucl_coord, nucl_num, <span style="color: #a020f0;">&amp;</span>
elec_coord, 3_8, <span style="color: #a020f0;">&amp;</span>
single_en_distance, nucl_num)
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_single_en_distance</span>
</pre>
</div>
</div>
</div>
</div>
</div>
<div id="outline-container-org27edc40" class="outline-2">
<h2 id="org27edc40"><span class="section-number-2">5.</span> Electron-electron-nucleus Jastrow</h2>
<div class="outline-text-2" id="text-5">
<p>
Calcules the single electron contributions to the electron-electron-nucleus Jastrow term.
First, the rescaled distances for the single electron electron-nucleus and electron-electron distances are computed.
These rescaled distances can be calculates by
\[
\widetilde{R}_{i\alpha} = e^{-\kappa l R_{i\alpha}} \quad \text{and} \quad \widetilde{r}_{ij} = e^{-\kappa l r_{ij}}.
\]
Here, \(\kappa\) is the rescaling factor and \(l\) the power. The neccessery powers are stored in the same array.
From these, we can calculate the \(\delta \widetilde{R}\) and \(\delta \widetilde{r}\) using
</p>
\begin{eqnarray*}
\delta \widetilde{R}_{i\alpha} &=& \widetilde{R}_{i\alpha}^\text{new} - \widetilde{R}_{i\alpha}^\text{old} \quad \text{and}\\
\delta \widetilde{r}_{ij} &=& \widetilde{r}_{ij}^\text{new} - \widetilde{r}_{ij}^\text{old}.
\end{eqnarray*}
<p>
With these, we can now calculate the single electron contribution to the \(\delta P\) matrix, using the equation
</p>
\begin{eqnarray*}
\delta P_{i,\alpha,k,l} &=& P^{\text{new}}_{i,\alpha,k,l} - P^{\text{old}}_{i,\alpha,k,l}\\
&=& \sum_{j=1}^{N_\text{elec}} \left(\widetilde{r}_{i,j,k} \delta \widetilde{R}_{j,\alpha,l}\delta_{j,\text{num}} +
\delta \widetilde{r}_{i,j,k} \widetilde{R}_{j,\alpha,l} (\delta_{j,\text{num}}
+ \delta_{i,\text{num}}) + \delta \widetilde{r}_{i,j,k} \delta \widetilde{R}_{j,\alpha,l} \delta_{j,\text{num}}\right)\\
&=& \sum_{j=1}^{N_\text{elec}} \left( \delta \widetilde{r}_{i,j,k} \widetilde{R}_{j,\alpha,l} \delta_{i,\text{num}} \right)
+ \widetilde{r}_{i,\text{num},k} \delta \widetilde{R}_{\text{num},\alpha,l} + \delta \widetilde{r}_{i,\text{num},k} \left( \widetilde{R}_{\text{num},\alpha,l}
+ \delta \widetilde{R}_{\text{num},\alpha,l} \right).
\end{eqnarray*}
<p>
Then, the electron-electron-nucleus Jastrow value can be calculated by
</p>
\begin{eqnarray*}
\delta J_{een} &=& J_{een}^{\text{new}} - J_{een}^{\text{old}}\\
&=&\sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}}\sum_{\alpha=1}^{N_\text{nucl}} c_{l,k,p,\alpha}
\sum_{i=1}^{N_\text{elec}} \left( \delta \widetilde{R}_{i,\alpha,(p-k-l)/2} P_{i,\alpha,k,(p-k+l)/2} \delta_{i,\text{num}}
+ \widetilde{R}_{i,\alpha,(p-k-l)/2} \delta P_{i,\alpha,k,(p-k+l)/2}
+ \delta \widetilde{R}_{i,\alpha,(p-k-l)/2} \delta P_{i,\alpha,k,(p-k+l)/2} \delta_{i,\text{num}} \right)\\
&=& \sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}}\sum_{\alpha=1}^{N_\text{nucl}} c_{l,k,p,\alpha} \left(
\sum_{i=1}^{N_\text{elec}} \left( \widetilde{R}_{i,\alpha,(p-k-l)/2} \delta P_{i,\alpha,k,(p-k+l)/2} \right)
+ \delta \widetilde{R}_{\text{num},\alpha,(p-k-l)/2} \left(P_{\text{num},\alpha,k,(p-k+l)/2} + \delta P_{\text{num},\alpha,k,(p-k+l)/2} \right)\right)
\end{eqnarray*}
<p>
To calculate the gradients and Laplacian of the electron-electron-nucleus Jastrow,
we first have to calculate the gradients and Laplacian of the rescaled distances,
\[
\partial_{i,m} \widetilde{R}_{i\alpha} = -\kappa l e^{-\kappa l R_{i\alpha}} \frac{r_{i,m} - R_{\alpha,m}}{R_{i\alpha}} \quad \text{and} \quad
\partial_{i,4} \widetilde{R}_{i\alpha} = -\kappa l \left(\frac{2}{R_{i\alpha}}- \kappa l \right) e^{-\kappa l R_{i\alpha}},
\]
where \(i\) is the electron of which we are taking the derivative and \(m=1:3\) are the gradients and \(m=4\) is the Laplacian.
The derivatives of the single electron rescaled electron-nucleus distances are only nonzero when \(i=\text{num}\).
Similarly for \(r\) we get
\[
\partial_{i,m} \widetilde{r}_{ij} = -\kappa l e^{-\kappa l r_{ij}} \frac{r_{i,m} - r_{j,m}}{r_{ij}} \quad \text{and} \quad
\partial_{i,4} \widetilde{r}_{ij} = -\kappa l \left(\frac{2}{r_{ij}}- \kappa l \right) e^{-\kappa l r_{ij}}.
\]
</p>
<p>
With these, we can now calculate the gradient and Laplacian of the \(\delta P\) matrix, using the equation
</p>
\begin{eqnarray*}
\partial_{i,m} \delta P_{i,\alpha,k,l} &=& \partial_{i,m} P_{i,\alpha,k,l}^\text{new} - \partial_{i,m} P_{i,\alpha,k,l}^\text{old}\\
&=& \partial_{i,m}\delta \widetilde{r}_{\text{num},i,k} \left(\partial_{i,m}\delta \widetilde{R}_{\text{num},\alpha,l} + \partial_{i,m}\widetilde{R}_{\text{num},\alpha,l} \right) g_m
+ \partial_{i,m}\widetilde{r}_{\text{num},i,k} \delta \widetilde{R}_{\text{num},\alpha,l}
+ \delta_{i,\text{num}} \sum_{j=1}^{N_\text{elec}} \left( \partial_{j,m} \delta \widetilde{r}_{\text{num},j,k} \widetilde{R}_{j,\alpha,l} \right),
\end{eqnarray*}
<p>
where \(g_m = \{-1,-1,-1,1\}\).
</p>
<p>
Then, the gradient and Laplacian of the electron-electron-nucleus Jastrow value can be calculated by
</p>
\begin{eqnarray*}
\delta \partial_{i,m} J_{een} &=& \partial_{i,m} J_{een}^{\text{new}} - \partial_{i,m} J_{een}^{\text{old}}\\
&=&\sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}}\sum_{\alpha=1}^{N_\text{nucl}} c_{l,k,p,\alpha}
\left( \widetilde{R}_{i,\alpha,(p-k-l)/2} \partial_{i,m} \delta P_{i,\alpha,k,(p-k+l)/2}
+ \widetilde{R}_{i,\alpha,(p-k+l)/2} \partial_{i,m} \delta P_{i,\alpha,k,(p-k-l)/2} \right. \\
& &\ + \partial_{i,m}\widetilde{R}_{i,\alpha,(p-k-l)/2} \delta P_{i,\alpha,k,(p-k+l)/2}
+ \partial_{i,m}\widetilde{R}_{i,\alpha,(p-k+l)/2} \delta P_{i,\alpha,k,(p-k-l)/2} \\
& &\ + \delta_{i,\text{num}} \left( \delta \widetilde{R}_{i,\alpha,(p-k-l)/2} \left ( \partial_{i,m} P_{i,\alpha,k,(p-k+l)/2} + \partial_{i,m} \delta P_{i,\alpha,k,(p-k+l)/2} \right)
+ \delta \widetilde{R}_{i,\alpha,(p-k+l)/2} \left ( \partial_{i,m} P_{i,\alpha,k,(p-k-l)/2} + \partial_{i,m} \delta P_{i,\alpha,k,(p-k-l)/2} \right) \right. \\
& &\ \left. + \partial_{i,m} \delta \widetilde{R}_{i,\alpha,(p-k-l)/2} \left ( P_{i,\alpha,k,(p-k+l)/2} + \delta P_{i,\alpha,k,(p-k+l)/2} \right)
+ \partial_{i,m} \delta \widetilde{R}_{i,\alpha,(p-k+l)/2} \left ( P_{i,\alpha,k,(p-k-l)/2} + \delta P_{i,\alpha,k,(p-k-l)/2} \right) \right)\\
& &\ + \delta_{m,4} \sum_{d=1}^3 \left( \partial_{i,d} \widetilde{R}_{i,\alpha,(p-k-l)/2} \partial_{i,d} \delta P_{i,\alpha,k,(p-k+l)/2}
+ \partial_{i,d} \widetilde{R}_{i,\alpha,(p-k+l)/2} \partial_{i,d} \delta P_{i,\alpha,k,(p-k-l)/2} \right)\\
& &\ \left. + \delta_{m,4}\delta_{i,\text{num}} \sum_{d=1}^3\left( \partial_{i,d}\delta \widetilde{R}_{i,\alpha,(p-k-l)/2} \left( \partial_{i,d} P_{i,\alpha,k,(p-k+l)/2} + \partial_{i,d}\delta P_{i,\alpha,k,(p-k+l)/2} \right)
+ \partial_{i,d}\delta \widetilde{R}_{i,\alpha,(p-k+l)/2} \left( \partial_{i,d} P_{i,\alpha,k,(p-k-l)/2} + \partial_{i,d} \delta P_{i,\alpha,k,(p-k-l)/2} \right) \right) \right)
\end{eqnarray*}
</div>
<div id="outline-container-orgf692897" class="outline-3">
<h3 id="orgf692897"><span class="section-number-3">5.1.</span> Electron-electron rescaled distances</h3>
<div class="outline-text-3" id="text-5-1">
<p>
Computes the new components of the \(\widetilde{r}_{ij}\) matrix. Because only one electron is moved, the new matrix only has one dimension of size <code>elec_num</code>.
</p>
</div>
<div id="outline-container-orgf3cd9c7" class="outline-4">
<h4 id="orgf3cd9c7"><span class="section-number-4">5.1.1.</span> Get</h4>
<div class="outline-text-4" id="text-5-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_een_rescaled_single_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-org4be8179" class="outline-4">
<h4 id="org4be8179"><span class="section-number-4">5.1.2.</span> Compute</h4>
<div class="outline-text-4" id="text-5-1-2">
<table id="org4446a5f" 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>num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of single electron</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_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>single_ee_distance</code></td>
<td class="org-left"><code>double[walk_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Single electron-electron distances for each walker</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">Rescaled electron-electron distances for each walker</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_e</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Single electron-electron rescaled distances for each walker</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_een_rescaled_single_e_doc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> context, num_in, walk_num, elec_num, cord_num, rescale_factor_ee, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> single_ee_distance, een_rescaled_e, een_rescaled_single_e) </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> result(info) bind(C)</span>
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<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>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> cord_num</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> rescale_factor_ee</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> single_ee_distance(elec_num,walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</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;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> een_rescaled_single_e(elec_num,0:cord_num,walk_num)</span>
<span style="color: #228b22;">double precision</span>,<span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> een_rescaled_single_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, num</span>
num = num_in + 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: #a020f0;">allocate</span>(een_rescaled_single_e_ij(elec_num, cord_num + 1))
! <span style="color: #b22222;">Prepare table of exponentiated distances raised to appropriate power</span>
<span style="color: #a020f0;">do</span> nw = 1, walk_num
een_rescaled_single_e_ij(:, 1) = 1.0d0
<span style="color: #a020f0;">do</span> j = 1, elec_num
een_rescaled_single_e_ij(j, 2) = dexp(-rescale_factor_ee * single_ee_distance(j, nw))
<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
een_rescaled_single_e_ij(k, l + 1) = een_rescaled_single_e_ij(k, l) * een_rescaled_single_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_single_e(:,0,nw) = 1.0d0
<span style="color: #a020f0;">do</span> l = 1, cord_num
<span style="color: #a020f0;">do</span> j = 1, elec_num
x = een_rescaled_single_e_ij(j, l + 1)
een_rescaled_single_e(j, l, nw) = x
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
een_rescaled_single_e(num, :, :) = 0.0d0
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_een_rescaled_single_e_doc</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org9a7ab24" class="outline-3">
<h3 id="org9a7ab24"><span class="section-number-3">5.2.</span> Electron-nucleus rescaled distances</h3>
<div class="outline-text-3" id="text-5-2">
<p>
Computes the new components of the \(\widetilde{R}_{i\alpha}\) matrix.
</p>
</div>
<div id="outline-container-org519a63b" class="outline-4">
<h4 id="org519a63b"><span class="section-number-4">5.2.1.</span> Get</h4>
<div class="outline-text-4" id="text-5-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_een_rescaled_single_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-org891e551" class="outline-4">
<h4 id="org891e551"><span class="section-number-4">5.2.2.</span> Compute</h4>
<div class="outline-text-4" id="text-5-2-2">
<table id="orge19a0cd" 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>num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of single electron</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 atoms</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>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 atom 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">Types 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_en</code></td>
<td class="org-left"><code>double[nucl_num]</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>single_en_distance</code></td>
<td class="org-left"><code>double[walk_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 rescaled distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_n</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Single 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;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_een_rescaled_single_n</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> context, num_in, walk_num, elec_num, nucl_num, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> type_nucl_num, type_nucl_vector, cord_num, rescale_factor_en, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> single_en_distance, een_rescaled_n, een_rescaled_single_n) </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> result(info) bind(C)</span>
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<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>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> nucl_num</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> type_nucl_num</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> type_nucl_vector(nucl_num)</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> cord_num</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> rescale_factor_en(type_nucl_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> single_en_distance(nucl_num,walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</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;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> een_rescaled_single_n(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, num</span>
num = num_in + 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> (nucl_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: #a020f0;">do</span> nw = 1, walk_num
! <span style="color: #b22222;">prepare the actual een table</span>
een_rescaled_single_n(:, 0, nw) = 1.0d0
<span style="color: #a020f0;">do</span> a = 1, nucl_num
een_rescaled_single_n(a, 1, nw) = dexp(-rescale_factor_en(type_nucl_vector(a)+1) * single_en_distance(a, nw))
<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
een_rescaled_single_n(a, l, nw) = een_rescaled_single_n(a, l - 1, nw) * een_rescaled_single_n(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 function</span> <span style="color: #0000ff;">qmckl_compute_een_rescaled_single_n</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgc9430c2" class="outline-3">
<h3 id="orgc9430c2"><span class="section-number-3">5.3.</span> \(\delta P\) matrix</h3>
<div class="outline-text-3" id="text-5-3">
<p>
Computes the \(\delta P\) matrix.
</p>
\begin{eqnarray*}
\delta P_{i,\alpha,k,l} = \sum_{j=1}^{N_\text{elec}} \left( \delta \widetilde{r}_{i,j,k} \widetilde{R}_{j,\alpha,l} \delta_{i,\text{num}} \right)
+ \widetilde{r}_{i,\text{num},k} \delta \widetilde{R}_{\text{num},\alpha,l} + \delta \widetilde{r}_{i,\text{num},k} \left( \widetilde{R}_{\text{num},\alpha,l}
+ \delta \widetilde{R}_{\text{num},\alpha,l} \right).
\end{eqnarray*}
</div>
<div id="outline-container-orgce7689f" class="outline-4">
<h4 id="orgce7689f"><span class="section-number-4">5.3.1.</span> Get</h4>
<div class="outline-text-4" id="text-5-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_champ_delta_p</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;">delta_p</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-org6a8bf97" class="outline-4">
<h4 id="org6a8bf97"><span class="section-number-4">5.3.2.</span> Compute</h4>
<div class="outline-text-4" id="text-5-3-2">
<table id="org5ee9e98" 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>num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Single point index</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 nuclei</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>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 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 rescaled distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_n</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus single rescaled distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_e</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-electron single rescaled distances</td>
</tr>
<tr>
<td class="org-left"><code>delta_p</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">Delta P matrix</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_jastrow_champ_delta_p_doc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> context, num_in, walk_num, elec_num, nucl_num, cord_num, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> een_rescaled_n, een_rescaled_e, een_rescaled_single_n, een_rescaled_single_e, delta_p) </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> result(info) bind(C)</span>
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<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>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in, walk_num, elec_num, cord_num, nucl_num</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</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;">real</span>(<span style="color: #008b8b;">c_double</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;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n(nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_e(elec_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_p(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;"> een_rescaled_delta_e(elec_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, c, j, l, k, p, m, n, nw, num</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> dn, dn2</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> LDA, LDB, LDC</span>
num = num_in + 1
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) info = QMCKL_INVALID_ARG_5
<span style="color: #a020f0;">if</span> (cord_num &lt; 0) info = QMCKL_INVALID_ARG_6
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">if</span> (cord_num == 0) <span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">do</span> nw=1, walk_num
<span style="color: #a020f0;">do</span> i=0, cord_num-1
een_rescaled_delta_e(:) = een_rescaled_single_e(:,i,nw) - een_rescaled_e(:,num,i,nw)
<span style="color: #a020f0;">do</span> c=0,cord_num
<span style="color: #a020f0;">do</span> a=1,nucl_num
dn = een_rescaled_single_n(a,c,nw) - een_rescaled_n(num,a,c,nw)
dn2 = een_rescaled_single_n(a,c,nw)
<span style="color: #a020f0;">do</span> j=1,elec_num
delta_p(j,a,c,i,nw) = een_rescaled_e(j,num,i,nw)*dn + een_rescaled_delta_e(j) * dn2
<span style="color: #a020f0;">enddo</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
info = qmckl_dgemm(context, <span style="color: #8b2252;">'T'</span>, <span style="color: #8b2252;">'N'</span>, 1_8, nucl_num * (cord_num+1_8), elec_num, 1.0d0, <span style="color: #a020f0;">&amp;</span>
een_rescaled_delta_e,elec_num, <span style="color: #a020f0;">&amp;</span>
een_rescaled_n(1,1,0,nw),elec_num, <span style="color: #a020f0;">&amp;</span>
1.0d0, <span style="color: #a020f0;">&amp;</span>
delta_p(num,1,0,i,nw),elec_num)
<span style="color: #a020f0;">enddo</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_delta_p_doc</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgef0997a" class="outline-3">
<h3 id="orgef0997a"><span class="section-number-3">5.4.</span> Electron-electron-nucleus Jastrow value</h3>
<div class="outline-text-3" id="text-5-4">
<p>
Computes \(\delta J_{een}\) by combining \(\delta \widetilde{R}_{i\alpha}\) and \(\delta P\).
</p>
\begin{eqnarray*}
J_{een} = \sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}}\sum_{\alpha=1}^{N_\text{nucl}} c_{l,k,p,\alpha} \left(
\sum_{i=1}^{N_\text{elec}} \left( \widetilde{R}_{i,\alpha,(p-k-l)/2} \delta P_{i,\alpha,k,(p-k+l)/2} \right)
+ \delta \widetilde{R}_{\text{num},\alpha,(p-k-l)/2} \left(P_{\text{num},\alpha,k,(p-k+l)/2} + \delta P_{\text{num},\alpha,k,(p-k+l)/2} \right)\right)
\end{eqnarray*}
</div>
<div id="outline-container-org633e0b5" class="outline-4">
<h4 id="org633e0b5"><span class="section-number-4">5.4.1.</span> Get</h4>
<div class="outline-text-4" id="text-5-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_champ_single_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;">delta_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 class="org-src-container">
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_get_jastrow_champ_single_een</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> delta_een, size_max) bind(C)</span>
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<span style="color: #a020f0;">import</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: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>), <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_een(size_max)</span>
<span style="color: #a020f0;">end function</span>
<span style="color: #a020f0;">end interface</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org03d6a88" class="outline-4">
<h4 id="org03d6a88"><span class="section-number-4">5.4.2.</span> Compute</h4>
<div class="outline-text-4" id="text-5-4-2">
<table id="org946faf2" 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>num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Single point number</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 nuclei</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_c_vector</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>c_vector_full</code></td>
<td class="org-left"><code>double[dim_c_vector][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_c_vector]</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">P matrix</td>
</tr>
<tr>
<td class="org-left"><code>delta_p</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">Delta P matrix</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 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 rescaled distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_n</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus single rescaled distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_e</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-electron single rescaled distances</td>
</tr>
<tr>
<td class="org-left"><code>delta_een</code></td>
<td class="org-left"><code>double[walk_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Single electron electron-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;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_jastrow_champ_factor_single_een_doc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> context, num_in, walk_num, elec_num, nucl_num, cord_num, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> dim_c_vector, c_vector_full, lkpm_combined_index, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> tmp_c, delta_p, een_rescaled_n, een_rescaled_e, een_rescaled_single_n, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> een_rescaled_single_e, delta_een) </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> result(info) bind(C)</span>
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<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>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in, walk_num, elec_num, cord_num, nucl_num, dim_c_vector</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> lkpm_combined_index(dim_c_vector,4)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> c_vector_full(nucl_num, dim_c_vector)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</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;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> delta_p(elec_num, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</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;">real</span>(<span style="color: #008b8b;">c_double</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;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n(nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_e(elec_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_een(walk_num)</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> delta_c(nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> delta_c2(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;"> een_rescaled_delta_n(nucl_num, 0:cord_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, p, m, n, nw, num</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> accu, accu2, cn</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> LDA, LDB, LDC</span>
num = num_in + 1
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) info = QMCKL_INVALID_ARG_5
<span style="color: #a020f0;">if</span> (cord_num &lt; 0) info = QMCKL_INVALID_ARG_6
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
delta_een = 0.0d0
<span style="color: #a020f0;">if</span> (cord_num == 0) <span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">do</span> nw =1, walk_num
een_rescaled_delta_n(:,:) = een_rescaled_single_n(:,:,nw) - een_rescaled_n(num,:,:,nw)
<span style="color: #a020f0;">do</span> n = 1, dim_c_vector
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 = c_vector_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) * delta_p(j,a,m+l,k,nw)
<span style="color: #a020f0;">end do</span>
accu = accu + een_rescaled_delta_n(a,m) * (tmp_c(num,a,m+l,k,nw) + delta_p(num,a,m+l,k,nw))
delta_een(nw) = delta_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_jastrow_champ_factor_single_een_doc</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org9251069" class="outline-3">
<h3 id="org9251069"><span class="section-number-3">5.5.</span> Electron-nucleus rescaled distance derivative</h3>
<div class="outline-text-3" id="text-5-5">
<p>
Calculates \(\partial_{i,m} \widetilde{R}_{i,\alpha}\), which is required to compute the derivative of \(J_{een}\).
\[
\partial_{i,m} \widetilde{R}_{i\alpha} = -\kappa l e^{-\kappa l R_{i\alpha}} \frac{r_{i,m} - R_{\alpha,m}}{R_{i\alpha}} \quad \text{and} \quad
\partial_{i,4} \widetilde{R}_{i\alpha} = -\kappa l \left(\frac{2}{R_{i\alpha}}- \kappa l \right) e^{-\kappa l R_{i\alpha}},
\]
</p>
</div>
<div id="outline-container-org48e8202" class="outline-4">
<h4 id="org48e8202"><span class="section-number-4">5.5.1.</span> Get</h4>
<div class="outline-text-4" id="text-5-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_een_rescaled_single_n_gl</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-org60f753a" class="outline-4">
<h4 id="org60f753a"><span class="section-number-4">5.5.2.</span> Compute</h4>
<div class="outline-text-4" id="text-5-5-2">
<table id="orga43cfe6" 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>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>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 atom 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">Types 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_en</code></td>
<td class="org-left"><code>double[nucl_num]</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_ee</code></td>
<td class="org-left"><code>double[walk_num][3]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron coordinates</td>
</tr>
<tr>
<td class="org-left"><code>coord_n</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>single_en_distance</code></td>
<td class="org-left"><code>double[walk_num][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus single distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_n</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus rescaled single distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_n_gl</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4]</code></td>
<td class="org-left">out</td>
<td class="org-left">Electron-nucleus rescaled single distances derivative</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_een_rescaled_single_n_gl</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> context, walk_num, nucl_num, type_nucl_num, type_nucl_vector, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> cord_num, rescale_factor_en, coord_ee, coord_n, single_en_distance, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> een_rescaled_single_n, een_rescaled_single_n_gl) </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> result(info) bind(C)</span>
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<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: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> nucl_num</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> type_nucl_num</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> type_nucl_vector(nucl_num)</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> cord_num</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> rescale_factor_en(type_nucl_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coord_ee(3,walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coord_n(nucl_num,3)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> single_en_distance(nucl_num,walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n(nucl_num,0:cord_num,walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> een_rescaled_single_n_gl(4,nucl_num,0:cord_num,walk_num)</span>
<span style="color: #228b22;">double precision</span>,<span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> elnuc_dist_gl(:,:)</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_gl(4, 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> (nucl_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_single_n_gl = 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
ria_inv = 1.0d0 / single_en_distance(a, nw)
<span style="color: #a020f0;">do</span> ii = 1, 3
elnuc_dist_gl(ii, a) = (coord_ee(ii,nw) - coord_n(a, ii)) * ria_inv
<span style="color: #a020f0;">end do</span>
elnuc_dist_gl(4, a) = 2.0d0 * ria_inv
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">do</span> l = 0, cord_num
<span style="color: #a020f0;">do</span> a = 1, nucl_num
kappa_l = - <span style="color: #a020f0;">dble</span>(l) * rescale_factor_en(type_nucl_vector(a)+1)
een_rescaled_single_n_gl(1, a, l, nw) = kappa_l * elnuc_dist_gl(1, a)
een_rescaled_single_n_gl(2, a, l, nw) = kappa_l * elnuc_dist_gl(2, a)
een_rescaled_single_n_gl(3, a, l, nw) = kappa_l * elnuc_dist_gl(3, a)
een_rescaled_single_n_gl(4, a, l, nw) = kappa_l * (elnuc_dist_gl(4, a) + kappa_l)
een_rescaled_single_n_gl(1, a, l, nw) = een_rescaled_single_n_gl(1, a, l, nw) * <span style="color: #a020f0;">&amp;</span>
een_rescaled_single_n(a, l, nw)
een_rescaled_single_n_gl(2, a, l, nw) = een_rescaled_single_n_gl(2, a, l, nw) * <span style="color: #a020f0;">&amp;</span>
een_rescaled_single_n(a, l, nw)
een_rescaled_single_n_gl(3, a, l, nw) = een_rescaled_single_n_gl(3, a, l, nw) * <span style="color: #a020f0;">&amp;</span>
een_rescaled_single_n(a, l, nw)
een_rescaled_single_n_gl(4, a, l, nw) = een_rescaled_single_n_gl(4, a, l, nw) * <span style="color: #a020f0;">&amp;</span>
een_rescaled_single_n(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 function</span> <span style="color: #0000ff;">qmckl_compute_een_rescaled_single_n_gl</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgfdca020" class="outline-3">
<h3 id="orgfdca020"><span class="section-number-3">5.6.</span> Electron-electron rescaled distances derivative</h3>
<div class="outline-text-3" id="text-5-6">
<p>
Calculates the updated terms of \(\partial_{i,m} \widetilde{r}_{ij}\), required for computing the derivative of \(J_{een}\).
\[
\partial_{i,m} \widetilde{r}_{ij} = -\kappa l e^{-\kappa l r_{ij}} \frac{r_{i,m} - r_{j,m}}{r_{ij}} \quad \text{and} \quad
\partial_{i,4} \widetilde{r}_{ij} = -\kappa l \left(\frac{2}{r_{ij}}- \kappa l \right) e^{-\kappa l r_{ij}}.
\]
</p>
</div>
<div id="outline-container-orgd883675" class="outline-4">
<h4 id="orgd883675"><span class="section-number-4">5.6.1.</span> Get</h4>
<div class="outline-text-4" id="text-5-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_een_rescaled_single_e_gl</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-orgb45e5a6" class="outline-4">
<h4 id="orgb45e5a6"><span class="section-number-4">5.6.2.</span> Compute</h4>
<div class="outline-text-4" id="text-5-6-2">
<table id="org2ba14d6" 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>num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Index of single electron</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_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</code></td>
<td class="org-left"><code>double[walk_num][3]</code></td>
<td class="org-left">in</td>
<td class="org-left">Single electron coordinates</td>
</tr>
<tr>
<td class="org-left"><code>coord_ee</code></td>
<td class="org-left"><code>double[3][walk_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron coordinates</td>
</tr>
<tr>
<td class="org-left"><code>single_ee_distance</code></td>
<td class="org-left"><code>double[walk_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-electron single distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_e</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-electron rescaled single distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_e_gl</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num][4]</code></td>
<td class="org-left">out</td>
<td class="org-left">Electron-electron rescaled single distances derivative</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_een_rescaled_single_e_gl_doc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> context, num_in, walk_num, elec_num, cord_num, rescale_factor_ee, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> coord, coord_ee, single_ee_distance, een_rescaled_single_e, een_rescaled_single_e_gl) </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> result(info) bind(C)</span>
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<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>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> cord_num</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> rescale_factor_ee</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coord(3,walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coord_ee(elec_num,walk_num,3)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> single_ee_distance(elec_num,walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_e(elec_num,0:cord_num,walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> een_rescaled_single_e_gl(4,elec_num,0:cord_num,walk_num)</span>
<span style="color: #228b22;">double precision</span>,<span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> elec_dist_gl(:,:)</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, num</span>
num = num_in + 1
<span style="color: #a020f0;">allocate</span>(elec_dist_gl(4, 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_3
<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_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;">Not necessary: should be set to zero by qmckl_malloc</span>
! <span style="color: #b22222;">een_rescaled_single_e_gl = 0.0d0</span>
! <span style="color: #b22222;">Prepare table of exponentiated distances raised to appropriate power</span>
<span style="color: #a020f0;">do</span> nw = 1, walk_num
<span style="color: #a020f0;">do</span> i = 1, elec_num
<span style="color: #a020f0;">if</span> (i == num) <span style="color: #a020f0;">cycle</span>
rij_inv = 1.0d0 / single_ee_distance(i, nw)
<span style="color: #a020f0;">do</span> ii = 1, 3
elec_dist_gl(ii, i) = (coord(ii, nw) - coord_ee(i, nw, ii)) * rij_inv
<span style="color: #a020f0;">end do</span>
elec_dist_gl(4, i) = 2.0d0 * rij_inv
<span style="color: #a020f0;">end do</span>
elec_dist_gl(:, num) = 0.0d0
<span style="color: #a020f0;">do</span> l = 1, cord_num
kappa_l = - <span style="color: #a020f0;">dble</span>(l) * rescale_factor_ee
<span style="color: #a020f0;">do</span> i = 1, elec_num
een_rescaled_single_e_gl(1, i, l, nw) = kappa_l * elec_dist_gl(1, i)
een_rescaled_single_e_gl(2, i, l, nw) = kappa_l * elec_dist_gl(2, i)
een_rescaled_single_e_gl(3, i, l, nw) = kappa_l * elec_dist_gl(3, i)
een_rescaled_single_e_gl(4, i, l, nw) = kappa_l * (elec_dist_gl(4, i) + kappa_l)
een_rescaled_single_e_gl(1,i,l,nw) = een_rescaled_single_e_gl(1,i,l,nw) * een_rescaled_single_e(i,l,nw)
een_rescaled_single_e_gl(2,i,l,nw) = een_rescaled_single_e_gl(2,i,l,nw) * een_rescaled_single_e(i,l,nw)
een_rescaled_single_e_gl(3,i,l,nw) = een_rescaled_single_e_gl(3,i,l,nw) * een_rescaled_single_e(i,l,nw)
een_rescaled_single_e_gl(4,i,l,nw) = een_rescaled_single_e_gl(4,i,l,nw) * een_rescaled_single_e(i,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 function</span> <span style="color: #0000ff;">qmckl_compute_een_rescaled_single_e_gl_doc</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org7b28016" class="outline-3">
<h3 id="org7b28016"><span class="section-number-3">5.7.</span> \(\delta P\) matrix gradients and Laplacian</h3>
<div class="outline-text-3" id="text-5-7">
<p>
Calculate \(\partial_{i,m} \delta P\).
</p>
\begin{eqnarray*}
\partial_{i,m} \delta P_{i,\alpha,k,l} = \partial_{i,m}\delta \widetilde{r}_{\text{num},i,k} \left(\partial_{i,m}\delta \widetilde{R}_{\text{num},\alpha,l} + \partial_{i,m}\widetilde{R}_{\text{num},\alpha,l} \right) g_m
+ \partial_{i,m}\widetilde{r}_{\text{num},i,k} \delta \widetilde{R}_{\text{num},\alpha,l}
+ \delta_{i,\text{num}} \sum_{j=1}^{N_\text{elec}} \left( \partial_{j,m} \delta \widetilde{r}_{\text{num},j,k} \widetilde{R}_{j,\alpha,l} \right),
\end{eqnarray*}
<p>
where \(g_m = \{-1,-1,-1,1\}\).
</p>
</div>
<div id="outline-container-orgf304e93" class="outline-4">
<h4 id="orgf304e93"><span class="section-number-4">5.7.1.</span> Get</h4>
<div class="outline-text-4" id="text-5-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_champ_delta_p_gl</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;">delta_p_gl</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-org2ab66c1" class="outline-4">
<h4 id="org2ab66c1"><span class="section-number-4">5.7.2.</span> Compute</h4>
<div class="outline-text-4" id="text-5-7-2">
<table id="org9216706" 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>num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Index of single electron</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 nuclei</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>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 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 rescaled distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_n</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus single rescaled distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_e</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-electron single rescaled distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_n_gl</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">Electron-nucleus rescaled distances derivatives</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_e_gl</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 distances derivatives</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_n_gl</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus single rescaled distances derivatives</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_e_gl</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num][4]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-electron single rescaled distances derivatives</td>
</tr>
<tr>
<td class="org-left"><code>delta_p_gl</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][4][nucl_num][elec_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Delta P matrix gradient and Laplacian</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_jastrow_champ_delta_p_gl_doc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> context, num_in, walk_num, elec_num, nucl_num, cord_num, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> een_rescaled_n, een_rescaled_e, een_rescaled_single_n, een_rescaled_single_e, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> een_rescaled_n_gl, een_rescaled_e_gl, een_rescaled_single_n_gl, een_rescaled_single_e_gl, delta_p_gl) </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> result(info) bind(C)</span>
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<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>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in, walk_num, elec_num, cord_num, nucl_num</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</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;">real</span>(<span style="color: #008b8b;">c_double</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;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n(nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_e(elec_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n_gl(elec_num, 4, nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_e_gl(elec_num, 4, elec_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n_gl(4, nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_e_gl(4,elec_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_p_gl(elec_num,nucl_num,4,0:cord_num, 0:cord_num-1, walk_num)</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> delta_e_gl(elec_num,4)</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> een_rescaled_delta_n, een_re_n, een_re_single_n</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, p, m, n, nw, num</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> tmp, cummu</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> LDA, LDB, LDC</span>
num = num_in + 1
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) info = QMCKL_INVALID_ARG_5
<span style="color: #a020f0;">if</span> (cord_num &lt; 0) info = QMCKL_INVALID_ARG_6
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">if</span> (cord_num == 0) <span style="color: #a020f0;">then</span>
delta_p_gl = 0.d0
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">do</span> nw=1, walk_num
<span style="color: #a020f0;">do</span> m=1, cord_num-1
<span style="color: #a020f0;">do</span> k = 1, 4
<span style="color: #a020f0;">do</span> j = 1, elec_num
delta_e_gl(j,k) = een_rescaled_single_e_gl(k,j,m,nw) - een_rescaled_e_gl(num, k, j, m, nw)
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">do</span> k = 1, 4
delta_e_gl(num, k) = 0.0d0
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">do</span> l=0, cord_num
<span style="color: #a020f0;">do</span> k = 1, 3
<span style="color: #a020f0;">do</span> a = 1, nucl_num
een_re_n = een_rescaled_n(num, a, l, nw)
een_re_single_n = een_rescaled_single_n(a,l,nw)
cummu = 0.0d0
<span style="color: #a020f0;">do</span> i = 1, elec_num
delta_p_gl(i,a,k,l,m,nw) = -een_rescaled_e_gl(i,k,num,m,nw) * een_re_n <span style="color: #a020f0;">&amp;</span>
- een_rescaled_single_e_gl(k,i,m,nw) * een_re_single_n
cummu = cummu + delta_e_gl(i,k) * een_rescaled_n(i,a,l,nw)
<span style="color: #a020f0;">end do</span>
delta_p_gl(num,a,k,l,m,nw) = delta_p_gl(num,a,k,l,m,nw) + cummu
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">do</span> a = 1, nucl_num
een_rescaled_delta_n = een_rescaled_single_n(a,l,nw) - een_rescaled_n(num, a, l, nw)
cummu = 0.0d0
een_re_single_n = een_rescaled_single_n(a,l,nw)
<span style="color: #a020f0;">do</span> i = 1, elec_num
delta_p_gl(i,a,4,l,m,nw) = een_rescaled_e_gl(i,4,num,m,nw) * een_rescaled_delta_n <span style="color: #a020f0;">&amp;</span>
+delta_e_gl(i,4) * een_re_single_n
cummu = cummu + delta_e_gl(i,4) * een_rescaled_n(i,a,l,nw)
<span style="color: #a020f0;">end do</span>
delta_p_gl(num,a,4,l,m,nw) = delta_p_gl(num,a,4,l,m,nw) + cummu
<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_jastrow_champ_delta_p_gl_doc</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgbf5025c" class="outline-3">
<h3 id="orgbf5025c"><span class="section-number-3">5.8.</span> Electron-electron-nucleus Jastrow gradients and Laplacian</h3>
<div class="outline-text-3" id="text-5-8">
<p>
Calculates the gradients and Laplacian of \(\delta J_{een}\).
</p>
\begin{eqnarray*}
\partial_{i,m} J_{een} &=& \sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}}\sum_{\alpha=1}^{N_\text{nucl}} c_{l,k,p,\alpha}
\left( \widetilde{R}_{i,\alpha,(p-k-l)/2} \partial_{i,m} \delta P_{i,\alpha,k,(p-k+l)/2}
+ \widetilde{R}_{i,\alpha,(p-k+l)/2} \partial_{i,m} \delta P_{i,\alpha,k,(p-k-l)/2} \right. \\
& &\ + \partial_{i,m}\widetilde{R}_{i,\alpha,(p-k-l)/2} \delta P_{i,\alpha,k,(p-k+l)/2}
+ \partial_{i,m}\widetilde{R}_{i,\alpha,(p-k+l)/2} \delta P_{i,\alpha,k,(p-k-l)/2} \\
& &\ + \delta_{i,\text{num}} \left( \delta \widetilde{R}_{i,\alpha,(p-k-l)/2} \left ( \partial_{i,m} P_{i,\alpha,k,(p-k+l)/2} + \partial_{i,m} \delta P_{i,\alpha,k,(p-k+l)/2} \right)
+ \delta \widetilde{R}_{i,\alpha,(p-k+l)/2} \left ( \partial_{i,m} P_{i,\alpha,k,(p-k-l)/2} + \partial_{i,m} \delta P_{i,\alpha,k,(p-k-l)/2} \right) \right. \\
& &\ \left. + \partial_{i,m} \delta \widetilde{R}_{i,\alpha,(p-k-l)/2} \left ( P_{i,\alpha,k,(p-k+l)/2} + \delta P_{i,\alpha,k,(p-k+l)/2} \right)
+ \partial_{i,m} \delta \widetilde{R}_{i,\alpha,(p-k+l)/2} \left ( P_{i,\alpha,k,(p-k-l)/2} + \delta P_{i,\alpha,k,(p-k-l)/2} \right) \right)\\
& &\ + \delta_{m,4} \sum_{d=1}^3 \left( \partial_{i,d} \widetilde{R}_{i,\alpha,(p-k-l)/2} \partial_{i,d} \delta P_{i,\alpha,k,(p-k+l)/2}
+ \partial_{i,d} \widetilde{R}_{i,\alpha,(p-k+l)/2} \partial_{i,d} \delta P_{i,\alpha,k,(p-k-l)/2} \right)\\
& &\ \left. + \delta_{m,4}\delta_{i,\text{num}} \sum_{d=1}^3\left( \partial_{i,d}\delta \widetilde{R}_{i,\alpha,(p-k-l)/2} \left( \partial_{i,d} P_{i,\alpha,k,(p-k+l)/2} + \partial_{i,d}\delta P_{i,\alpha,k,(p-k+l)/2} \right)
+ \partial_{i,d}\delta \widetilde{R}_{i,\alpha,(p-k+l)/2} \left( \partial_{i,d} P_{i,\alpha,k,(p-k-l)/2} + \partial_{i,d} \delta P_{i,\alpha,k,(p-k-l)/2} \right) \right) \right)
\end{eqnarray*}
</div>
<div id="outline-container-org79819a2" class="outline-4">
<h4 id="org79819a2"><span class="section-number-4">5.8.1.</span> Get</h4>
<div class="outline-text-4" id="text-5-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_champ_single_een_gl</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;">delta_een_gl</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_get_jastrow_champ_single_een_gl</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> delta_een_gl, size_max) bind(C)</span>
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<span style="color: #a020f0;">import</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: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>), <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_een_gl(size_max)</span>
<span style="color: #a020f0;">end function</span>
<span style="color: #a020f0;">end interface</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgefe2876" class="outline-4">
<h4 id="orgefe2876"><span class="section-number-4">5.8.2.</span> Compute</h4>
<div class="outline-text-4" id="text-5-8-2">
<table id="org341e34a" 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>num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Index of single electron</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 nuclei</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_c_vector</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>c_vector_full</code></td>
<td class="org-left"><code>double[dim_c_vector][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_c_vector]</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">P matrix</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">P matrix derivative</td>
</tr>
<tr>
<td class="org-left"><code>delta_p</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">Delta P matrix</td>
</tr>
<tr>
<td class="org-left"><code>delta_p_gl</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][4][nucl_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Delta P matrix derivative</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 distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_n</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus single rescaled distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_n_gl</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">Electron-nucleus rescaled distances derivatives</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_n_gl</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus single rescaled distances derivatives</td>
</tr>
<tr>
<td class="org-left"><code>delta_een_gl</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">Delta electron-electron-nucleus jastrow gradient and Laplacian</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_jastrow_champ_factor_single_een_gl_doc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> context, num_in, walk_num, elec_num, nucl_num, cord_num, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> dim_c_vector, c_vector_full, lkpm_combined_index, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> tmp_c, dtmp_c, delta_p, delta_p_gl, een_rescaled_n, een_rescaled_single_n, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> een_rescaled_n_gl, een_rescaled_single_n_gl, delta_een_gl) </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> result(info) bind(C)</span>
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<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>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in, walk_num, elec_num, cord_num, nucl_num, dim_c_vector</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> lkpm_combined_index(dim_c_vector,4)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> c_vector_full(nucl_num, dim_c_vector)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</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;">real</span>(<span style="color: #008b8b;">c_double</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;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> delta_p(elec_num, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> delta_p_gl(elec_num, nucl_num, 4, 0:cord_num, 0:cord_num-1, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</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;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n(nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n_gl(elec_num, 4, nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n_gl(4, nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_een_gl(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, kk, num</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> accu, accu2, cn</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> LDA, LDB, LDC</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> een_rescaled_delta_n(nucl_num, 0:cord_num)</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> een_rescaled_delta_n_gl(4, nucl_num, 0:cord_num)</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> dpg1_m, dpg1_ml, dp_m, dp_ml, een_r_m, een_r_ml, een_r_gl_m, een_r_gl_ml</span>
num = num_in + 1
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) info = QMCKL_INVALID_ARG_5
<span style="color: #a020f0;">if</span> (cord_num &lt; 0) info = QMCKL_INVALID_ARG_6
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
delta_een_gl = 0.0d0
<span style="color: #a020f0;">if</span> (cord_num == 0) <span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">do</span> nw =1, walk_num
een_rescaled_delta_n(:,:) = een_rescaled_single_n(:,:,nw) - een_rescaled_n(num, :, :, nw)
een_rescaled_delta_n_gl(:,:,:) = een_rescaled_single_n_gl(:,:,:,nw) - een_rescaled_n_gl(num, :,:,:,nw)
<span style="color: #a020f0;">do</span> n = 1, dim_c_vector
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> kk = 1, 4
<span style="color: #a020f0;">do</span> a = 1, nucl_num
cn = c_vector_full(a, n)
<span style="color: #a020f0;">if</span>(cn == 0.d0) <span style="color: #a020f0;">cycle</span>
<span style="color: #a020f0;">do</span> i = 1, elec_num
delta_een_gl(i,kk,nw) = delta_een_gl(i,kk,nw) + ( <span style="color: #a020f0;">&amp;</span>
delta_p_gl(i,a,kk,m ,k,nw) * een_rescaled_n(i,a,m+l,nw) + <span style="color: #a020f0;">&amp;</span>
delta_p_gl(i,a,kk,m+l,k,nw) * een_rescaled_n(i,a,m ,nw) + <span style="color: #a020f0;">&amp;</span>
delta_p(i,a,m ,k,nw) * een_rescaled_n_gl(i,kk,a,m+l,nw) + <span style="color: #a020f0;">&amp;</span>
delta_p(i,a,m+l,k,nw) * een_rescaled_n_gl(i,kk,a,m ,nw) ) * cn
<span style="color: #a020f0;">end do</span>
delta_een_gl(num,kk,nw) = delta_een_gl(num,kk,nw) + ( <span style="color: #a020f0;">&amp;</span>
(dtmp_c(num,kk,a,m ,k,nw) + delta_p_gl(num,a,kk,m ,k,nw)) * een_rescaled_delta_n(a,m+l) + <span style="color: #a020f0;">&amp;</span>
(dtmp_c(num,kk,a,m+l,k,nw) + delta_p_gl(num,a,kk,m+l,k,nw)) * een_rescaled_delta_n(a,m ) + <span style="color: #a020f0;">&amp;</span>
(tmp_c(num,a,m ,k,nw) + delta_p(num,a,m ,k,nw)) * een_rescaled_delta_n_gl(kk,a,m+l) + <span style="color: #a020f0;">&amp;</span>
(tmp_c(num,a,m+l,k,nw) + delta_p(num,a,m+l,k,nw)) * een_rescaled_delta_n_gl(kk,a,m ) )* cn
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">do</span> a = 1, nucl_num
cn = c_vector_full(a, n)
<span style="color: #a020f0;">if</span>(cn == 0.d0) <span style="color: #a020f0;">cycle</span>
cn = cn + cn
<span style="color: #a020f0;">do</span> i = 1, elec_num
delta_een_gl(i,4,nw) = delta_een_gl(i,4,nw) + ( <span style="color: #a020f0;">&amp;</span>
delta_p_gl(i,a,1,m ,k,nw) * een_rescaled_n_gl(i,1,a,m+l,nw) + <span style="color: #a020f0;">&amp;</span>
delta_p_gl(i,a,1,m+l,k,nw) * een_rescaled_n_gl(i,1,a,m ,nw) + <span style="color: #a020f0;">&amp;</span>
delta_p_gl(i,a,2,m ,k,nw) * een_rescaled_n_gl(i,2,a,m+l,nw) + <span style="color: #a020f0;">&amp;</span>
delta_p_gl(i,a,2,m+l,k,nw) * een_rescaled_n_gl(i,2,a,m ,nw) + <span style="color: #a020f0;">&amp;</span>
delta_p_gl(i,a,3,m ,k,nw) * een_rescaled_n_gl(i,3,a,m+l,nw) + <span style="color: #a020f0;">&amp;</span>
delta_p_gl(i,a,3,m+l,k,nw) * een_rescaled_n_gl(i,3,a,m ,nw) ) * cn
<span style="color: #a020f0;">end do</span>
delta_een_gl(num,4,nw) = delta_een_gl(num,4,nw) + ( <span style="color: #a020f0;">&amp;</span>
(delta_p_gl(num,a,1,m ,k,nw) + dtmp_c(num,1,a,m ,k,nw)) * een_rescaled_delta_n_gl(1,a,m+l) + <span style="color: #a020f0;">&amp;</span>
(delta_p_gl(num,a,1,m+l,k,nw) + dtmp_c(num,1,a,m+l,k,nw)) * een_rescaled_delta_n_gl(1,a,m ) + <span style="color: #a020f0;">&amp;</span>
(delta_p_gl(num,a,2,m ,k,nw) + dtmp_c(num,2,a,m ,k,nw)) * een_rescaled_delta_n_gl(2,a,m+l) + <span style="color: #a020f0;">&amp;</span>
(delta_p_gl(num,a,2,m+l,k,nw) + dtmp_c(num,2,a,m+l,k,nw)) * een_rescaled_delta_n_gl(2,a,m ) + <span style="color: #a020f0;">&amp;</span>
(delta_p_gl(num,a,3,m ,k,nw) + dtmp_c(num,3,a,m ,k,nw)) * een_rescaled_delta_n_gl(3,a,m+l) + <span style="color: #a020f0;">&amp;</span>
(delta_p_gl(num,a,3,m+l,k,nw) + dtmp_c(num,3,a,m+l,k,nw)) * een_rescaled_delta_n_gl(3,a,m ) ) * 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_jastrow_champ_factor_single_een_gl_doc</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_jastrow_champ_factor_single_een_gl_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;">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;">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;">int64_t</span> <span style="color: #a0522d;">dim_c_vector</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">c_vector_full</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">lkpm_combined_index</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">tmp_c</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dtmp_c</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">delta_p</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">delta_p_gl</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_rescaled_n</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_rescaled_single_n</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_rescaled_n_gl</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_rescaled_single_n_gl</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">delta_een_gl</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_3;
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_4;
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_5;
<span style="color: #a020f0;">if</span> (cord_num &lt; 0) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_6;
<span style="color: #a020f0;">if</span> (cord_num == 0) {
<span style="color: #483d8b;"> #pragma</span> omp parallel <span style="color: #a020f0;">for</span>
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">size_t</span> <span style="color: #a0522d;">i</span>=0 ; i&lt;walk_num*4*elec_num ; ++i) {
delta_een_gl[i] = 0.;
}
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
}
<span style="color: #483d8b;">#ifdef</span> HAVE_OPENMP
<span style="color: #483d8b;">#pragma</span> omp parallel <span style="color: #a020f0;">for</span>
<span style="color: #483d8b;">#endif</span>
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nw</span>=0 ; nw&lt;walk_num ; nw++) {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">i</span>=0 ; i&lt;4*elec_num ; ++i) {
delta_een_gl[i+nw*4*elec_num] = 0.;
}
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">een_rescaled_delta_n</span>[nucl_num*(cord_num+1)];
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">een_rescaled_delta_n_gl</span>[4*nucl_num*(cord_num+1)];
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">k</span>=0 ; k&lt;nucl_num*(cord_num+1) ; ++k) {
een_rescaled_delta_n[k] = een_rescaled_single_n[k+nucl_num*(cord_num+1)*nw] - een_rescaled_n[num+elec_num*(k+nucl_num*(cord_num+1)*nw)];
een_rescaled_delta_n_gl[0+4*k] = een_rescaled_single_n_gl[0+4*(k+nucl_num*(cord_num+1)*nw)] - een_rescaled_n_gl[num+elec_num*(0+4*(k+nucl_num*(cord_num+1)*nw))];
een_rescaled_delta_n_gl[1+4*k] = een_rescaled_single_n_gl[1+4*(k+nucl_num*(cord_num+1)*nw)] - een_rescaled_n_gl[num+elec_num*(1+4*(k+nucl_num*(cord_num+1)*nw))];
een_rescaled_delta_n_gl[2+4*k] = een_rescaled_single_n_gl[2+4*(k+nucl_num*(cord_num+1)*nw)] - een_rescaled_n_gl[num+elec_num*(2+4*(k+nucl_num*(cord_num+1)*nw))];
een_rescaled_delta_n_gl[3+4*k] = een_rescaled_single_n_gl[3+4*(k+nucl_num*(cord_num+1)*nw)] - een_rescaled_n_gl[num+elec_num*(3+4*(k+nucl_num*(cord_num+1)*nw))];
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">n</span>=0 ; n&lt;dim_c_vector ; ++n) {
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">l</span> = lkpm_combined_index[n];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">k</span> = lkpm_combined_index[n+dim_c_vector];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">m</span> = lkpm_combined_index[n+3*dim_c_vector];
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">kk</span>=0 ; kk&lt;4 ; ++kk) {
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dgl</span> = &amp;delta_een_gl[elec_num*(kk+4*nw)];
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">a</span>=0 ; a&lt;nucl_num ; ++a) {
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span> <span style="color: #a0522d;">cn</span> = c_vector_full[a+n*nucl_num];
<span style="color: #a020f0;">if</span> (cn == 0.) <span style="color: #a020f0;">continue</span>;
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dpg1_m</span> = &amp;delta_p_gl[elec_num*(a+nucl_num*(kk+4*(m+(cord_num+1)*(k+cord_num*nw))))];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dpg1_ml</span> = &amp;delta_p_gl[elec_num*(a+nucl_num*(kk+4*(m+l+(cord_num+1)*(k+cord_num*nw))))];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dp_m</span> = &amp;delta_p[elec_num*(a+nucl_num*(m+(cord_num+1)*(k+cord_num*nw)))];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dp_ml</span> = &amp;delta_p[elec_num*(a+nucl_num*(m+l+(cord_num+1)*(k+cord_num*nw)))];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_r_m</span> = &amp;een_rescaled_n[elec_num*(a+nucl_num*(m+(cord_num+1)*nw))];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_r_ml</span> = &amp;een_rescaled_n[elec_num*(a+nucl_num*(m+l+(cord_num+1)*nw))];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_r_gl_m</span> = &amp;een_rescaled_n_gl[elec_num*(kk+4*(a+nucl_num*(m+(cord_num+1)*nw)))];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_r_gl_ml</span> = &amp;een_rescaled_n_gl[elec_num*(kk+4*(a+nucl_num*(m+l+(cord_num+1)*nw)))];
<span style="color: #483d8b;">#ifdef</span> HAVE_OPENMP
<span style="color: #483d8b;"> #pragma</span> omp simd
<span style="color: #483d8b;">#endif</span>
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">i</span>=0 ; i&lt;elec_num ; ++i) {
dgl[i] += cn * (dpg1_m[i] * een_r_ml[i] + dpg1_ml[i] * een_r_m[i] +
dp_m[i] * een_r_gl_ml[i] + dp_ml[i] * een_r_gl_m[i]);
}
dgl[num] += ( (dtmp_c[num+elec_num*(kk+4*(a+nucl_num*(m+(cord_num+1)*(k+cord_num*nw))))] +
dpg1_m[num]
) * een_rescaled_delta_n[a+nucl_num*(m+l)] +
(dtmp_c[num+elec_num*(kk+4*(a+nucl_num*(m+l+(cord_num+1)*(k+cord_num*nw))))] +
dpg1_ml[num]
) * een_rescaled_delta_n[a+nucl_num*m] +
(tmp_c[num+elec_num*(a+nucl_num*(m+(cord_num+1)*(k+cord_num*nw)))] +
dp_m[num]
) * een_rescaled_delta_n_gl[kk+4*(a+nucl_num*(m+l))] +
(tmp_c[num+elec_num*(a+nucl_num*(m+l+(cord_num+1)*(k+cord_num*nw)))] +
dp_ml[num]
) * een_rescaled_delta_n_gl[kk+4*(a+nucl_num*m)]
) * cn;
}
}
<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;">const</span> <span style="color: #228b22;">double</span> <span style="color: #a0522d;">cn</span> = 2. * c_vector_full[a+n*nucl_num];
<span style="color: #a020f0;">if</span> (cn == 0.) <span style="color: #a020f0;">continue</span>;
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dgl4</span> = &amp;delta_een_gl[elec_num*(3+4*nw)];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dpg1_m</span> = &amp;delta_p_gl[elec_num*(a+nucl_num*(0+4*(m+(cord_num+1)*(k+cord_num*nw))))];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dpg2_m</span> = &amp;delta_p_gl[elec_num*(a+nucl_num*(1+4*(m+(cord_num+1)*(k+cord_num*nw))))];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dpg3_m</span> = &amp;delta_p_gl[elec_num*(a+nucl_num*(2+4*(m+(cord_num+1)*(k+cord_num*nw))))];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dpg1_ml</span> = &amp;delta_p_gl[elec_num*(a+nucl_num*(0+4*(m+l+(cord_num+1)*(k+cord_num*nw))))];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dpg2_ml</span> = &amp;delta_p_gl[elec_num*(a+nucl_num*(1+4*(m+l+(cord_num+1)*(k+cord_num*nw))))];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dpg3_ml</span> = &amp;delta_p_gl[elec_num*(a+nucl_num*(2+4*(m+l+(cord_num+1)*(k+cord_num*nw))))];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_r_gl1_m</span> = &amp;een_rescaled_n_gl[elec_num*(0+4*(a+nucl_num*(m+(cord_num+1)*nw)))];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_r_gl2_m</span> = &amp;een_rescaled_n_gl[elec_num*(1+4*(a+nucl_num*(m+(cord_num+1)*nw)))];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_r_gl3_m</span> = &amp;een_rescaled_n_gl[elec_num*(2+4*(a+nucl_num*(m+(cord_num+1)*nw)))];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_r_gl1_ml</span> = &amp;een_rescaled_n_gl[elec_num*(0+4*(a+nucl_num*(m+l+(cord_num+1)*nw)))];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_r_gl2_ml</span> = &amp;een_rescaled_n_gl[elec_num*(1+4*(a+nucl_num*(m+l+(cord_num+1)*nw)))];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_r_gl3_ml</span> = &amp;een_rescaled_n_gl[elec_num*(2+4*(a+nucl_num*(m+l+(cord_num+1)*nw)))];
<span style="color: #483d8b;">#ifdef</span> HAVE_OPENMP
<span style="color: #483d8b;"> #pragma</span> omp simd
<span style="color: #483d8b;">#endif</span>
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">i</span>=0 ; i&lt;elec_num ; ++i) {
dgl4[i] += (dpg1_m[i] * een_r_gl1_ml[i] + dpg1_ml[i] * een_r_gl1_m[i] +
dpg2_m[i] * een_r_gl2_ml[i] + dpg2_ml[i] * een_r_gl2_m[i] +
dpg3_m[i] * een_r_gl3_ml[i] + dpg3_ml[i] * een_r_gl3_m[i] ) * cn;
}
dgl4[num] += ((dpg1_m[num] +
dtmp_c[num+elec_num*(0+4*(a+nucl_num*(m+(cord_num+1)*(k+cord_num*nw))))]
) * een_rescaled_delta_n_gl[0+4*(a+nucl_num*(m+l))] +
(dpg1_ml[num] +
dtmp_c[num+elec_num*(0+4*(a+nucl_num*(m+l+(cord_num+1)*(k+cord_num*nw))))]
) * een_rescaled_delta_n_gl[0+4*(a+nucl_num*m)] +
(dpg2_m[num] +
dtmp_c[num+elec_num*(1+4*(a+nucl_num*(m+(cord_num+1)*(k+cord_num*nw))))]
) * een_rescaled_delta_n_gl[1+4*(a+nucl_num*(m+l))] +
(dpg2_ml[num] +
dtmp_c[num+elec_num*(1+4*(a+nucl_num*(m+l+(cord_num+1)*(k+cord_num*nw))))]
) * een_rescaled_delta_n_gl[1+4*(a+nucl_num*m)] +
(dpg3_m[num] +
dtmp_c[num+elec_num*(2+4*(a+nucl_num*(m+(cord_num+1)*(k+cord_num*nw))))]
) * een_rescaled_delta_n_gl[2+4*(a+nucl_num*(m+l))] +
(dpg3_ml[num] +
dtmp_c[num+elec_num*(2+4*(a+nucl_num*(m+l+(cord_num+1)*(k+cord_num*nw))))]
) * een_rescaled_delta_n_gl[2+4*(a+nucl_num*m)] ) * cn;
}
}
}
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
}
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgd89842a" class="outline-3">
<h3 id="orgd89842a"><span class="section-number-3">5.9.</span> \(\delta P\) matrix gradient only</h3>
<div class="outline-text-3" id="text-5-9">
<p>
To allow for more efficient treatment of nonlocal pseudopotentials, we also include a routine for only calculating the gradient (and not the Laplacian) of \(\delta J_{een}\).
For this, we calculate the gradient of \(\delta P\).
</p>
</div>
<div id="outline-container-org7cd2604" class="outline-4">
<h4 id="org7cd2604"><span class="section-number-4">5.9.1.</span> Get</h4>
<div class="outline-text-4" id="text-5-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_champ_delta_p_g</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;">delta_p_g</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-orgccaa59e" class="outline-4">
<h4 id="orgccaa59e"><span class="section-number-4">5.9.2.</span> Compute</h4>
<div class="outline-text-4" id="text-5-9-2">
<table id="orge40a62d" 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>num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Index of single electron</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 nuclei</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>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 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 rescaled distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_n</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus single rescaled distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_e</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-electron single rescaled distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_n_gl</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">Electron-nucleus rescaled distances derivatives</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_e_gl</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 distances derivatives</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_n_gl</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus single rescaled distances derivatives</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_e_gl</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num][4]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-electron single rescaled distances derivatives</td>
</tr>
<tr>
<td class="org-left"><code>delta_p_g</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][4][nucl_num][elec_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Delta P matrix gradient</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_jastrow_champ_delta_p_g_doc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> context, num_in, walk_num, elec_num, nucl_num, cord_num, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> een_rescaled_n, een_rescaled_e, een_rescaled_single_n, een_rescaled_single_e, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> een_rescaled_n_gl, een_rescaled_e_gl, een_rescaled_single_n_gl, een_rescaled_single_e_gl, delta_p_g) </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> result(info) bind(C)</span>
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<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>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in, walk_num, elec_num, cord_num, nucl_num</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</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;">real</span>(<span style="color: #008b8b;">c_double</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;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n(nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_e(elec_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n_gl(elec_num, 4, nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_e_gl(elec_num, 4, elec_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n_gl(4, nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_e_gl(4,elec_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_p_g(elec_num,nucl_num,4,0:cord_num, 0:cord_num-1, walk_num)</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> delta_e_gl(elec_num,4)</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> een_rescaled_delta_n, een_re_n, een_re_single_n</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, p, m, n, nw, num</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> tmp, cummu</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> LDA, LDB, LDC</span>
num = num_in + 1
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">if</span> (num &lt;= 0) info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) info = QMCKL_INVALID_ARG_5
<span style="color: #a020f0;">if</span> (cord_num &lt; 0) info = QMCKL_INVALID_ARG_6
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">if</span> (cord_num == 0) <span style="color: #a020f0;">then</span>
delta_p_g = 0.d0
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">do</span> nw=1, walk_num
<span style="color: #a020f0;">do</span> m=1, cord_num-1
<span style="color: #a020f0;">do</span> j = 1, elec_num
<span style="color: #a020f0;">do</span> k = 1, 4
delta_e_gl(j,k) = een_rescaled_single_e_gl(k,j,m,nw) - een_rescaled_e_gl(num, k, j, m, nw)
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">do</span> k = 1, 4
delta_e_gl(num, k) = 0.0d0
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">do</span> l=0, cord_num
<span style="color: #a020f0;">do</span> k = 1, 3
<span style="color: #a020f0;">do</span> a = 1, nucl_num
cummu = 0.0d0
<span style="color: #a020f0;">do</span> i = 1, elec_num
cummu = cummu + delta_e_gl(i,k) * een_rescaled_n(i,a,l,nw)
<span style="color: #a020f0;">end do</span>
delta_p_g(num,a,k,l,m,nw) = cummu
<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 do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_delta_p_g_doc</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_jastrow_champ_delta_p_g_hpc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> context, num_in, walk_num, elec_num, nucl_num, cord_num, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> een_rescaled_n, een_rescaled_e, een_rescaled_single_n, een_rescaled_single_e, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> een_rescaled_n_gl, een_rescaled_e_gl, een_rescaled_single_n_gl, een_rescaled_single_e_gl, delta_p_g) </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> result(info) bind(C)</span>
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<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>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in, walk_num, elec_num, cord_num, nucl_num</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</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;">real</span>(<span style="color: #008b8b;">c_double</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;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n(nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_e(elec_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n_gl(elec_num, 4, nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_e_gl(elec_num, 4, elec_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n_gl(4, nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_e_gl(4,elec_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_p_g(elec_num,nucl_num,4,0:cord_num, 0:cord_num-1, walk_num)</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> delta_e_gl(3,elec_num)</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> een_rescaled_delta_n, een_re_n, een_re_single_n</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, p, m, n, nw, num</span>
<span style="color: #228b22;">double precision</span>, <span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> tmp(:,:,:)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> LDA, LDB, LDC</span>
num = num_in + 1
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">if</span> (num &lt;= 0) info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) info = QMCKL_INVALID_ARG_5
<span style="color: #a020f0;">if</span> (cord_num &lt; 0) info = QMCKL_INVALID_ARG_6
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">if</span> (cord_num == 0) <span style="color: #a020f0;">then</span>
delta_p_g = 0.d0
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">allocate</span>( tmp(3,nucl_num,0:cord_num) )
<span style="color: #a020f0;">do</span> nw=1, walk_num
<span style="color: #a020f0;">do</span> m=1, cord_num-1
delta_e_gl(1:3,1:elec_num) = een_rescaled_single_e_gl(1:3,1:elec_num,m,nw) - <span style="color: #a020f0;">&amp;</span>
een_rescaled_e_gl(num, 1:3, 1:elec_num, m, nw)
delta_e_gl(1:3,num) = 0.0d0
<span style="color: #a020f0;">call</span> <span style="color: #0000ff;">dgemm</span>(<span style="color: #8b2252;">'N'</span>,<span style="color: #8b2252;">'N'</span>, 3, nucl_num*(cord_num+1), elec_num, 1.d0, <span style="color: #a020f0;">&amp;</span>
delta_e_gl(1,1), 3, een_rescaled_n(1,1,0,nw), elec_num, 0.d0, <span style="color: #a020f0;">&amp;</span>
tmp, 3)
delta_p_g(num,1:nucl_num,1,0:cord_num,m,nw) = tmp(1,1:nucl_num,0:cord_num)
delta_p_g(num,1:nucl_num,2,0:cord_num,m,nw) = tmp(2,1:nucl_num,0:cord_num)
delta_p_g(num,1:nucl_num,3,0:cord_num,m,nw) = tmp(3,1:nucl_num,0:cord_num)
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">deallocate</span>(tmp)
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_delta_p_g_hpc</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_jastrow_champ_delta_p_g_hpc2</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;">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;">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;">een_rescaled_n</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_single_n</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_single_e</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_n_gl</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_e_gl</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_single_n_gl</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_single_e_gl</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">delta_p_g</span> )
{
<span style="color: #a020f0;">if</span> (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">return</span> QMCKL_NULL_CONTEXT;
<span style="color: #a020f0;">if</span> (num &lt; 0) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_2;
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_3;
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_4;
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_5;
<span style="color: #a020f0;">if</span> (cord_num &lt; 0) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_6;
<span style="color: #a020f0;">if</span> (een_rescaled_n == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_7;
<span style="color: #a020f0;">if</span> (een_rescaled_e == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_8;
<span style="color: #a020f0;">if</span> (een_rescaled_single_n == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_9;
<span style="color: #a020f0;">if</span> (een_rescaled_single_e == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_10;
<span style="color: #a020f0;">if</span> (een_rescaled_n_gl == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_11;
<span style="color: #a020f0;">if</span> (een_rescaled_e_gl == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_12;
<span style="color: #a020f0;">if</span> (een_rescaled_single_n_gl == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_13;
<span style="color: #a020f0;">if</span> (een_rescaled_single_e_gl == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_14;
<span style="color: #a020f0;">if</span> (delta_p_g == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_15;
<span style="color: #a020f0;">if</span> (cord_num == 0) {
<span style="color: #483d8b;"> #pragma</span> omp parallel <span style="color: #a020f0;">for</span>
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nw</span>=0 ; nw&lt;walk_num ; ++nw) {
memset(&amp;delta_p_g[elec_num*nucl_num*4*(cord_num+1)*cord_num*nw], 0,
elec_num*nucl_num*4*(cord_num+1)*cord_num*<span style="color: #a020f0;">sizeof</span>(<span style="color: #228b22;">double</span>));
}
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
}
<span style="color: #483d8b;"> #pragma</span> omp parallel <span style="color: #a020f0;">for</span>
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nw</span>=0 ; nw&lt;walk_num ; ++nw) {
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">delta_e_gl</span>[elec_num*4];
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">m</span>=1 ; m&lt;=cord_num-1 ; ++m) {
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_single_e_gl_</span> = &amp;een_rescaled_single_e_gl[4*elec_num*(m+(cord_num+1)*nw)];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_e_gl_</span> = &amp;een_rescaled_e_gl[num+elec_num*4*elec_num*(m+(cord_num+1)*nw)];
<span style="color: #483d8b;"> #pragma</span> omp simd
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">kj</span>=0 ; kj&lt;4*elec_num ; ++kj) {
delta_e_gl[kj] = een_rescaled_single_e_gl_[kj] - een_rescaled_e_gl_[kj+elec_num];
}
<span style="color: #483d8b;"> #pragma</span> omp simd
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">k</span>=0 ; k&lt;4; ++k) {
delta_e_gl[4*num+k] = 0.;
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">l</span>=0 ; l&lt;=cord_num ; ++l) {
<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;">a</span>=0 ; a&lt;nucl_num; ++a) {
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">accu</span> = 0.0;
<span style="color: #483d8b;"> #pragma</span> omp simd
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">i</span>=0 ; i&lt;elec_num ; ++i) {
accu += delta_e_gl[k+4*i] * een_rescaled_n[i+elec_num*(a+nucl_num*(l+(cord_num+1)*nw))];
}
delta_p_g[num+elec_num*(a+nucl_num*(k+4*(l+(cord_num+1)*(m+(cord_num-1+1)*nw))))] = accu;
}
}
}
}
}
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
}
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org9d21d33" class="outline-3">
<h3 id="org9d21d33"><span class="section-number-3">5.10.</span> Electron-electron-nucleus Jastrow gradients</h3>
<div class="outline-text-3" id="text-5-10">
<p>
Computes the gradient of the \(\delta J_{een}\).
</p>
</div>
<div id="outline-container-org6bfa162" class="outline-4">
<h4 id="org6bfa162"><span class="section-number-4">5.10.1.</span> Get</h4>
<div class="outline-text-4" id="text-5-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_champ_single_een_g</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;">delta_een_g</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_get_jastrow_champ_single_een_g</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> delta_een_g, size_max) bind(C)</span>
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<span style="color: #a020f0;">import</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: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>), <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_een_g(size_max)</span>
<span style="color: #a020f0;">end function</span>
<span style="color: #a020f0;">end interface</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org0b4d7cd" class="outline-4">
<h4 id="org0b4d7cd"><span class="section-number-4">5.10.2.</span> Compute</h4>
<div class="outline-text-4" id="text-5-10-2">
<table id="org2a9ab02" 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>num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Index of single electron</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 nuclei</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_c_vector</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>c_vector_full</code></td>
<td class="org-left"><code>double[dim_c_vector][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_c_vector]</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">P matrix</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">P matrix derivative</td>
</tr>
<tr>
<td class="org-left"><code>delta_p</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">Delta P matrix</td>
</tr>
<tr>
<td class="org-left"><code>delta_p_gl</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][4][nucl_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Delta P matrix derivative</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 distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_n</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus single rescaled distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_n_gl</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">Electron-nucleus rescaled distances derivatives</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_single_n_gl</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus single rescaled distances derivatives</td>
</tr>
<tr>
<td class="org-left"><code>delta_een_g</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">Delta electron-electron-nucleus jastrow gradient</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_jastrow_champ_factor_single_een_g_doc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> context, num_in, walk_num, elec_num, nucl_num, cord_num, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> dim_c_vector, c_vector_full, lkpm_combined_index, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> tmp_c, dtmp_c, delta_p, delta_p_gl, een_rescaled_n, een_rescaled_single_n, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> een_rescaled_n_gl, een_rescaled_single_n_gl, delta_een_g) </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> result(info) bind(C)</span>
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<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>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in, walk_num, elec_num, cord_num, nucl_num, dim_c_vector</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> lkpm_combined_index(dim_c_vector,4)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> c_vector_full(nucl_num, dim_c_vector)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</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;">real</span>(<span style="color: #008b8b;">c_double</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;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> delta_p(elec_num, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> delta_p_gl(elec_num, nucl_num, 4, 0:cord_num, 0:cord_num-1, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</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;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n(nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n_gl(elec_num, 4, nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n_gl(4, nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_een_g(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, kk, num</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> accu, accu2, cn</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> LDA, LDB, LDC</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> een_rescaled_delta_n_gl(4, nucl_num, 0:cord_num, walk_num)</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> een_rescaled_delta_n(nucl_num, 0:cord_num, walk_num)</span>
num = num_in + 1
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) info = QMCKL_INVALID_ARG_5
<span style="color: #a020f0;">if</span> (cord_num &lt; 0) info = QMCKL_INVALID_ARG_6
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
delta_een_g = 0.0d0
<span style="color: #a020f0;">if</span> (cord_num == 0) <span style="color: #a020f0;">return</span>
een_rescaled_delta_n(:,:,:) = een_rescaled_single_n(:,:,:) - een_rescaled_n(num, :, :, :)
een_rescaled_delta_n_gl(:,:,:,:) = een_rescaled_single_n_gl(:,:,:,:) - een_rescaled_n_gl(num, :,:,:,:)
<span style="color: #a020f0;">do</span> nw =1, walk_num
<span style="color: #a020f0;">do</span> n = 1, dim_c_vector
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> kk = 1, 3
<span style="color: #a020f0;">do</span> a = 1, nucl_num
cn = c_vector_full(a, n)
<span style="color: #a020f0;">if</span>(cn == 0.d0) <span style="color: #a020f0;">cycle</span>
! <span style="color: #b22222;">delta_een_g(num,kk,nw) = delta_een_g(num,kk,nw) + ( &amp;</span>
! <span style="color: #b22222;">delta_p_gl(num,a,kk,m ,k,nw) * een_rescaled_n(num,a,m+l,nw) + &amp;</span>
! <span style="color: #b22222;">delta_p_gl(num,a,kk,m+l,k,nw) * een_rescaled_n(num,a,m ,nw) + &amp;</span>
! <span style="color: #b22222;">delta_p(num,a,m ,k,nw) * een_rescaled_n_gl(num,kk,a,m+l,nw) + &amp;</span>
! <span style="color: #b22222;">delta_p(num,a,m+l,k,nw) * een_rescaled_n_gl(num,kk,a,m ,nw) ) * cn</span>
!<span style="color: #b22222;">delta_een_g(num,kk,nw) = delta_een_g(num,kk,nw) + ( &amp;</span>
! <span style="color: #b22222;">(dtmp_c(num,kk,a,m ,k,nw) + delta_p_gl(num,a,kk,m ,k,nw)) * een_rescaled_delta_n(a,m+l,nw) + &amp;</span>
! <span style="color: #b22222;">(dtmp_c(num,kk,a,m+l,k,nw) + delta_p_gl(num,a,kk,m+l,k,nw)) * een_rescaled_delta_n(a,m ,nw) + &amp;</span>
! <span style="color: #b22222;">(tmp_c(num,a,m ,k,nw) + delta_p(num,a,m ,k,nw)) * een_rescaled_delta_n_gl(kk,a,m+l,nw) + &amp;</span>
! <span style="color: #b22222;">(tmp_c(num,a,m+l,k,nw) + delta_p(num,a,m+l,k,nw)) * een_rescaled_delta_n_gl(kk,a,m ,nw) )* cn</span>
delta_een_g(num,kk,nw) = delta_een_g(num,kk,nw) + ( <span style="color: #a020f0;">&amp;</span>
dtmp_c(num,kk,a,m ,k,nw) * een_rescaled_delta_n(a,m+l,nw) + <span style="color: #a020f0;">&amp;</span>
dtmp_c(num,kk,a,m+l,k,nw) * een_rescaled_delta_n(a,m ,nw) + <span style="color: #a020f0;">&amp;</span>
tmp_c(num,a,m ,k,nw) * een_rescaled_delta_n_gl(kk,a,m+l,nw) + <span style="color: #a020f0;">&amp;</span>
tmp_c(num,a,m+l,k,nw) * een_rescaled_delta_n_gl(kk,a,m ,nw) + <span style="color: #a020f0;">&amp;</span>
delta_p_gl(num,a,kk,m ,k,nw) * een_rescaled_single_n(a,m+l,nw) + <span style="color: #a020f0;">&amp;</span>
delta_p_gl(num,a,kk,m+l,k,nw) * een_rescaled_single_n(a,m ,nw) + <span style="color: #a020f0;">&amp;</span>
delta_p(num,a,m ,k,nw) * een_rescaled_single_n_gl(kk,a,m+l,nw) + <span style="color: #a020f0;">&amp;</span>
delta_p(num,a,m+l,k,nw) * een_rescaled_single_n_gl(kk,a,m ,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_jastrow_champ_factor_single_een_g_doc</span>
</pre>
</div>
</div>
</div>
</div>
</div>
<div id="outline-container-orgb148091" class="outline-2">
<h2 id="orgb148091"><span class="section-number-2">6.</span> Electron-electron Jastrow</h2>
<div class="outline-text-2" id="text-6">
<p>
Calculates the single-electron move contribution to the \(J_{ee}\) Jastrow factor.
Similar to the 3-body case above, we need to compute the single-electron contributions to the rescaled distances.
The rescaled electron-electron distance for the 2-body term is defined as
\[
\widetilde{r}_{ij} = \frac{1-e^{-\kappa r_{ij}}}{\kappa}.
\]
For the electron-electro Jastrow, no intermediate terms have to be calculated, as we can immidiatly calculate
\[
\delta J_{ee} = \sum_i \sum_{j\lt i} \delta_{j,\text{num}} \left(\frac{b_1 \widetilde{r}_{ij}^{\text{new}}}{1+b_2 \widetilde{r}_{ij}^{\text{new}}} - \frac{b_1 \widetilde{r}_{ij}^{\text{old}}}{1+b_2 \widetilde{r}_{ij}^{\text{old}}} + \sum_{k=2}^{N_{\text{bord}}} b_k ({\widetilde{r}_{ij}^{\text{new}}}^k - {\widetilde{r}_{ij}^{\text{old}}}^k )\right),
\]
where num is the electron that is being moved.
The gradient and Laplacian of the rescaled distances are given by
\[
\partial_{i,m} \widetilde{r}_{ij} = \frac{r_{i,m} - r_{j,m}}{r_{ij}} e^{-\kappa r_{ij}} \quad \text{and} \quad \partial_{i,4} \widetilde{r}_{ij} = \left(\frac{2}{r_{ij}} - \kappa \right)e^{-\kappa r_{ij}}
\]
Then,
</p>
\begin{eqnarray*}
\partial_{i,m}\delta J_{ee} = & \sum_j \delta_{j,\text{num}} \left( \frac{b_1 \partial_{i,m}\widetilde{r}^{\text{new}}_{ij}}{(1+b_2 \widetilde{r}^{\text{new}}_{ij})^2} - \frac{b_1 \partial_{i,m}\widetilde{r}^{\text{old}}_{ij}}{(1+b_2 \widetilde{r}^{\text{old}}_{ij})^2} + \sum_{k=2}^{N_{\text{bord}}} b_k k \left({\widetilde{r}_{ij}^{\text{new}}}^{k-1} \partial_{i,m}\widetilde{r}^{\text{new}}_{ij} - {\widetilde{r}_{ij}^{\text{old}}}^{k-1} \partial_{i,m}\widetilde{r}^{\text{old}}_{ij} \right) \right)\\
\partial_{i,4}\delta J_{ee} = & \sum_j \delta_{j,\text{num}} \left( \frac{b_1}{(1+b_2 \widetilde{r}^{\text{new}}_{ij})^2} \left(\partial_{i,4}\widetilde{r}^{\text{new}}_{ij} - 2 b_2 \frac{\nabla\widetilde{r}^{\text{new}}_{ij} \cdot \nabla \widetilde{r}^{\text{new}}_{ij}}{1+b_2 \widetilde{r}^{\text{new}}_{ij}} \right) - \frac{b_1}{(1+b_2 \widetilde{r}^{\text{old}}_{ij})^2} \left(\partial_{i,4}\widetilde{r}^{\text{old}}_{ij} - 2 b_2 \frac{\nabla\widetilde{r}^{\text{old}}_{ij} \cdot \nabla \widetilde{r}^{\text{old}}_{ij}}{1+b_2 \widetilde{r}^{\text{old}}_{ij}} \right) \right.\\
& \left.+ \sum_{k=2}^{N_{\text{bord}}} b_k k \left({\widetilde{r}_{ij}^{\text{new}}}^{k-1}\partial_{i,4}\widetilde{r}_{ij}^{\text{new}} + (k-1)(\nabla\widetilde{r}_{ij}^{\text{new}} \cdot \nabla \widetilde{r}_{ij}^{\text{new}}) {\widetilde{r}_{ij}^{\text{new}}}^{k-2} - {\widetilde{r}_{ij}^{\text{old}}}^{k-1}\partial_{i,4}\widetilde{r}_{ij}^{\text{old}} - (k-1)(\nabla\widetilde{r}_{ij}^{\text{old}} \cdot \nabla \widetilde{r}_{ij}^{\text{old}}) {\widetilde{r}_{ij}^{\text{old}}}^{k-2} \right) \right)
\end{eqnarray*}
<p>
In the special case that \(i = \text{num}\), the gradient and Laplacian change to
</p>
\begin{eqnarray*}
\partial_{\text{num},m}\delta J_{ee} = & -\sum_i \sum_j \delta_{j,\text{num}} \left(\frac{b_1 \partial_{i,m}\widetilde{r}^{\text{new}}_{ij}}{(1+b_2 \widetilde{r}^{\text{new}}_{ij})^2} - \frac{b_1 \partial_{i,m}\widetilde{r}^{\text{old}}_{ij}}{(1+b_2 \widetilde{r}^{\text{old}}_{ij})^2} + \sum_{k=2}^{N_{\text{bord}}} b_k k \left({\widetilde{r}_{ij}^{\text{new}}}^{k-1} \partial_{i,m}\widetilde{r}^{\text{new}}_{ij} - {\widetilde{r}_{ij}^{\text{old}}}^{k-1} \partial_{i,m}\widetilde{r}^{\text{old}}_{ij} \right) \right) \\
\partial_{\text{num},4}\delta J_{ee} = & -\sum_i \sum_j \delta_{j,\text{num}} \left( \frac{b_1}{(1+b_2 \widetilde{r}^{\text{new}}_{ij})^2} \left(\partial_{i,4}\widetilde{r}^{\text{new}}_{ij} - 2 b_2 \frac{\nabla\widetilde{r}^{\text{new}}_{ij} \cdot \nabla \widetilde{r}^{\text{new}}_{ij}}{1+b_2 \widetilde{r}^{\text{new}}_{ij}} \right) - \frac{b_1}{(1+b_2 \widetilde{r}^{\text{old}}_{ij})^2} \left(\partial_{i,4}\widetilde{r}^{\text{old}}_{ij} - 2 b_2 \frac{\nabla\widetilde{r}^{\text{old}}_{ij} \cdot \nabla \widetilde{r}^{\text{old}}_{ij}}{1+b_2 \widetilde{r}^{\text{old}}_{ij}} \right)\right. \\
& \left. + \sum_{k=2}^{N_{\text{bord}}} b_k k \left({\widetilde{r}_{ij}^{\text{new}}}^{k-1}\partial_{i,4}\widetilde{r}_{ij}^{\text{new}} + (k-1)(\nabla\widetilde{r}_{ij}^{\text{new}} \cdot \nabla \widetilde{r}_{ij}^{\text{new}}) {\widetilde{r}_{ij}^{\text{new}}}^{k-2} - {\widetilde{r}_{ij}^{\text{old}}}^{k-1}\partial_{i,4}\widetilde{r}_{ij}^{\text{old}} - (k-1)(\nabla\widetilde{r}_{ij}^{\text{old}} \cdot \nabla \widetilde{r}_{ij}^{\text{old}}) {\widetilde{r}_{ij}^{\text{old}}}^{k-2} \right) \right)
\end{eqnarray*}
</div>
<div id="outline-container-org8f52cee" class="outline-3">
<h3 id="org8f52cee"><span class="section-number-3">6.1.</span> Electron-electron rescaled distance</h3>
<div class="outline-text-3" id="text-6-1">
<p>
Calculates the rescaled electron-electron distances
\[
\widetilde{r}_{ij} = \frac{1-e^{-\kappa r_{ij}}}{\kappa}.
\]
</p>
</div>
<div id="outline-container-org14f5b44" class="outline-4">
<h4 id="org14f5b44"><span class="section-number-4">6.1.1.</span> Get</h4>
<div class="outline-text-4" id="text-6-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_ee_rescaled_single</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-orgec8117b" class="outline-4">
<h4 id="orgec8117b"><span class="section-number-4">6.1.2.</span> Compute</h4>
<div class="outline-text-4" id="text-6-1-2">
<table id="org1593c32" 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>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>rescale_factor_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>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>single_ee_distance</code></td>
<td class="org-left"><code>double[walk_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Single electron-electron distances</td>
</tr>
<tr>
<td class="org-left"><code>ee_rescaled_single</code></td>
<td class="org-left"><code>double[walk_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: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_ee_rescaled_single_doc</span>(context, <span style="color: #a020f0;">&amp;</span>
elec_num, rescale_factor_ee, walk_num, <span style="color: #a020f0;">&amp;</span>
single_ee_distance, ee_rescaled_single) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">bind</span>(C) <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: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> rescale_factor_ee</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> single_ee_distance(elec_num,walk_num)</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> ee_rescaled_single(elec_num,walk_num)</span>
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> k, i</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span>) ::<span style="color: #a0522d;"> inverse_rescale_factor_ee</span>
inverse_rescale_factor_ee = 1.0d0 / rescale_factor_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> (elec_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> (walk_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;">do</span> k=1,walk_num
<span style="color: #a020f0;">do</span> i=1,elec_num
ee_rescaled_single(i,k) = (1.0d0 - dexp(-rescale_factor_ee * single_ee_distance(i,k))) * inverse_rescale_factor_ee
<span style="color: #a020f0;">enddo</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_ee_rescaled_single_doc</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org2557842" class="outline-3">
<h3 id="org2557842"><span class="section-number-3">6.2.</span> Electron-electron Jastrow value</h3>
<div class="outline-text-3" id="text-6-2">
<p>
Calculate the single-electron move contribution to the \(J_{ee}\) Jastrow factor.
\[
\delta J_{ee} = \sum_i \sum_{j\lt i} \delta_{j,\text{num}} \left(\frac{b_1 \widetilde{r}_{ij}^{\text{new}}}{1+b_2 \widetilde{r}_{ij}^{\text{new}}} - \frac{b_1 \widetilde{r}_{ij}^{\text{old}}}{1+b_2 \widetilde{r}_{ij}^{\text{old}}} + \sum_{k=2}^{N_{\text{bord}}} b_k ({\widetilde{r}_{ij}^{\text{new}}}^k - {\widetilde{r}_{ij}^{\text{old}}}^k )\right),
\]
</p>
</div>
<div id="outline-container-org4c240d5" class="outline-4">
<h4 id="org4c240d5"><span class="section-number-4">6.2.1.</span> Get</h4>
<div class="outline-text-4" id="text-6-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_champ_single_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;">delta_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 class="org-src-container">
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_get_jastrow_champ_single_ee</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> delta_ee, size_max) bind(C)</span>
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<span style="color: #a020f0;">import</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: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>), <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_ee(size_max)</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_jastrow_champ_single_ee</span>
<span style="color: #a020f0;">end interface</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org333e3fe" class="outline-4">
<h4 id="org333e3fe"><span class="section-number-4">6.2.2.</span> Compute</h4>
<div class="outline-text-4" id="text-6-2-2">
<table id="org607fa0a" 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>num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Index of single point</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>b_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 rescaled distances</td>
</tr>
<tr>
<td class="org-left"><code>ee_rescaled_single</code></td>
<td class="org-left"><code>double[walk_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-electron rescaled single distances</td>
</tr>
<tr>
<td class="org-left"><code>delta_ee</code></td>
<td class="org-left"><code>double[walk_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Single electron-electron Jastrow</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_single_ee_doc</span>(context, <span style="color: #a020f0;">&amp;</span>
num_in, walk_num, elec_num, up_num, bord_num, b_vector, <span style="color: #a020f0;">&amp;</span>
ee_distance_rescaled, ee_rescaled_single, spin_independent, delta_ee) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">bind</span>(C) <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: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> up_num</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> bord_num</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> b_vector(bord_num+1)</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</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;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> ee_rescaled_single(elec_num,walk_num)</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int32_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> spin_independent</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_ee(walk_num)</span>
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, j, k, nw, num</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, xk, y, yk</span>
num = num_in + 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_3
<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_4
<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_5
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">do</span> nw =1, walk_num
delta_ee(nw) = 0.0d0
<span style="color: #a020f0;">do</span> i=1,elec_num
!<span style="color: #b22222;">print *,i, ee_rescaled_single(i,nw)</span>
!<span style="color: #b22222;">print *, i, ee_distance_rescaled(i,num,nw)</span>
!<span style="color: #b22222;">print *, ' '</span>
<span style="color: #a020f0;">if</span> (i<span style="color: #a020f0;">.ne.</span>num) <span style="color: #a020f0;">then</span>
x = ee_distance_rescaled(i,num,nw)
y = ee_rescaled_single(i,nw)
<span style="color: #a020f0;">if</span> (spin_independent == 1) <span style="color: #a020f0;">then</span>
delta_ee(nw) = delta_ee(nw) - (b_vector(1) * x / (1.d0 + b_vector(2) * x)) <span style="color: #a020f0;">&amp;</span>
+ (b_vector(1) * y / (1.d0 + b_vector(2) * y))
<span style="color: #a020f0;">else</span>
<span style="color: #a020f0;">if</span> ((i &lt;= up_num <span style="color: #a020f0;">.and.</span> num &lt;= up_num ) <span style="color: #a020f0;">.or.</span> (i &gt; up_num <span style="color: #a020f0;">.and.</span> num &gt; up_num)) <span style="color: #a020f0;">then</span>
delta_ee(nw) = delta_ee(nw) - (0.5d0 * b_vector(1) * x / (1.d0 + b_vector(2) * x)) <span style="color: #a020f0;">&amp;</span>
+ (0.5d0 * b_vector(1) * y / (1.d0 + b_vector(2) * y))
<span style="color: #a020f0;">else</span>
delta_ee(nw) = delta_ee(nw) - (b_vector(1) * x / (1.d0 + b_vector(2) * x)) <span style="color: #a020f0;">&amp;</span>
+ (b_vector(1) * y / (1.d0 + b_vector(2) * y))
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">endif</span>
xk = x
yk = y
<span style="color: #a020f0;">do</span> k=2,bord_num
xk = xk * x
yk = yk * y
delta_ee(nw) = delta_ee(nw) - (b_vector(k+1) * xk) + (b_vector(k+1) * yk)
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">endif</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_jastrow_champ_single_ee_doc</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org1e40ea1" class="outline-3">
<h3 id="org1e40ea1"><span class="section-number-3">6.3.</span> Electron-electron rescaled distances derivatives</h3>
<div class="outline-text-3" id="text-6-3">
<p>
Calculate the derivative of the rescaled electron-electron distances.
\[
\partial_{i,m} \widetilde{r}_{ij} = \frac{r_{i,m} - r_{j,m}}{r_{ij}} e^{-\kappa r_{ij}} \quad \text{and} \quad \partial_{i,4} \widetilde{r}_{ij} = \left(\frac{2}{r_{ij}} - \kappa \right)e^{-\kappa r_{ij}}
\]
</p>
</div>
<div id="outline-container-orged85a72" class="outline-4">
<h4 id="orged85a72"><span class="section-number-4">6.3.1.</span> Get</h4>
<div class="outline-text-4" id="text-6-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_ee_rescaled_single_gl</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_gl</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-orgf4511b4" class="outline-4">
<h4 id="orgf4511b4"><span class="section-number-4">6.3.2.</span> Compute</h4>
<div class="outline-text-4" id="text-6-3-2">
<table id="orgc0e8a09" 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>num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Index of single electron</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>rescale_factor_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>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>single_ee_distance</code></td>
<td class="org-left"><code>double[elec_num][walk_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Single electron-electron distances</td>
</tr>
<tr>
<td class="org-left"><code>elec_coord</code></td>
<td class="org-left"><code>double[3][walk_num][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[walk_num][3]</code></td>
<td class="org-left">in</td>
<td class="org-left">Single electron coordinates</td>
</tr>
<tr>
<td class="org-left"><code>ee_rescaled_single_gl</code></td>
<td class="org-left"><code>double[walk_num][elec_num][4]</code></td>
<td class="org-left">out</td>
<td class="org-left">Electron-electron rescaled single distance derivatives</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_ee_rescaled_single_gl_doc</span>(context, num_in, <span style="color: #a020f0;">&amp;</span>
elec_num, rescale_factor_ee, walk_num, single_ee_distance, elec_coord, coord, ee_rescaled_single_gl) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">bind</span>(C) <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: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> rescale_factor_ee</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> single_ee_distance(elec_num,walk_num)</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> elec_coord(elec_num,walk_num,3)</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coord(3,walk_num)</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> ee_rescaled_single_gl(4,elec_num,walk_num)</span>
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> nw, i, ii, num</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> rij_inv, elel_dist_gl(4, elec_num), kappa_l</span>
num = num_in + 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> (elec_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> (walk_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>
ee_rescaled_single_gl = 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> i = 1, elec_num
rij_inv = 1.0d0 / single_ee_distance(i, nw)
<span style="color: #a020f0;">do</span> ii = 1, 3
elel_dist_gl(ii, i) = (elec_coord(i,nw, ii) - coord(ii,nw)) * rij_inv
<span style="color: #a020f0;">end do</span>
elel_dist_gl(4, i) = 2.0d0 * rij_inv
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">do</span> i = 1, elec_num
kappa_l = -1 * rescale_factor_ee
ee_rescaled_single_gl(1, i, nw) = elel_dist_gl(1, i)
ee_rescaled_single_gl(2, i, nw) = elel_dist_gl(2, i)
ee_rescaled_single_gl(3, i, nw) = elel_dist_gl(3, i)
ee_rescaled_single_gl(4, i, nw) = elel_dist_gl(4, i)
ee_rescaled_single_gl(4, i, nw) = ee_rescaled_single_gl(4, i, nw) + kappa_l
ee_rescaled_single_gl(1, i, nw) = ee_rescaled_single_gl(1, i, nw) * dexp(kappa_l * single_ee_distance(i,nw))
ee_rescaled_single_gl(2, i, nw) = ee_rescaled_single_gl(2, i, nw) * dexp(kappa_l * single_ee_distance(i,nw))
ee_rescaled_single_gl(3, i, nw) = ee_rescaled_single_gl(3, i, nw) * dexp(kappa_l * single_ee_distance(i,nw))
ee_rescaled_single_gl(4, i, nw) = ee_rescaled_single_gl(4, i, nw) * dexp(kappa_l * single_ee_distance(i,nw))
<span style="color: #a020f0;">end do</span>
ee_rescaled_single_gl(1, num, nw) = 0.0d0
ee_rescaled_single_gl(2, num, nw) = 0.0d0
ee_rescaled_single_gl(3, num, nw) = 0.0d0
ee_rescaled_single_gl(4, num, nw) = 0.0d0
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_ee_rescaled_single_gl_doc</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org0ce7313" class="outline-3">
<h3 id="org0ce7313"><span class="section-number-3">6.4.</span> Electron-electron Jastrow gradients and Laplacian</h3>
<div class="outline-text-3" id="text-6-4">
<p>
Calculates the gradient and Laplacian of the electron-electron Jastrow factor.
</p>
\begin{eqnarray*}
\partial_{i,m}\delta J_{ee} = & \sum_j \delta_{j,\text{num}} \left( \frac{b_1 \partial_{i,m}\widetilde{r}^{\text{new}}_{ij}}{(1+b_2 \widetilde{r}^{\text{new}}_{ij})^2} - \frac{b_1 \partial_{i,m}\widetilde{r}^{\text{old}}_{ij}}{(1+b_2 \widetilde{r}^{\text{old}}_{ij})^2} + \sum_{k=2}^{N_{\text{bord}}} b_k k \left({\widetilde{r}_{ij}^{\text{new}}}^{k-1} \partial_{i,m}\widetilde{r}^{\text{new}}_{ij} - {\widetilde{r}_{ij}^{\text{old}}}^{k-1} \partial_{i,m}\widetilde{r}^{\text{old}}_{ij} \right) \right)\\
\partial_{i,4}\delta J_{ee} = & \sum_j \delta_{j,\text{num}} \left( \frac{b_1}{(1+b_2 \widetilde{r}^{\text{new}}_{ij})^2} \left(\partial_{i,4}\widetilde{r}^{\text{new}}_{ij} - 2 b_2 \frac{\nabla\widetilde{r}^{\text{new}}_{ij} \cdot \nabla \widetilde{r}^{\text{new}}_{ij}}{1+b_2 \widetilde{r}^{\text{new}}_{ij}} \right) - \frac{b_1}{(1+b_2 \widetilde{r}^{\text{old}}_{ij})^2} \left(\partial_{i,4}\widetilde{r}^{\text{old}}_{ij} - 2 b_2 \frac{\nabla\widetilde{r}^{\text{old}}_{ij} \cdot \nabla \widetilde{r}^{\text{old}}_{ij}}{1+b_2 \widetilde{r}^{\text{old}}_{ij}} \right) \right.\\
& \left.+ \sum_{k=2}^{N_{\text{bord}}} b_k k \left({\widetilde{r}_{ij}^{\text{new}}}^{k-1}\partial_{i,4}\widetilde{r}_{ij}^{\text{new}} + (k-1)(\nabla\widetilde{r}_{ij}^{\text{new}} \cdot \nabla \widetilde{r}_{ij}^{\text{new}}) {\widetilde{r}_{ij}^{\text{new}}}^{k-2} - {\widetilde{r}_{ij}^{\text{old}}}^{k-1}\partial_{i,4}\widetilde{r}_{ij}^{\text{old}} - (k-1)(\nabla\widetilde{r}_{ij}^{\text{old}} \cdot \nabla \widetilde{r}_{ij}^{\text{old}}) {\widetilde{r}_{ij}^{\text{old}}}^{k-2} \right) \right)
\end{eqnarray*}
<p>
In the special case that \(i = \text{num}\), the gradient and Laplacian change to
</p>
\begin{eqnarray*}
\partial_{\text{num},m}\delta J_{ee} = & -\sum_i \sum_j \delta_{j,\text{num}} \left(\frac{b_1 \partial_{i,m}\widetilde{r}^{\text{new}}_{ij}}{(1+b_2 \widetilde{r}^{\text{new}}_{ij})^2} - \frac{b_1 \partial_{i,m}\widetilde{r}^{\text{old}}_{ij}}{(1+b_2 \widetilde{r}^{\text{old}}_{ij})^2} + \sum_{k=2}^{N_{\text{bord}}} b_k k \left({\widetilde{r}_{ij}^{\text{new}}}^{k-1} \partial_{i,m}\widetilde{r}^{\text{new}}_{ij} - {\widetilde{r}_{ij}^{\text{old}}}^{k-1} \partial_{i,m}\widetilde{r}^{\text{old}}_{ij} \right) \right) \\
\partial_{\text{num},4}\delta J_{ee} = & -\sum_i \sum_j \delta_{j,\text{num}} \left( \frac{b_1}{(1+b_2 \widetilde{r}^{\text{new}}_{ij})^2} \left(\partial_{i,4}\widetilde{r}^{\text{new}}_{ij} - 2 b_2 \frac{\nabla\widetilde{r}^{\text{new}}_{ij} \cdot \nabla \widetilde{r}^{\text{new}}_{ij}}{1+b_2 \widetilde{r}^{\text{new}}_{ij}} \right) - \frac{b_1}{(1+b_2 \widetilde{r}^{\text{old}}_{ij})^2} \left(\partial_{i,4}\widetilde{r}^{\text{old}}_{ij} - 2 b_2 \frac{\nabla\widetilde{r}^{\text{old}}_{ij} \cdot \nabla \widetilde{r}^{\text{old}}_{ij}}{1+b_2 \widetilde{r}^{\text{old}}_{ij}} \right)\right. \\
& \left. + \sum_{k=2}^{N_{\text{bord}}} b_k k \left({\widetilde{r}_{ij}^{\text{new}}}^{k-1}\partial_{i,4}\widetilde{r}_{ij}^{\text{new}} + (k-1)(\nabla\widetilde{r}_{ij}^{\text{new}} \cdot \nabla \widetilde{r}_{ij}^{\text{new}}) {\widetilde{r}_{ij}^{\text{new}}}^{k-2} - {\widetilde{r}_{ij}^{\text{old}}}^{k-1}\partial_{i,4}\widetilde{r}_{ij}^{\text{old}} - (k-1)(\nabla\widetilde{r}_{ij}^{\text{old}} \cdot \nabla \widetilde{r}_{ij}^{\text{old}}) {\widetilde{r}_{ij}^{\text{old}}}^{k-2} \right) \right)
\end{eqnarray*}
</div>
<div id="outline-container-org9538621" class="outline-4">
<h4 id="org9538621"><span class="section-number-4">6.4.1.</span> Get</h4>
<div class="outline-text-4" id="text-6-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_champ_single_ee_gl</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;">delta_ee_gl</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_get_jastrow_champ_single_ee_gl</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> delta_ee_gl, size_max) bind(C)</span>
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<span style="color: #a020f0;">import</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: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>), <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_ee_gl(size_max)</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_jastrow_champ_single_ee_gl</span>
<span style="color: #a020f0;">end interface</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgc134e8b" class="outline-4">
<h4 id="orgc134e8b"><span class="section-number-4">6.4.2.</span> Compute</h4>
<div class="outline-text-4" id="text-6-4-2">
<table id="org986be29" 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>num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Index of single electron</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>b_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 rescaled distances</td>
</tr>
<tr>
<td class="org-left"><code>ee_distance_rescaled_gl</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 rescaled distances derivatives</td>
</tr>
<tr>
<td class="org-left"><code>ee_rescaled_single</code></td>
<td class="org-left"><code>double[walk_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-electron rescaled single distances</td>
</tr>
<tr>
<td class="org-left"><code>ee_rescaled_single_gl</code></td>
<td class="org-left"><code>double[walk_num][4][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-electron rescaled single distances derivatives</td>
</tr>
<tr>
<td class="org-left"><code>spin_independent</code></td>
<td class="org-left"><code>int32_t</code></td>
<td class="org-left">in</td>
<td class="org-left">If 1, same parameters for parallel and antiparallel spins</td>
</tr>
<tr>
<td class="org-left"><code>delta_ee_gl</code></td>
<td class="org-left"><code>double[walk_num][elec_num][4]</code></td>
<td class="org-left">out</td>
<td class="org-left">Single electron-electron jastrow gradients and Laplacian</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_single_ee_gl_doc</span>( <span style="color: #a020f0;">&amp;</span>
context, num_in, walk_num, elec_num, up_num, bord_num, <span style="color: #a020f0;">&amp;</span>
b_vector, ee_distance_rescaled, ee_distance_rescaled_gl, <span style="color: #a020f0;">&amp;</span>
ee_rescaled_single, ee_rescaled_single_gl, <span style="color: #a020f0;">&amp;</span>
spin_independent, delta_ee_gl) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">bind</span>(C) <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: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> up_num</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> bord_num</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> b_vector(bord_num+1)</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</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;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> ee_distance_rescaled_gl(4,elec_num,elec_num,walk_num)</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> ee_rescaled_single(elec_num,walk_num)</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> ee_rescaled_single_gl(4,elec_num,walk_num)</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int32_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> spin_independent</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_ee_gl(4,elec_num,walk_num)</span>
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, j, k, nw, ii, num</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, x1, kf, x_old, x1_old</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> denom, invdenom, invdenom2, f</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> denom_old, invdenom_old, invdenom2_old, f_old</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> grad_c2, grad_c2_old</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> dx(4), dx_old(4)</span>
num = num_in + 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_3
<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_4
<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_5
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> ((spin_independent &lt; 0)<span style="color: #a020f0;">.or.</span>(spin_independent &gt; 1)) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_8
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">do</span> nw =1, walk_num
delta_ee_gl(:,:,nw) = 0.0d0
<span style="color: #a020f0;">do</span> i = 1, elec_num
<span style="color: #a020f0;">if</span> (i == num) <span style="color: #a020f0;">cycle</span>
x = ee_rescaled_single(i,nw)
x_old = ee_distance_rescaled(i,num,nw)
denom = 1.0d0 + b_vector(2) * x
invdenom = 1.0d0 / denom
invdenom2 = invdenom * invdenom
denom_old = 1.0d0 + b_vector(2) * x_old
invdenom_old = 1.0d0 / denom_old
invdenom2_old = invdenom_old * invdenom_old
dx(1) = ee_rescaled_single_gl(1, i, nw)
dx(2) = ee_rescaled_single_gl(2, i, nw)
dx(3) = ee_rescaled_single_gl(3, i, nw)
dx(4) = ee_rescaled_single_gl(4, i, nw)
dx_old(1) = ee_distance_rescaled_gl(1, i, num, nw)
dx_old(2) = ee_distance_rescaled_gl(2, i, num, nw)
dx_old(3) = ee_distance_rescaled_gl(3, i, num, nw)
dx_old(4) = ee_distance_rescaled_gl(4, i, num, nw)
grad_c2 = dx(1)*dx(1) + dx(2)*dx(2) + dx(3)*dx(3)
grad_c2_old = dx_old(1)*dx_old(1) + dx_old(2)*dx_old(2) + dx_old(3)*dx_old(3)
<span style="color: #a020f0;">if</span> (spin_independent == 1) <span style="color: #a020f0;">then</span>
f = b_vector(1) * invdenom2
f_old = b_vector(1) * invdenom2_old
<span style="color: #a020f0;">else</span>
<span style="color: #a020f0;">if</span>((i &lt;= up_num <span style="color: #a020f0;">.and.</span> num &lt;= up_num ) <span style="color: #a020f0;">.or.</span> (i &gt; up_num <span style="color: #a020f0;">.and.</span> num &gt; up_num)) <span style="color: #a020f0;">then</span>
f = 0.5d0 * b_vector(1) * invdenom2
f_old = 0.5d0 * b_vector(1) * invdenom2_old
<span style="color: #a020f0;">else</span>
f = b_vector(1) * invdenom2
f_old = b_vector(1) * invdenom2_old
<span style="color: #a020f0;">end if</span>
<span style="color: #a020f0;">end if</span>
delta_ee_gl(1,i,nw) = delta_ee_gl(1,i,nw) + f * dx(1) - f_old * dx_old(1)
delta_ee_gl(2,i,nw) = delta_ee_gl(2,i,nw) + f * dx(2) - f_old * dx_old(2)
delta_ee_gl(3,i,nw) = delta_ee_gl(3,i,nw) + f * dx(3) - f_old * dx_old(3)
delta_ee_gl(4,i,nw) = delta_ee_gl(4,i,nw) <span style="color: #a020f0;">&amp;</span>
+ f * (dx(4) - 2.d0 * b_vector(2) * grad_c2 * invdenom) <span style="color: #a020f0;">&amp;</span>
- f_old * (dx_old(4) - 2.d0 * b_vector(2) * grad_c2_old * invdenom_old)
delta_ee_gl(1,num,nw) = delta_ee_gl(1,num,nw) - f * dx(1) + f_old * dx_old(1)
delta_ee_gl(2,num,nw) = delta_ee_gl(2,num,nw) - f * dx(2) + f_old * dx_old(2)
delta_ee_gl(3,num,nw) = delta_ee_gl(3,num,nw) - f * dx(3) + f_old * dx_old(3)
delta_ee_gl(4,num,nw) = delta_ee_gl(4,num,nw) <span style="color: #a020f0;">&amp;</span>
+ f * (dx(4) - 2.d0 * b_vector(2) * grad_c2 * invdenom) <span style="color: #a020f0;">&amp;</span>
- f_old * (dx_old(4) - 2.d0 * b_vector(2) * grad_c2_old * invdenom_old)
kf = 2.d0
x1 = x
x1_old = x_old
x = 1.d0
x_old = 1.d0
<span style="color: #a020f0;">do</span> k=2, bord_num
f = b_vector(k+1) * kf * x
f_old = b_vector(k+1) * kf * x_old
delta_ee_gl(1,i,nw) = delta_ee_gl(1,i,nw) + f * x1 * dx(1) - f_old * x1_old * dx_old(1)
delta_ee_gl(2,i,nw) = delta_ee_gl(2,i,nw) + f * x1 * dx(2) - f_old * x1_old * dx_old(2)
delta_ee_gl(3,i,nw) = delta_ee_gl(3,i,nw) + f * x1 * dx(3) - f_old * x1_old * dx_old(3)
delta_ee_gl(4,i,nw) = delta_ee_gl(4,i,nw) <span style="color: #a020f0;">&amp;</span>
+ f * (x1 * dx(4) + (kf-1.d0) * grad_c2) <span style="color: #a020f0;">&amp;</span>
- f_old * (x1_old * dx_old(4) + (kf-1.d0) * grad_c2_old)
delta_ee_gl(1,num,nw) = delta_ee_gl(1,num,nw) - f * x1 * dx(1) + f_old * x1_old * dx_old(1)
delta_ee_gl(2,num,nw) = delta_ee_gl(2,num,nw) - f * x1 * dx(2) + f_old * x1_old * dx_old(2)
delta_ee_gl(3,num,nw) = delta_ee_gl(3,num,nw) - f * x1 * dx(3) + f_old * x1_old * dx_old(3)
delta_ee_gl(4,num,nw) = delta_ee_gl(4,num,nw) <span style="color: #a020f0;">&amp;</span>
+ f * (x1 * dx(4) + (kf-1.d0) * grad_c2) <span style="color: #a020f0;">&amp;</span>
- f_old * (x1_old * dx_old(4) + (kf-1.d0) * grad_c2_old)
x = x*x1
x_old = x_old*x1_old
kf = kf + 1.d0
<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_jastrow_champ_single_ee_gl_doc</span>
</pre>
</div>
</div>
</div>
</div>
</div>
<div id="outline-container-orgbf0e336" class="outline-2">
<h2 id="orgbf0e336"><span class="section-number-2">7.</span> Electron-nucleus Jastrow</h2>
<div class="outline-text-2" id="text-7">
<p>
Here we calculate the single-electron move contribution to the \(J_{en}\) Jastrow factor.
First, we need to compute the single-electron contributions to the rescaled distances.
The rescaled electron-electron distance for the 2-body term is defined as
\[
\widetilde{R}_{i\alpha} = \frac{1-e^{-\kappa R_{i\alpha}}}{\kappa}.
\]
For the electron-nucleus Jastrow, no intermediate terms have to be calculated, as we can immidiatly calculate
\[
\delta J_{en} = \sum_i \delta_{i,\text{num}} \left( \frac{a_1 \widetilde{R}_{i\alpha}^{\text{new}}}{1+a_2 \widetilde{R}_{i\alpha}^{\text{new}}} - \frac{a_1 \widetilde{R}_{i\alpha}^{\text{old}}}{1+a_2 \widetilde{R}_{i\alpha}^{\text{old}}} + \sum_{k=2}^{N_\text{aord}} a_k\left({\widetilde{R}_{i\alpha}^{\text{new}}}^k - {\widetilde{R}_{i\alpha}^{\text{old}}}^k \right)\right)
\]
where num is the electron that is being moved.
The gradient and Laplacian of the rescaled distances are given by
\[
\partial_{i,m} \widetilde{R}_{i\alpha} = \frac{r_{i,m} - R_{\alpha,m}}{R_{i\alpha}} e^{-\kappa R_{i\alpha}} \quad \text{and} \quad \partial_{i,4} \widetilde{R}_{i\alpha} = \left(\frac{2}{R_{i\alpha}} - \kappa \right)e^{-\kappa R_{i\alpha}}
\]
Then,
</p>
\begin{eqnarray*}
\partial_{i,m}\delta J_{en} = & \sum_\alpha \delta_{i,\text{num}} \left( \frac{a_1 \partial_{i,m}\widetilde{R}^{\text{new}}_{i\alpha}}{(1+a_2 \widetilde{R}^{\text{new}}_{i\alpha})^2} - \frac{a_1 \partial_{i,m}\widetilde{R}^{\text{old}}_{i\alpha}}{(1+a_2 \widetilde{R}^{\text{old}}_{i\alpha})^2} + \sum_{k=2}^{N_{\text{aord}}} a_k k \left({\widetilde{R}_{i\alpha}^{\text{new}}}^{k-1} \partial_{i,m}\widetilde{R}^{\text{new}}_{i\alpha} - {\widetilde{R}_{i\alpha}^{\text{old}}}^{k-1} \partial_{i,m}\widetilde{R}^{\text{old}}_{i\alpha} \right) \right)\\
\partial_{i,4}\delta J_{en} = & \sum_\alpha \delta_{i,\text{num}} \left( \frac{a_1}{(1+a_2 \widetilde{R}^{\text{new}}_{i\alpha})^2} \left(\partial_{i,4}\widetilde{R}^{\text{new}}_{i\alpha} - 2 a_2 \frac{\nabla\widetilde{R}^{\text{new}}_{i\alpha} \cdot \nabla \widetilde{R}^{\text{new}}_{i\alpha}}{1+a_2 \widetilde{R}^{\text{new}}_{i\alpha}} \right) - \frac{a_1}{(1+a_2 \widetilde{R}^{\text{old}}_{i\alpha})^2} \left(\partial_{i,4}\widetilde{R}^{\text{old}}_{i\alpha} - 2 a_2 \frac{\nabla\widetilde{R}^{\text{old}}_{i\alpha} \cdot \nabla \widetilde{R}^{\text{old}}_{i\alpha}}{1+b_2 \widetilde{R}^{\text{old}}_{i\alpha}} \right) \right.\\
& \left.+ \sum_{k=2}^{N_{\text{aord}}} a_k k \left({\widetilde{R}_{i\alpha}^{\text{new}}}^{k-1}\partial_{i,4}\widetilde{R}_{i\alpha}^{\text{new}} + (k-1)(\nabla\widetilde{R}_{i\alpha}^{\text{new}} \cdot \nabla \widetilde{R}_{i\alpha}^{\text{new}}) {\widetilde{R}_{i\alpha}^{\text{new}}}^{k-2} - {\widetilde{R}_{i\alpha}^{\text{old}}}^{k-1}\partial_{i,4}\widetilde{R}_{i\alpha}^{\text{old}} - (k-1)(\nabla\widetilde{R}_{i\alpha}^{\text{old}} \cdot \nabla \widetilde{R}_{i\alpha}^{\text{old}}) {\widetilde{R}_{i\alpha}^{\text{old}}}^{k-2} \right) \right)
\end{eqnarray*}
</div>
<div id="outline-container-orgbdc1f14" class="outline-3">
<h3 id="orgbdc1f14"><span class="section-number-3">7.1.</span> Electron-nucleus rescaled distance</h3>
<div class="outline-text-3" id="text-7-1">
<p>
Calculate the updated rescaled electron-nucleus distances
\[
\widetilde{R}_{i\alpha} = \frac{1-e^{-\kappa R_{i\alpha}}}{\kappa}.
\]
</p>
</div>
<div id="outline-container-org03340ae" class="outline-4">
<h4 id="org03340ae"><span class="section-number-4">7.1.1.</span> Get</h4>
<div class="outline-text-4" id="text-7-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_en_rescaled_single</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-orgfc6a2ec" class="outline-4">
<h4 id="orgfc6a2ec"><span class="section-number-4">7.1.2.</span> Compute</h4>
<div class="outline-text-4" id="text-7-1-2">
<table id="orgd03093c" 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>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 nuclei</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 types of 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">Number of types of nuclei</td>
</tr>
<tr>
<td class="org-left"><code>rescale_factor_en</code></td>
<td class="org-left"><code>double[type_nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">The factor for rescaled distances</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>single_en_distance</code></td>
<td class="org-left"><code>double[walk_num][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Single electron-nucleus distances</td>
</tr>
<tr>
<td class="org-left"><code>en_rescaled_single</code></td>
<td class="org-left"><code>double[walk_num][nucl_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: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_en_rescaled_single_doc</span>(context, <span style="color: #a020f0;">&amp;</span>
nucl_num, type_nucl_num, type_nucl_vector, rescale_factor_en, <span style="color: #a020f0;">&amp;</span>
walk_num, single_en_distance, en_rescaled_single) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">bind</span>(C) <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: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> nucl_num</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> type_nucl_num</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> type_nucl_vector(nucl_num)</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> rescale_factor_en(type_nucl_num)</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> single_en_distance(nucl_num,walk_num)</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> en_rescaled_single(nucl_num,walk_num)</span>
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, k</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> coord(3)</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> (walk_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;">do</span> i=1, nucl_num
<span style="color: #a020f0;">do</span> k=1,walk_num
en_rescaled_single(i,k) = (1.0d0 - dexp(-rescale_factor_en(type_nucl_vector(i)+1) * <span style="color: #a020f0;">&amp;</span>
single_en_distance(i,k))) / rescale_factor_en(type_nucl_vector(i)+1)
<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_en_rescaled_single_doc</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org36ed085" class="outline-3">
<h3 id="org36ed085"><span class="section-number-3">7.2.</span> Single electron-nucleus Jastrow value</h3>
<div class="outline-text-3" id="text-7-2">
<p>
Calculates \(\delta J_{en}\)
\[
\delta J_{en} = \sum_i \delta_{i,\text{num}} \left( \frac{a_1 \widetilde{R}_{i\alpha}^{\text{new}}}{1+a_2 \widetilde{R}_{i\alpha}^{\text{new}}} - \frac{a_1 \widetilde{R}_{i\alpha}^{\text{old}}}{1+a_2 \widetilde{R}_{i\alpha}^{\text{old}}} + \sum_{k=2}^{N_\text{aord}} a_k\left({\widetilde{R}_{i\alpha}^{\text{new}}}^k - {\widetilde{R}_{i\alpha}^{\text{old}}}^k \right)\right)
\]
</p>
</div>
<div id="outline-container-orgf0f9820" class="outline-4">
<h4 id="orgf0f9820"><span class="section-number-4">7.2.1.</span> Get</h4>
<div class="outline-text-4" id="text-7-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_champ_single_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;">delta_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 class="org-src-container">
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_get_jastrow_champ_single_en</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> delta_en, size_max) bind(C)</span>
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<span style="color: #a020f0;">import</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: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>), <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_en(size_max)</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_jastrow_champ_single_en</span>
<span style="color: #a020f0;">end interface</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org173d970" class="outline-4">
<h4 id="org173d970"><span class="section-number-4">7.2.2.</span> Compute</h4>
<div class="outline-text-4" id="text-7-2-2">
<table id="org17bb95a" 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>num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Index of single point</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 nuclei</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 nuclei</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>a_vector</code></td>
<td class="org-left"><code>double[type_nucl_num][aord_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>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 rescaled distances</td>
</tr>
<tr>
<td class="org-left">~en<sub>rescaled</sub><sub>single</sub> ~</td>
<td class="org-left"><code>double[walk_num][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus rescaled single distances</td>
</tr>
<tr>
<td class="org-left"><code>delta_en</code></td>
<td class="org-left"><code>double[walk_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Single electron-nucleus jastrow</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_single_en_doc</span>( <span style="color: #a020f0;">&amp;</span>
context, num_in, walk_num, elec_num, nucl_num, type_nucl_num, <span style="color: #a020f0;">&amp;</span>
type_nucl_vector, aord_num, a_vector, <span style="color: #a020f0;">&amp;</span>
en_distance_rescaled, en_rescaled_single, delta_en) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">bind</span>(C) <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: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> nucl_num</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> type_nucl_num</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> type_nucl_vector(nucl_num)</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> aord_num</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> a_vector(aord_num+1,type_nucl_num)</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</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;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_rescaled_single(nucl_num,walk_num)</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_en(walk_num)</span>
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, p, nw, num</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, power_ser, y</span>
num = num_in + 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> (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> (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> (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>
<span style="color: #a020f0;">do</span> nw =1, walk_num
delta_en(nw) = 0.0d0
<span style="color: #a020f0;">do</span> a = 1, nucl_num
x = en_distance_rescaled(num, a, nw)
y = en_rescaled_single(a, nw)
delta_en(nw) = delta_en(nw) - a_vector(1, type_nucl_vector(a)+1) * x / (1.0d0 + a_vector(2, type_nucl_vector(a)+1) * x)
delta_en(nw) = delta_en(nw) + a_vector(1, type_nucl_vector(a)+1) * y / (1.0d0 + a_vector(2, type_nucl_vector(a)+1) * y)
<span style="color: #a020f0;">do</span> p = 2, aord_num
x = x * en_distance_rescaled(num, a, nw)
y = y * en_rescaled_single(a, nw)
delta_en(nw) = delta_en(nw) - a_vector(p + 1, type_nucl_vector(a)+1) * x + a_vector(p + 1, type_nucl_vector(a)+1) * y
<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_jastrow_champ_single_en_doc</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org5138156" class="outline-3">
<h3 id="org5138156"><span class="section-number-3">7.3.</span> Electron-nucleus rescaled distances derivatives</h3>
<div class="outline-text-3" id="text-7-3">
<p>
Calculate the gradients and Laplacians of the rescaled electron-nucleus distances
\[
\partial_{i,m} \widetilde{R}_{i\alpha} = \frac{r_{i,m} - R_{\alpha,m}}{R_{i\alpha}} e^{-\kappa R_{i\alpha}} \quad \text{and} \quad \partial_{i,4} \widetilde{R}_{i\alpha} = \left(\frac{2}{R_{i\alpha}} - \kappa \right)e^{-\kappa R_{i\alpha}}
\]
</p>
</div>
<div id="outline-container-orgb7b718d" class="outline-4">
<h4 id="orgb7b718d"><span class="section-number-4">7.3.1.</span> Get</h4>
<div class="outline-text-4" id="text-7-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_en_rescaled_single_gl</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">distance_rescaled_gl</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">size_t</span> <span style="color: #a0522d;">size_max</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-org54a571c" class="outline-4">
<h4 id="org54a571c"><span class="section-number-4">7.3.2.</span> Compute</h4>
<div class="outline-text-4" id="text-7-3-2">
<table id="org6475bfb" 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 nuclei</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 nucleus 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">Array of nucleus types</td>
</tr>
<tr>
<td class="org-left"><code>rescale_factor_en</code></td>
<td class="org-left"><code>double[nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">The factors for rescaled distances</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>single_en_distance</code></td>
<td class="org-left"><code>double[walk_num][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Single electorn distances</td>
</tr>
<tr>
<td class="org-left"><code>coord</code></td>
<td class="org-left"><code>double[walk_num][3]</code></td>
<td class="org-left">in</td>
<td class="org-left">Single electron coordinates</td>
</tr>
<tr>
<td class="org-left"><code>nucl_coord</code></td>
<td class="org-left"><code>double[3][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Nucleus coordinates</td>
</tr>
<tr>
<td class="org-left"><code>en_rescaled_single_gl</code></td>
<td class="org-left"><code>double[walk_num][nucl_num][4]</code></td>
<td class="org-left">out</td>
<td class="org-left">Electron-nucleus rescaled single distance derivatives</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_en_rescaled_single_gl_doc_f</span><span style="color: #a0522d;">(context, nucl_num, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> type_nucl_num, type_nucl_vector, rescale_factor_en, walk_num, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> single_en_distance, coord, nucl_coord, en_rescaled_single_gl) </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> result(info)</span>
<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;"> 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;"> rescale_factor_en(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;"> single_en_distance(nucl_num, walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coord(3,walk_num)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> nucl_coord(nucl_num,3)</span>
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> en_rescaled_single_gl(4,nucl_num,walk_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> nw, a, ii</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> ria_inv, elnuc_dist_gl(4, nucl_num), kappa_l</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> (walk_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>
en_rescaled_single_gl = 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
ria_inv = 1.0d0 / single_en_distance(a, nw)
<span style="color: #a020f0;">do</span> ii = 1, 3
elnuc_dist_gl(ii, a) = (coord(ii,nw) - nucl_coord(a, ii)) * ria_inv
<span style="color: #a020f0;">end do</span>
elnuc_dist_gl(4, a) = 2.0d0 * ria_inv
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">do</span> a = 1, nucl_num
kappa_l = -1 * rescale_factor_en(type_nucl_vector(a)+1)
en_rescaled_single_gl(1, a, nw) = elnuc_dist_gl(1, a)
en_rescaled_single_gl(2, a, nw) = elnuc_dist_gl(2, a)
en_rescaled_single_gl(3, a, nw) = elnuc_dist_gl(3, a)
en_rescaled_single_gl(4, a, nw) = elnuc_dist_gl(4, a)
en_rescaled_single_gl(4, a, nw) = en_rescaled_single_gl(4, a, nw) + kappa_l
en_rescaled_single_gl(1, a, nw) = en_rescaled_single_gl(1, a, nw) * dexp(kappa_l * single_en_distance(a,nw))
en_rescaled_single_gl(2, a, nw) = en_rescaled_single_gl(2, a, nw) * dexp(kappa_l * single_en_distance(a,nw))
en_rescaled_single_gl(3, a, nw) = en_rescaled_single_gl(3, a, nw) * dexp(kappa_l * single_en_distance(a,nw))
en_rescaled_single_gl(4, a, nw) = en_rescaled_single_gl(4, a, nw) * dexp(kappa_l * single_en_distance(a,nw))
<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_en_rescaled_single_gl_doc_f</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org97e6ae7" class="outline-3">
<h3 id="org97e6ae7"><span class="section-number-3">7.4.</span> Electron-nucleus Jastrow gradients and Laplacian</h3>
<div class="outline-text-3" id="text-7-4">
<p>
Calculate the gradients and Laplacian of the \(\delta J_{en}\).
</p>
\begin{eqnarray*}
\partial_{i,m}\delta J_{en} = & \sum_\alpha \delta_{i,\text{num}} \left( \frac{a_1 \partial_{i,m}\widetilde{R}^{\text{new}}_{i\alpha}}{(1+a_2 \widetilde{R}^{\text{new}}_{i\alpha})^2} - \frac{a_1 \partial_{i,m}\widetilde{R}^{\text{old}}_{i\alpha}}{(1+a_2 \widetilde{R}^{\text{old}}_{i\alpha})^2} + \sum_{k=2}^{N_{\text{aord}}} a_k k \left({\widetilde{R}_{i\alpha}^{\text{new}}}^{k-1} \partial_{i,m}\widetilde{R}^{\text{new}}_{i\alpha} - {\widetilde{R}_{i\alpha}^{\text{old}}}^{k-1} \partial_{i,m}\widetilde{R}^{\text{old}}_{i\alpha} \right) \right)\\
\partial_{i,4}\delta J_{en} = & \sum_\alpha \delta_{i,\text{num}} \left( \frac{a_1}{(1+a_2 \widetilde{R}^{\text{new}}_{i\alpha})^2} \left(\partial_{i,4}\widetilde{R}^{\text{new}}_{i\alpha} - 2 a_2 \frac{\nabla\widetilde{R}^{\text{new}}_{i\alpha} \cdot \nabla \widetilde{R}^{\text{new}}_{i\alpha}}{1+a_2 \widetilde{R}^{\text{new}}_{i\alpha}} \right) - \frac{a_1}{(1+a_2 \widetilde{R}^{\text{old}}_{i\alpha})^2} \left(\partial_{i,4}\widetilde{R}^{\text{old}}_{i\alpha} - 2 a_2 \frac{\nabla\widetilde{R}^{\text{old}}_{i\alpha} \cdot \nabla \widetilde{R}^{\text{old}}_{i\alpha}}{1+b_2 \widetilde{R}^{\text{old}}_{i\alpha}} \right) \right.\\
& \left.+ \sum_{k=2}^{N_{\text{aord}}} a_k k \left({\widetilde{R}_{i\alpha}^{\text{new}}}^{k-1}\partial_{i,4}\widetilde{R}_{i\alpha}^{\text{new}} + (k-1)(\nabla\widetilde{R}_{i\alpha}^{\text{new}} \cdot \nabla \widetilde{R}_{i\alpha}^{\text{new}}) {\widetilde{R}_{i\alpha}^{\text{new}}}^{k-2} - {\widetilde{R}_{i\alpha}^{\text{old}}}^{k-1}\partial_{i,4}\widetilde{R}_{i\alpha}^{\text{old}} - (k-1)(\nabla\widetilde{R}_{i\alpha}^{\text{old}} \cdot \nabla \widetilde{R}_{i\alpha}^{\text{old}}) {\widetilde{R}_{i\alpha}^{\text{old}}}^{k-2} \right) \right)
\end{eqnarray*}
</div>
<div id="outline-container-orgb4a13cf" class="outline-4">
<h4 id="orgb4a13cf"><span class="section-number-4">7.4.1.</span> Get</h4>
<div class="outline-text-4" id="text-7-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_champ_single_en_gl</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;">delta_en_gl</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_get_jastrow_champ_single_en_gl</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> delta_en_gl, size_max) bind(C)</span>
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<span style="color: #a020f0;">import</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: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>), <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_en_gl(size_max)</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_jastrow_champ_single_en_gl</span>
<span style="color: #a020f0;">end interface</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orge222f69" class="outline-4">
<h4 id="orge222f69"><span class="section-number-4">7.4.2.</span> Compute</h4>
<div class="outline-text-4" id="text-7-4-2">
<table id="org8fff533" 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>num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Index of single electron</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 nuclei</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 nuclei</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>a_vector</code></td>
<td class="org-left"><code>double[type_nucl_num][aord_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>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 rescaled distances</td>
</tr>
<tr>
<td class="org-left"><code>en_distance_rescaled_gl</code></td>
<td class="org-left"><code>double[walk_num][nucl_num][elec_num][4]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus rescaled distance derivatives</td>
</tr>
<tr>
<td class="org-left"><code>en_rescaled_single</code></td>
<td class="org-left"><code>double[walk_num][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus rescaled single distances</td>
</tr>
<tr>
<td class="org-left"><code>en_rescaled_single_gl</code></td>
<td class="org-left"><code>double[walk_num][nucl_num][4]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus rescaled single distance derivatives</td>
</tr>
<tr>
<td class="org-left"><code>delta_en_gl</code></td>
<td class="org-left"><code>double[walk_num][elec_num][4]</code></td>
<td class="org-left">out</td>
<td class="org-left">Single electron-nucleus Jastrow gradients and Laplacian</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_single_en_gl_doc</span>( <span style="color: #a020f0;">&amp;</span>
context, num_in, walk_num, elec_num, nucl_num, type_nucl_num, <span style="color: #a020f0;">&amp;</span>
type_nucl_vector, aord_num, a_vector, <span style="color: #a020f0;">&amp;</span>
en_distance_rescaled, en_distance_rescaled_gl, en_rescaled_single, en_rescaled_single_gl, delta_en_gl) <span style="color: #a020f0;">&amp;</span>
<span style="color: #a020f0;">bind</span>(C) <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: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> nucl_num</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> type_nucl_num</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> type_nucl_vector(nucl_num)</span>
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> aord_num</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> a_vector(aord_num+1,type_nucl_num)</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</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;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_distance_rescaled_gl(4, elec_num,nucl_num,walk_num)</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_rescaled_single(nucl_num,walk_num)</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_rescaled_single_gl(4, nucl_num,walk_num)</span>
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_en_gl(4,elec_num,walk_num)</span>
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, k, nw, ii, num</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, x1, kf, x_old, x1_old</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> denom, invdenom, invdenom2, f</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> denom_old, invdenom_old, invdenom2_old, f_old</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> grad_c2, grad_c2_old</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> dx(4), dx_old(4)</span>
num = num_in + 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_3
<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_4
<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_5
<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_8
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">do</span> nw =1, walk_num
delta_en_gl(:,:,nw) = 0.0d0
<span style="color: #a020f0;">do</span> a = 1, nucl_num
x_old = en_distance_rescaled(num,a,nw)
x = en_rescaled_single(a,nw)
denom = 1.0d0 + a_vector(2, type_nucl_vector(a)+1) * x
invdenom = 1.0d0 / denom
invdenom2 = invdenom*invdenom
denom_old = 1.0d0 + a_vector(2, type_nucl_vector(a)+1) * x_old
invdenom_old = 1.0d0 / denom_old
invdenom2_old = invdenom_old*invdenom_old
dx(1) = en_rescaled_single_gl(1,a,nw)
dx(2) = en_rescaled_single_gl(2,a,nw)
dx(3) = en_rescaled_single_gl(3,a,nw)
dx(4) = en_rescaled_single_gl(4,a,nw)
dx_old(1) = en_distance_rescaled_gl(1,num,a,nw)
dx_old(2) = en_distance_rescaled_gl(2,num,a,nw)
dx_old(3) = en_distance_rescaled_gl(3,num,a,nw)
dx_old(4) = en_distance_rescaled_gl(4,num,a,nw)
f = a_vector(1, type_nucl_vector(a)+1) * invdenom2
grad_c2 = dx(1)*dx(1) + dx(2)*dx(2) + dx(3)*dx(3)
f_old = a_vector(1, type_nucl_vector(a)+1) * invdenom2_old
grad_c2_old = dx_old(1)*dx_old(1) + dx_old(2)*dx_old(2) + dx_old(3)*dx_old(3)
delta_en_gl(1,num,nw) = delta_en_gl(1,num,nw) + f * dx(1) - f_old * dx_old(1)
delta_en_gl(2,num,nw) = delta_en_gl(2,num,nw) + f * dx(2) - f_old * dx_old(2)
delta_en_gl(3,num,nw) = delta_en_gl(3,num,nw) + f * dx(3) - f_old * dx_old(3)
delta_en_gl(4,num,nw) = delta_en_gl(4,num,nw) <span style="color: #a020f0;">&amp;</span>
+ f * (dx(4) - 2.d0 * a_vector(2, type_nucl_vector(a)+1) * grad_c2 * invdenom) <span style="color: #a020f0;">&amp;</span>
- f_old * (dx_old(4) - 2.d0 * a_vector(2, type_nucl_vector(a)+1) * grad_c2_old * invdenom_old)
kf = 2.d0
x1 = x
x = 1.d0
x1_old = x_old
x_old = 1.d0
<span style="color: #a020f0;">do</span> k=2, aord_num
f = a_vector(k+1,type_nucl_vector(a)+1) * kf * x
f_old = a_vector(k+1,type_nucl_vector(a)+1) * kf * x_old
delta_en_gl(1,num,nw) = delta_en_gl(1,num,nw) + f * x1 * dx(1) - f_old * x1_old * dx_old(1)
delta_en_gl(2,num,nw) = delta_en_gl(2,num,nw) + f * x1 * dx(2) - f_old * x1_old * dx_old(2)
delta_en_gl(3,num,nw) = delta_en_gl(3,num,nw) + f * x1 * dx(3) - f_old * x1_old * dx_old(3)
delta_en_gl(4,num,nw) = delta_en_gl(4,num,nw) <span style="color: #a020f0;">&amp;</span>
+ f * (x1 * dx(4) + (kf-1.d0) * grad_c2) <span style="color: #a020f0;">&amp;</span>
- f_old * (x1_old * dx_old(4) + (kf-1.d0) * grad_c2_old)
x = x*x1
x_old = x_old*x1_old
kf = kf + 1.d0
<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_jastrow_champ_single_en_gl_doc</span>
</pre>
</div>
</div>
</div>
</div>
</div>
<div id="outline-container-orge57cc8d" class="outline-2">
<h2 id="orge57cc8d"><span class="section-number-2">8.</span> Accept single electron move</h2>
<div class="outline-text-2" id="text-8">
<p>
This function 'accepts' a proposed single-electron move. It overrides (or adds to) the required arrays and matrices to bring the positions of the electron and the full Jastrow factor up to date.
For instances,
</p>
\begin{eqnarray}
J_{en} = & J_{en} + \delta J_{en}\\
J_{ee} = & J_{ee} + \delta J_{ee}\\
J_{een} = & J_{een} + \delta J_{een}\\
\partial_{i,m} J_{en} = & \partial_{i,m} J_{en} + \partial_{i,m} \delta J_{en}\\
\partial_{i,m} J_{ee} = & \partial_{i,m} J_{ee} + \partial_{i,m} \delta J_{ee}\\
\partial_{i,m} J_{een} = & \partial_{i,m} J_{een} + \partial_{i,m} \delta J_{een}\\
\end{eqnarray}
<p>
The function has similar functionaly for the intermediate products, such as \(P\), \(\widetilde{r}\), \(\widetilde{R}\), and the derivative of these.
Furthermore, it also updates the dates, such that immidiatly calling a Jastrow function after an accepted single-electron move will not trigger a re-calculation of the Jastrow factors.
</p>
</div>
<div id="outline-container-org7a55cff" class="outline-3">
<h3 id="org7a55cff"><span class="section-number-3">8.1.</span> Code</h3>
<div class="outline-text-3" id="text-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_champ_single_accept</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_get_jastrow_champ_single_accept</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> QMCKL_NULL_CONTEXT;
}
<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>);
<span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #a0522d;">rc</span>;
rc = qmckl_provide_jastrow_champ_single_en_gl(context);
<span style="color: #a020f0;">if</span> (rc != QMCKL_SUCCESS) <span style="color: #a020f0;">return</span> rc;
rc = qmckl_provide_jastrow_champ_single_ee_gl(context);
<span style="color: #a020f0;">if</span> (rc != QMCKL_SUCCESS) <span style="color: #a020f0;">return</span> rc;
<span style="color: #a020f0;">if</span> (ctx-&gt;jastrow_champ.cord_num &gt; 0) {
rc = qmckl_provide_jastrow_champ_single_een_gl(context);
<span style="color: #a020f0;">if</span> (rc != QMCKL_SUCCESS) <span style="color: #a020f0;">return</span> rc;
}
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">metric</span>[4] = {-1.0, -1.0, -1.0, 1.0};
<span style="color: #228b22;">int</span> <span style="color: #a0522d;">shift1</span>, <span style="color: #a0522d;">shift2</span>, <span style="color: #a0522d;">shift3</span>, <span style="color: #a0522d;">shift4</span>, <span style="color: #a0522d;">shift5</span>, <span style="color: #a0522d;">shift6</span>, <span style="color: #a0522d;">shift7</span>;
<span style="color: #228b22;">int</span> <span style="color: #a0522d;">shift8</span>, <span style="color: #a0522d;">shift9</span>, <span style="color: #a0522d;">shift10</span>, <span style="color: #a0522d;">shift11</span>, <span style="color: #a0522d;">shift12</span>, <span style="color: #a0522d;">shift13</span>, <span style="color: #a0522d;">shift14</span>;
shift2 = ctx-&gt;electron.num*ctx-&gt;electron.num;
shift5 = ctx-&gt;electron.num*4*ctx-&gt;electron.num;
shift6 = ctx-&gt;electron.num*4;
shift11 = ctx-&gt;nucleus.num*4*ctx-&gt;electron.num;
shift13 = ctx-&gt;nucleus.num*4;
shift14 = ctx-&gt;nucleus.num*ctx-&gt;electron.num;
<span style="color: #a020f0;">if</span> (ctx-&gt;jastrow_champ.cord_num &gt; 0) {
shift1 = (ctx-&gt;jastrow_champ.cord_num+1)*ctx-&gt;electron.num*ctx-&gt;electron.num;
shift3 = (ctx-&gt;jastrow_champ.cord_num+1)*ctx-&gt;electron.num;
shift4 = (ctx-&gt;jastrow_champ.cord_num+1)*ctx-&gt;electron.num*4*ctx-&gt;electron.num;
shift7 = (ctx-&gt;jastrow_champ.cord_num+1)*ctx-&gt;electron.num*4;
shift8 = (ctx-&gt;jastrow_champ.cord_num+1)*ctx-&gt;nucleus.num*ctx-&gt;electron.num;
shift9 = (ctx-&gt;jastrow_champ.cord_num+1)*ctx-&gt;nucleus.num;
shift10 = (ctx-&gt;jastrow_champ.cord_num+1)*ctx-&gt;nucleus.num*4*ctx-&gt;electron.num;
shift12 = (ctx-&gt;jastrow_champ.cord_num+1)*ctx-&gt;nucleus.num*4;
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">nw</span> = 0; nw &lt; ctx-&gt;electron.walker.num; nw++) {
ctx-&gt;jastrow_champ.factor_een[nw] = ctx-&gt;jastrow_champ.factor_een[nw] + ctx-&gt;single_point.delta_een[nw];
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">l</span> = 0; l &lt;= ctx-&gt;jastrow_champ.cord_num; l++){
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i &lt; ctx-&gt;electron.num; i++) {
ctx-&gt;jastrow_champ.een_rescaled_e[nw*shift1
+ l*shift2
+ i*ctx-&gt;electron.num
+ ctx-&gt;single_point.num] =
ctx-&gt;single_point.een_rescaled_single_e[nw*shift3
+ l*ctx-&gt;electron.num
+ i];
ctx-&gt;jastrow_champ.een_rescaled_e[nw*shift1
+ l*shift2
+ ctx-&gt;single_point.num*ctx-&gt;electron.num
+ i] =
ctx-&gt;single_point.een_rescaled_single_e[nw*shift3
+ l*ctx-&gt;electron.num
+ i];
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">k</span> = 0; k &lt; 4; k++){
ctx-&gt;jastrow_champ.een_rescaled_e_gl[nw*shift4
+ l*shift5
+ i*shift6
+ k*ctx-&gt;electron.num
+ ctx-&gt;single_point.num] =
ctx-&gt;single_point.een_rescaled_single_e_gl[nw*shift7
+ l*shift6
+ i*4
+ k];
ctx-&gt;jastrow_champ.een_rescaled_e_gl[nw*shift4
+ l*shift5
+ ctx-&gt;single_point.num*shift6
+ k*ctx-&gt;electron.num
+ i] =
metric[k] * ctx-&gt;single_point.een_rescaled_single_e_gl[nw*shift7
+ l*shift6
+ i*4
+ k];
}
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">a</span> = 0; a &lt; ctx-&gt;nucleus.num; a++){
ctx-&gt;jastrow_champ.een_rescaled_n[nw*shift8
+ l*shift14
+ a*ctx-&gt;electron.num
+ ctx-&gt;single_point.num] =
ctx-&gt;single_point.een_rescaled_single_n[nw*shift9
+ l*ctx-&gt;nucleus.num
+ a];
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">k</span> = 0; k &lt; 4; k++){
ctx-&gt;jastrow_champ.een_rescaled_n_gl[nw*shift10
+ l*shift11
+ a*shift6
+ k*ctx-&gt;electron.num
+ ctx-&gt;single_point.num] =
ctx-&gt;single_point.een_rescaled_single_n_gl[nw*shift12
+ l*shift13
+ a*4
+ k];
}
}
}
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i &lt; ctx-&gt;electron.walker.num * 4 * ctx-&gt;electron.num; i++) {
ctx-&gt;jastrow_champ.factor_een_gl[i] = ctx-&gt;jastrow_champ.factor_een_gl[i] + ctx-&gt;single_point.delta_een_gl[i];
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i &lt; (ctx-&gt;electron.walker.num*(ctx-&gt;jastrow_champ.cord_num+1)*ctx-&gt;nucleus.num*ctx-&gt;electron.num*ctx-&gt;jastrow_champ.cord_num); i++) {
ctx-&gt;jastrow_champ.tmp_c[i] = ctx-&gt;jastrow_champ.tmp_c[i] + ctx-&gt;single_point.delta_p[i];
}
/*
<span style="color: #b22222;"> for (int nw = 0; nw &lt; ctx-&gt;electron.walker.num; nw++) {</span>
<span style="color: #b22222;"> for (int m = 0; m &lt; ctx-&gt;jastrow_champ.cord_num; m++){</span>
<span style="color: #b22222;"> for (int l = 0; l &lt;= ctx-&gt;jastrow_champ.cord_num; l++) {</span>
<span style="color: #b22222;"> for (int a = 0; a &lt; ctx-&gt;nucleus.num; a++) {</span>
<span style="color: #b22222;"> for (int k = 0; k &lt; 4; k++){</span>
<span style="color: #b22222;"> for (int i = 0; i &lt; ctx-&gt;electron.num; i++) {</span>
<span style="color: #b22222;"> ctx-&gt;jastrow_champ.dtmp_c[nw*ctx-&gt;electron.num*4*ctx-&gt;nucleus.num*ctx-&gt;jastrow_champ.cord_num*(ctx-&gt;jastrow_champ.cord_num+1)</span>
<span style="color: #b22222;"> + m*ctx-&gt;electron.num*4*ctx-&gt;nucleus.num*(ctx-&gt;jastrow_champ.cord_num+1)</span>
<span style="color: #b22222;"> + l*ctx-&gt;electron.num*4*ctx-&gt;nucleus.num</span>
<span style="color: #b22222;"> + a*4*ctx-&gt;electron.num</span>
<span style="color: #b22222;"> + k*ctx-&gt;electron.num</span>
<span style="color: #b22222;"> + i] =</span>
<span style="color: #b22222;"> ctx-&gt;jastrow_champ.dtmp_c[nw*ctx-&gt;electron.num*4*ctx-&gt;nucleus.num*ctx-&gt;jastrow_champ.cord_num*(ctx-&gt;jastrow_champ.cord_num+1)</span>
<span style="color: #b22222;"> + m*ctx-&gt;electron.num*4*ctx-&gt;nucleus.num*(ctx-&gt;jastrow_champ.cord_num+1)</span>
<span style="color: #b22222;"> + l*ctx-&gt;electron.num*4*ctx-&gt;nucleus.num</span>
<span style="color: #b22222;"> + a*4*ctx-&gt;electron.num</span>
<span style="color: #b22222;"> + k*ctx-&gt;electron.num</span>
<span style="color: #b22222;"> + i] +</span>
<span style="color: #b22222;"> ctx-&gt;single_point.delta_p_gl[nw*ctx-&gt;electron.num*4*ctx-&gt;nucleus.num*ctx-&gt;jastrow_champ.cord_num*(ctx-&gt;jastrow_champ.cord_num+1)</span>
<span style="color: #b22222;"> + m*ctx-&gt;electron.num*4*ctx-&gt;nucleus.num*(ctx-&gt;jastrow_champ.cord_num+1)</span>
<span style="color: #b22222;"> + l*ctx-&gt;electron.num*4*ctx-&gt;nucleus.num</span>
<span style="color: #b22222;"> + k*ctx-&gt;electron.num*ctx-&gt;nucleus.num</span>
<span style="color: #b22222;"> + a*ctx-&gt;electron.num</span>
<span style="color: #b22222;"> + i];</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: #b22222;"> }</span>
*/
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">nw</span> = 0; nw &lt; ctx-&gt;electron.walker.num*(ctx-&gt;jastrow_champ.cord_num+1)*ctx-&gt;jastrow_champ.cord_num; nw++) {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">a</span> = 0; a &lt; ctx-&gt;nucleus.num; a++) {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">k</span> = 0; k &lt; 4; k++){
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i &lt; ctx-&gt;electron.num; i++) {
ctx-&gt;jastrow_champ.dtmp_c[nw*shift11
+ a*shift6
+ k*ctx-&gt;electron.num
+ i] =
ctx-&gt;jastrow_champ.dtmp_c[nw*shift11
+ a*shift6
+ k*ctx-&gt;electron.num
+ i] +
ctx-&gt;single_point.delta_p_gl[nw*shift11
+ k*shift14
+ a*ctx-&gt;electron.num
+ i];
}
}
}
}
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">nw</span> = 0; nw &lt; ctx-&gt;electron.walker.num; nw++) {
ctx-&gt;jastrow_champ.factor_en[nw] = ctx-&gt;jastrow_champ.factor_en[nw] + ctx-&gt;single_point.delta_en[nw];
ctx-&gt;jastrow_champ.factor_ee[nw] = ctx-&gt;jastrow_champ.factor_ee[nw] + ctx-&gt;single_point.delta_ee[nw];
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">a</span> = 0; a &lt; ctx-&gt;nucleus.num; a++) {
ctx-&gt;electron.en_distance[nw*shift14
+ ctx-&gt;single_point.num*ctx-&gt;nucleus.num
+ a] =
ctx-&gt;single_point.single_en_distance[nw*ctx-&gt;nucleus.num
+ a];
ctx-&gt;jastrow_champ.en_distance_rescaled[nw*shift14
+ a*ctx-&gt;electron.num
+ ctx-&gt;single_point.num] =
ctx-&gt;single_point.en_rescaled_single[nw*ctx-&gt;nucleus.num
+ a];
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">k</span> = 0; k &lt; 4; k++){
ctx-&gt;jastrow_champ.en_distance_rescaled_gl[nw*shift11
+ a*shift6
+ ctx-&gt;single_point.num*4
+ k] =
ctx-&gt;single_point.en_rescaled_single_gl[nw*shift13
+ a*4
+ k];
}
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i &lt; ctx-&gt;electron.num; i++) {
ctx-&gt;jastrow_champ.ee_distance_rescaled[nw*shift2
+ i*ctx-&gt;electron.num
+ ctx-&gt;single_point.num] =
ctx-&gt;single_point.ee_rescaled_single[nw*ctx-&gt;electron.num
+ i];
ctx-&gt;jastrow_champ.ee_distance_rescaled[nw*shift2
+ ctx-&gt;single_point.num*ctx-&gt;electron.num
+ i] =
ctx-&gt;single_point.ee_rescaled_single[nw*ctx-&gt;electron.num
+ i];
ctx-&gt;electron.ee_distance[nw*shift2
+ i*ctx-&gt;electron.num
+ ctx-&gt;single_point.num] =
ctx-&gt;single_point.single_ee_distance[nw*ctx-&gt;electron.num
+ i];
ctx-&gt;electron.ee_distance[nw*shift2
+ ctx-&gt;single_point.num*ctx-&gt;electron.num
+ i] =
ctx-&gt;single_point.single_ee_distance[nw*ctx-&gt;electron.num
+ i];
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">k</span> = 0; k &lt; 4; k++){
ctx-&gt;jastrow_champ.ee_distance_rescaled_gl[nw*shift5
+ i*shift6
+ ctx-&gt;single_point.num*4
+ k] =
metric[k] * ctx-&gt;single_point.ee_rescaled_single_gl[nw*shift6
+ i*4
+ k];
ctx-&gt;jastrow_champ.ee_distance_rescaled_gl[nw*shift5
+ ctx-&gt;single_point.num*shift6
+ i*4
+ k] =
ctx-&gt;single_point.ee_rescaled_single_gl[nw*shift6
+ i*4
+ k];
}
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">k</span> = 0; k &lt; 4; k++){
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i &lt; ctx-&gt;electron.num; i++) {
ctx-&gt;jastrow_champ.factor_ee_gl[nw*shift6
+ k*ctx-&gt;electron.num
+ i] =
ctx-&gt;jastrow_champ.factor_ee_gl[nw*shift6
+ k*ctx-&gt;electron.num
+ i] +
ctx-&gt;single_point.delta_ee_gl[nw*shift6
+ i*4
+ k];
ctx-&gt;jastrow_champ.factor_en_gl[nw*shift6
+ k*ctx-&gt;electron.num
+ i] =
ctx-&gt;jastrow_champ.factor_en_gl[nw*shift6
+ k*ctx-&gt;electron.num
+ i] +
ctx-&gt;single_point.delta_en_gl[nw*shift6
+ i*4
+ k];
}
}
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">nw</span> = 0; nw &lt; ctx-&gt;electron.walker.num; nw++) {
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">k</span> = 0; k &lt; 3; k++) {
ctx-&gt;point.coord.data[k*ctx-&gt;electron.walker.num*ctx-&gt;electron.num + nw*ctx-&gt;electron.num + ctx-&gt;single_point.num] = ctx-&gt;single_point.coord.data[nw*3 + k];
}
}
rc = qmckl_context_touch(context);
<span style="color: #a020f0;">if</span> (rc != QMCKL_SUCCESS) <span style="color: #a020f0;">return</span> rc;
<span style="color: #a020f0;">if</span> (ctx-&gt;jastrow_champ.cord_num &gt; 0){
ctx-&gt;jastrow_champ.dtmp_c_date = ctx-&gt;date;
ctx-&gt;jastrow_champ.een_rescaled_e_date = ctx-&gt;date;
ctx-&gt;jastrow_champ.een_rescaled_e_gl_date = ctx-&gt;date;
ctx-&gt;jastrow_champ.een_rescaled_n_date = ctx-&gt;date;
ctx-&gt;jastrow_champ.een_rescaled_n_gl_date = ctx-&gt;date;
ctx-&gt;jastrow_champ.factor_een_date = ctx-&gt;date;
ctx-&gt;jastrow_champ.factor_een_gl_date = ctx-&gt;date;
ctx-&gt;jastrow_champ.tmp_c_date = ctx-&gt;date;
}
ctx-&gt;jastrow_champ.ee_distance_rescaled_date = ctx-&gt;date;
ctx-&gt;jastrow_champ.ee_distance_rescaled_gl_date = ctx-&gt;date;
ctx-&gt;jastrow_champ.en_distance_rescaled_date = ctx-&gt;date;
ctx-&gt;jastrow_champ.en_distance_rescaled_gl_date = ctx-&gt;date;
ctx-&gt;jastrow_champ.factor_ee_date = ctx-&gt;date;
ctx-&gt;jastrow_champ.factor_ee_gl_date = ctx-&gt;date;
ctx-&gt;jastrow_champ.factor_en_date = ctx-&gt;date;
ctx-&gt;jastrow_champ.factor_en_gl_date = ctx-&gt;date;
ctx-&gt;electron.ee_distance_date = ctx-&gt;date;
ctx-&gt;electron.en_distance_date = ctx-&gt;date;
ctx-&gt;single_point.date = ctx-&gt;date;
<span style="color: #a020f0;">if</span> (ctx-&gt;jastrow_champ.cord_num &gt; 0){
ctx-&gt;single_point.een_rescaled_single_e_date = ctx-&gt;single_point.date;
ctx-&gt;single_point.een_rescaled_single_n_date = ctx-&gt;single_point.date;
ctx-&gt;single_point.delta_een_date = ctx-&gt;single_point.date;
ctx-&gt;single_point.delta_p_date = ctx-&gt;single_point.date;
ctx-&gt;single_point.een_rescaled_single_e_gl_date = ctx-&gt;single_point.date;
ctx-&gt;single_point.een_rescaled_single_n_gl_date = ctx-&gt;single_point.date;
ctx-&gt;single_point.delta_p_gl_date = ctx-&gt;single_point.date;
ctx-&gt;single_point.delta_een_gl_date = ctx-&gt;single_point.date;
ctx-&gt;single_point.delta_p_g_date = ctx-&gt;single_point.date;
ctx-&gt;single_point.delta_een_g_date = ctx-&gt;single_point.date;
ctx-&gt;forces.forces_delta_p_date = ctx-&gt;single_point.date;
ctx-&gt;forces.forces_jastrow_single_een_date = ctx-&gt;single_point.date;
}
ctx-&gt;single_point.single_ee_distance_date = ctx-&gt;single_point.date;
ctx-&gt;single_point.single_en_distance_date = ctx-&gt;single_point.date;
ctx-&gt;single_point.ee_rescaled_single_date = ctx-&gt;single_point.date;
ctx-&gt;single_point.en_rescaled_single_date = ctx-&gt;single_point.date;
ctx-&gt;single_point.delta_en_date = ctx-&gt;single_point.date;
ctx-&gt;single_point.delta_ee_date = ctx-&gt;single_point.date;
ctx-&gt;single_point.ee_rescaled_single_gl_date = ctx-&gt;single_point.date;
ctx-&gt;single_point.en_rescaled_single_gl_date = ctx-&gt;single_point.date;
ctx-&gt;single_point.delta_en_gl_date = ctx-&gt;single_point.date;
ctx-&gt;single_point.delta_ee_gl_date = ctx-&gt;single_point.date;
ctx-&gt;forces.forces_jastrow_single_en_date = ctx-&gt;single_point.date;
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
}
</pre>
</div>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
<span style="color: #228b22;">integer</span>(qmckl_exit_code) <span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_get_jastrow_champ_single_accept</span> (context) <span style="color: #a020f0;">bind</span>(C)
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
<span style="color: #a020f0;">import</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: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_jastrow_champ_single_accept</span>
<span style="color: #a020f0;">end interface</span>
</pre>
</div>
</div>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Author: TREX CoE</p>
<p class="date">Created: 2025-04-29 Tue 08:44</p>
<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
</html>