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

4702 lines
267 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>Forces</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">Forces</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="#org47f554b">1. Introduction</a></li>
<li><a href="#orge8b694c">2. Context</a>
<ul>
<li><a href="#org8919d2f">2.1. Data structure</a></li>
</ul>
</li>
<li><a href="#org4fd236e">3. Finite-difference function</a></li>
<li><a href="#org114f4f1">4. Forces of the Jastrow function</a>
<ul>
<li><a href="#org595b30f">4.1. Electron-nucleus Jastrow</a>
<ul>
<li><a href="#org7286fd0">4.1.1. Force of electron-nucleus Jastrow value</a>
<ul>
<li><a href="#orgadf9483">4.1.1.1. Get</a></li>
<li><a href="#org602b80d">4.1.1.2. Compute</a></li>
</ul>
</li>
<li><a href="#orgd6519a5">4.1.2. Force of electron-nucleus Jastrow gradient</a>
<ul>
<li><a href="#orgb48fadf">4.1.2.1. Get</a></li>
<li><a href="#org2ac9492">4.1.2.2. Compute</a></li>
</ul>
</li>
<li><a href="#orgb580725">4.1.3. Force of electron-nucleus Jastrow Laplacian</a>
<ul>
<li><a href="#org2401312">4.1.3.1. Get</a></li>
<li><a href="#org4f0a529">4.1.3.2. Compute</a></li>
</ul>
</li>
<li><a href="#orgc322296">4.1.4. Force of single electron-nucleus Jastrow value</a>
<ul>
<li><a href="#org2f9a044">4.1.4.1. Get</a></li>
<li><a href="#orgf001a60">4.1.4.2. Compute</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#orgf5dd455">4.2. Electron-electron-nucleus Jastrow</a>
<ul>
<li><a href="#orgd3d751d">4.2.1. Force of P matrix</a>
<ul>
<li><a href="#orgc9b5792">4.2.1.1. Get</a></li>
<li><a href="#org70f0661">4.2.1.2. Compute</a></li>
</ul>
</li>
<li><a href="#org6c17e6c">4.2.2. Force of derivative of the \(P\) matrix</a>
<ul>
<li><a href="#orgb69d90c">4.2.2.1. Get</a></li>
<li><a href="#org7210b06">4.2.2.2. Compute</a></li>
</ul>
</li>
<li><a href="#orgce67295">4.2.3. Force of electron-electron-nucleus Jastrow value</a>
<ul>
<li><a href="#org5c39e4f">4.2.3.1. Get</a></li>
<li><a href="#org605a445">4.2.3.2. Compute</a></li>
</ul>
</li>
<li><a href="#orgb7f6d8e">4.2.4. Force of derivatives of electron-nucleus rescaled distance</a>
<ul>
<li><a href="#org6c8f54e">4.2.4.1. Get</a></li>
<li><a href="#org73699b6">4.2.4.2. Compute</a></li>
</ul>
</li>
<li><a href="#orga958ca2">4.2.5. Force of electron-electron-nucleus Jastrow gradient</a>
<ul>
<li><a href="#org4373291">4.2.5.1. Get</a></li>
<li><a href="#org198f18d">4.2.5.2. Compute</a></li>
</ul>
</li>
<li><a href="#orgdcc714e">4.2.6. Force of electron-electron-nucleus Jastrow Laplacian</a>
<ul>
<li><a href="#orgbe80245">4.2.6.1. Get</a></li>
<li><a href="#org209f6f0">4.2.6.2. Compute</a></li>
</ul>
</li>
<li><a href="#org399976b">4.2.7. Force of \(\delta P\) matrix</a>
<ul>
<li><a href="#orgd450d68">4.2.7.1. Get</a></li>
<li><a href="#org2643f21">4.2.7.2. Compute</a></li>
</ul>
</li>
<li><a href="#orgb37c61b">4.2.8. Force of single electron-electron-nucleus Jastrow value</a>
<ul>
<li><a href="#orgcd33219">4.2.8.1. Get</a></li>
<li><a href="#org41a04d7">4.2.8.2. Compute</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><a href="#org8c04d8b">5. Forces of the orbitals</a>
<ul>
<li><a href="#org21630fb">5.1. Force of AO value</a>
<ul>
<li><a href="#org8280aab">5.1.1. Get</a></li>
<li><a href="#org224a093">5.1.2. Compute</a></li>
</ul>
</li>
<li><a href="#org0d71afb">5.2. Force of MO value</a>
<ul>
<li><a href="#orga011cc4">5.2.1. Get</a></li>
<li><a href="#org1ced40f">5.2.2. Compute</a></li>
</ul>
</li>
<li><a href="#org68fe41e">5.3. Force of MO gradient</a>
<ul>
<li><a href="#orgfba1f64">5.3.1. Get</a></li>
<li><a href="#org380d151">5.3.2. Compute</a></li>
</ul>
</li>
<li><a href="#orgae9357c">5.4. Force of MO Laplacian</a>
<ul>
<li><a href="#org1f3de9c">5.4.1. Get</a></li>
<li><a href="#org9fe509c">5.4.2. Compute</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div id="outline-container-org47f554b" class="outline-2">
<h2 id="org47f554b"><span class="section-number-2">1.</span> Introduction</h2>
<div class="outline-text-2" id="text-1">
<p>
To calculate interatomic forces, a derivative (with respect to nuclei) of the values, gradient and Laplacian of the Jastrow and the molecular orbitals (MO) is required.
Furthermore, for the nonlocal pseudopotential, also the forces of the values of the single-electron move Jastrows are required.
</p>
</div>
</div>
<div id="outline-container-orge8b694c" class="outline-2">
<h2 id="orge8b694c"><span class="section-number-2">2.</span> Context</h2>
<div class="outline-text-2" id="text-2">
</div>
<div id="outline-container-org8919d2f" class="outline-3">
<h3 id="org8919d2f"><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_forces_struct</span>{
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_jastrow_en</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_jastrow_en_date</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_jastrow_en_g</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_jastrow_en_g_date</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_jastrow_en_l</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_jastrow_en_l_date</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_tmp_c</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_tmp_c_date</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_dtmp_c</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_dtmp_c_date</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_een_n</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_een_n_date</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_jastrow_een</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_jastrow_een_date</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_jastrow_een_g</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_jastrow_een_g_date</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_jastrow_een_l</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_jastrow_een_l_date</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_ao_value</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_ao_value_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_ao_value_maxsize</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_mo_value</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_mo_value_date</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_mo_value_maxsize</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_mo_g</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_mo_g_date</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_mo_l</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_mo_l_date</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">forces_jastrow_single_en</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_jastrow_single_en_date</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">forces_jastrow_single_een</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_jastrow_single_een_date</span>;
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">forces_delta_p</span>;
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_delta_p_date</span>;
} <span style="color: #228b22;">qmckl_forces_struct</span>;
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org4fd236e" class="outline-2">
<h2 id="org4fd236e"><span class="section-number-2">3.</span> Finite-difference function</h2>
<div class="outline-text-2" id="text-3">
<p>
We introduce here a general function to compute the derivatives of any quantity with respect to nuclear coordinates.
using finite-differences.
</p>
<div class="org-src-container">
<pre class="src src-c">
<span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_finite_difference_deriv_n</span>(
<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span> <span style="color: #a0522d;">delta_x</span>,
<span style="color: #228b22;">function_callback</span> <span style="color: #a0522d;">get_function</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">derivative_output</span>,
<span style="color: #228b22;">int64_t</span> <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">size</span>)
{
// <span style="color: #b22222;">Finite difference coefficients for a 9-point stencil</span>
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">coef</span>[9] = { 1.0/280.0, -4.0/105.0, 1.0/5.0, -4.0/5.0, 0.0, 4.0/5.0, -1.0/5.0, 4.0/105.0, -1.0/280.0 };
<span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #a0522d;">rc</span>;
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span>;
rc = qmckl_get_electron_walk_num(context, &amp;walk_num);
<span style="color: #a020f0;">if</span> (rc != QMCKL_SUCCESS) {
<span style="color: #a020f0;">return</span> rc;
}
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nucl_num</span>;
rc = qmckl_get_nucleus_num(context, &amp;nucl_num);
<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;">nucleus_coord</span> = (<span style="color: #228b22;">double</span>*) malloc(3 * nucl_num * <span style="color: #a020f0;">sizeof</span>(<span style="color: #228b22;">double</span>));
<span style="color: #a020f0;">if</span> (nucleus_coord == <span style="color: #008b8b;">NULL</span>) {
<span style="color: #a020f0;">return</span> QMCKL_ALLOCATION_FAILED;
}
rc = qmckl_get_nucleus_coord (context, <span style="color: #8b2252;">'N'</span>, nucleus_coord, 3*nucl_num);
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">temp_coord</span> = (<span style="color: #228b22;">double</span>*) malloc(3 * nucl_num * <span style="color: #a020f0;">sizeof</span>(<span style="color: #228b22;">double</span>));
<span style="color: #a020f0;">if</span> (temp_coord == <span style="color: #008b8b;">NULL</span>) {
free(nucleus_coord);
<span style="color: #a020f0;">return</span> QMCKL_ALLOCATION_FAILED;
}
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">function_values</span> = (<span style="color: #228b22;">double</span>*) malloc(walk_num*size * <span style="color: #a020f0;">sizeof</span>(<span style="color: #228b22;">double</span>));
<span style="color: #a020f0;">if</span> (function_values == <span style="color: #008b8b;">NULL</span>) {
free(nucleus_coord);
free(temp_coord);
<span style="color: #a020f0;">return</span> QMCKL_ALLOCATION_FAILED;
}
memset(derivative_output, 0, nucl_num*3*walk_num*size*<span style="color: #a020f0;">sizeof</span>(<span style="color: #228b22;">double</span>));
// <span style="color: #b22222;">Copy original coordinates</span>
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i &lt; 3 * nucl_num; i++) {
temp_coord[i] = nucleus_coord[i];
}
<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;">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;">m</span> = -4; m &lt;= 4; m++) {
// <span style="color: #b22222;">Apply finite difference displacement</span>
temp_coord[k+a*3] = nucleus_coord[k+3*a] + (<span style="color: #228b22;">double</span>) <span style="color: #228b22;">m</span> * <span style="color: #a0522d;">delta_x</span>;
// <span style="color: #b22222;">Update coordinates in the context</span>
rc = qmckl_set_nucleus_coord(context, <span style="color: #8b2252;">'N'</span>, temp_coord, 3*nucl_num);
assert(rc == QMCKL_SUCCESS);
rc = qmckl_context_touch(context);
assert(rc == QMCKL_SUCCESS);
rc = qmckl_single_touch(context);
assert(rc == QMCKL_SUCCESS);
// <span style="color: #b22222;">Call the provided function</span>
rc = get_function(context, function_values, walk_num*size);
assert(rc == QMCKL_SUCCESS);
// <span style="color: #b22222;">Accumulate derivative using finite-difference coefficients</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;">int64_t</span> <span style="color: #a0522d;">shift</span> = nucl_num*3*size*nw + size*(k + 3*a);
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">i</span> = 0; i &lt; size; i++) {
derivative_output[i+shift] += coef[m + 4] * function_values[nw*size+i];
}
}
}
temp_coord[k+a*3] = nucleus_coord[k+3*a];
}
}
// <span style="color: #b22222;">Reset coordinates in the context</span>
rc = qmckl_set_nucleus_coord(context, <span style="color: #8b2252;">'N'</span>, temp_coord, 3*nucl_num);
assert(rc == QMCKL_SUCCESS);
rc = qmckl_context_touch(context);
assert(rc == QMCKL_SUCCESS);
// <span style="color: #b22222;">Normalize by the step size</span>
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">i</span> = 0; i &lt; size*3*nucl_num*walk_num ; i++) {
derivative_output[i] /= delta_x;
}
free(nucleus_coord);
free(temp_coord);
free(function_values);
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
}
</pre>
</div>
</div>
</div>
<div id="outline-container-org114f4f1" class="outline-2">
<h2 id="org114f4f1"><span class="section-number-2">4.</span> Forces of the Jastrow function</h2>
<div class="outline-text-2" id="text-4">
<p>
For the forces of the Jastrow function, there is only a contribution from the electron-nucleus and electron-electron-nucleus Jastrow, since the electron-electron Jastrow does not depend on nuclear coordinates.
</p>
</div>
<div id="outline-container-org595b30f" class="outline-3">
<h3 id="org595b30f"><span class="section-number-3">4.1.</span> Electron-nucleus Jastrow</h3>
<div class="outline-text-3" id="text-4-1">
</div>
<div id="outline-container-org7286fd0" class="outline-4">
<h4 id="org7286fd0"><span class="section-number-4">4.1.1.</span> Force of electron-nucleus Jastrow value</h4>
<div class="outline-text-4" id="text-4-1-1">
<p>
Calculates the force of the electron-nucleus Jastrow value.
The terms of the force of the electron-nucleus Jastrow value are identical to the gradient of this Jastrow, up to a minus sign.
\[
\partial_{\alpha,m} J_{en} = -\sum_i \left( \frac{a_1 \partial_{i,m} \widetilde{R}_{i\alpha}}{(1+a_2 \widetilde{R}_{i\alpha} )^2} + \sum_{k=2}^{N_\text{aord}} a_k k \widetilde{R}_{i\alpha}^{k-1} \partial_{i,m} \widetilde{R}_{i\alpha} \right)
\]
</p>
</div>
<div id="outline-container-orgadf9483" class="outline-5">
<h5 id="orgadf9483"><span class="section-number-5">4.1.1.1.</span> Get</h5>
<div class="outline-text-5" id="text-4-1-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_forces_jastrow_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;">forces_jastrow_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_forces_jastrow_en</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> forces_jastrow_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;"> forces_jastrow_en(size_max)</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_forces_jastrow_en</span>
<span style="color: #a020f0;">end interface</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org602b80d" class="outline-5">
<h5 id="org602b80d"><span class="section-number-5">4.1.1.2.</span> Compute</h5>
<div class="outline-text-5" id="text-4-1-1-2">
<table id="org2c6c58d" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of 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 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 distance derivatives</td>
</tr>
<tr>
<td class="org-left"><code>forces_jastrow_en</code></td>
<td class="org-left"><code>double[walk_num][nucl_num][3]</code></td>
<td class="org-left">out</td>
<td class="org-left">Electron-nucleus forces</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_forces_jastrow_en_doc</span>( <span style="color: #a020f0;">&amp;</span>
context, walk_num, elec_num, nucl_num, type_nucl_num, <span style="color: #a020f0;">&amp;</span>
type_nucl_vector, aord_num, a_vector, <span style="color: #a020f0;">&amp;</span>
en_distance_rescaled, en_distance_rescaled_gl, forces_jastrow_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;"> 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>(out) ::<span style="color: #a0522d;"> forces_jastrow_en(3,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, a, k, nw, ii</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, x1, kf</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;"> dx(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> (walk_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (aord_num &lt; 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_7
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">do</span> nw =1, walk_num
forces_jastrow_en(:,:,nw) = 0.0d0
<span style="color: #a020f0;">do</span> a = 1, nucl_num
<span style="color: #a020f0;">do</span> i = 1, elec_num
x = en_distance_rescaled(i,a,nw)
<span style="color: #a020f0;">if</span>(<span style="color: #a020f0;">abs</span>(x) &lt; 1.d-12) <span style="color: #a020f0;">continue</span>
denom = 1.0d0 + a_vector(2, type_nucl_vector(a)+1) * x
invdenom = 1.0d0 / denom
invdenom2 = invdenom*invdenom
dx(1) = -en_distance_rescaled_gl(1,i,a,nw)
dx(2) = -en_distance_rescaled_gl(2,i,a,nw)
dx(3) = -en_distance_rescaled_gl(3,i,a,nw)
f = a_vector(1, type_nucl_vector(a)+1) * invdenom2
forces_jastrow_en(1,a,nw) = forces_jastrow_en(1,a,nw) + f * dx(1)
forces_jastrow_en(2,a,nw) = forces_jastrow_en(2,a,nw) + f * dx(2)
forces_jastrow_en(3,a,nw) = forces_jastrow_en(3,a,nw) + f * dx(3)
kf = 2.d0
x1 = x
x = 1.d0
<span style="color: #a020f0;">do</span> k=2, aord_num
f = a_vector(k+1,type_nucl_vector(a)+1) * kf * x
forces_jastrow_en(1,a,nw) = forces_jastrow_en(1,a,nw) + f * x1 * dx(1)
forces_jastrow_en(2,a,nw) = forces_jastrow_en(2,a,nw) + f * x1 * dx(2)
forces_jastrow_en(3,a,nw) = forces_jastrow_en(3,a,nw) + f * x1 * dx(3)
x = x*x1
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 do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_en_doc</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgd6519a5" class="outline-4">
<h4 id="orgd6519a5"><span class="section-number-4">4.1.2.</span> Force of electron-nucleus Jastrow gradient</h4>
<div class="outline-text-4" id="text-4-1-2">
<p>
To avoid having to create new arrays for the Hessian of the rescaled distances, we compute parts of it manually in this routine.
</p>
\begin{eqnarray}
\partial_{\alpha,m} \partial_{i,n} J_{en} & = \frac{a_1 \partial_{\alpha,m} \partial_{i,n} \widetilde{R}_{i\alpha} }{(1+a_2 \widetilde{R}_{i\alpha})^2} - 2 \frac{a_1 a_2 \partial_{\alpha,m} \widetilde{R}_{i\alpha} \partial_{i,n} \widetilde{R}_{i\alpha}}{(1+a_2 \widetilde{R}_{i\alpha})^3} + \sum_{k=2}^{N_\text{aord}} a_k k \left((k-1) \widetilde{R}_{i\alpha}^{k-2} \partial_{\alpha,m} \widetilde{R}_{i\alpha} \partial_{i,n} \widetilde{R}_{i\alpha} + \widetilde{R}_{i\alpha}^{k-1} \partial_{\alpha,m}\partial_{i,n} \widetilde{R}_{i\alpha} \right) \\
& = -\frac{a_1 e^{-\kappa R_{i\alpha}}}{R_{i\alpha }(1+a_2 \widetilde{R}_{i\alpha})^2} + \frac{a_1 \partial_{i,m} \widetilde{R}_{i\alpha} \partial_{i,n} \widetilde{R}_{i\alpha} }{(1+a_2 \widetilde{R}_{i\alpha})^2}\left (\frac{e^{\kappa R_{i\alpha}}}{R_{i\alpha}} + \kappa e^{\kappa R_{i\alpha}} \right) + 2 \frac{a_1 a_2 \partial_{i,m} \widetilde{R}_{i\alpha} \partial_{i,n} \widetilde{R}_{i\alpha}}{(1+a_2 \widetilde{R}_{i\alpha})^3} \\
&- \sum_{k=2}^{N_\text{aord}} a_k k \left((k-1) \widetilde{R}_{i\alpha}^{k-2} \partial_{\alpha,m} \widetilde{R}_{i\alpha} \partial_{i,n} \widetilde{R}_{i\alpha} - \widetilde{R}_{i\alpha}^{k-1} \partial_{i,m}\widetilde{R}_{i\alpha}\partial_{i,n} \widetilde{R}_{i\alpha} e^{\kappa R_{i\alpha}} (\kappa + \frac{1}{R_{i\alpha}}) + \delta_{n,m} e^{-\kappa R_{i\alpha}}\frac{1}{R_{i\alpha}} \right)\\
\end{eqnarray}
</div>
<div id="outline-container-orgb48fadf" class="outline-5">
<h5 id="orgb48fadf"><span class="section-number-5">4.1.2.1.</span> Get</h5>
<div class="outline-text-5" id="text-4-1-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_forces_jastrow_en_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;">forces_jastrow_en_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_forces_jastrow_en_g</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> forces_jastrow_en_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;"> forces_jastrow_en_g(size_max)</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_forces_jastrow_en_g</span>
<span style="color: #a020f0;">end interface</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org2ac9492" class="outline-5">
<h5 id="org2ac9492"><span class="section-number-5">4.1.2.2.</span> Compute</h5>
<div class="outline-text-5" id="text-4-1-2-2">
<table id="org6ddf5b3" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of 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>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">Rescale factor for electron-nucleus</td>
</tr>
<tr>
<td class="org-left"><code>en_distance</code></td>
<td class="org-left"><code>double[walk_num][elec_num][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus distances</td>
</tr>
<tr>
<td class="org-left"><code>en_distance_rescaled</code></td>
<td class="org-left"><code>double[walk_num][nucl_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus distances</td>
</tr>
<tr>
<td class="org-left"><code>en_distance_rescaled_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 distance derivatives</td>
</tr>
<tr>
<td class="org-left"><code>forces_jastrow_en_g</code></td>
<td class="org-left"><code>double[walk_num][nucl_num][3][elec_num][3]</code></td>
<td class="org-left">out</td>
<td class="org-left">Force of electron-nucleus gradient</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_forces_jastrow_en_g_doc</span>( <span style="color: #a020f0;">&amp;</span>
context, walk_num, elec_num, nucl_num, type_nucl_num, <span style="color: #a020f0;">&amp;</span>
type_nucl_vector, aord_num, a_vector, rescale_factor_en, en_distance, <span style="color: #a020f0;">&amp;</span>
en_distance_rescaled, en_distance_rescaled_gl, forces_jastrow_en_g) <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;"> 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;"> 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;"> en_distance(nucl_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;"> 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>(out) ::<span style="color: #a0522d;"> forces_jastrow_en_g(3,elec_num,3,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, a, k, nw, ii, m,l</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, x1, kf</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> denom, invdenom, invdenom2, f, f2, expk, invdist</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> dx(4)</span>
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (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
forces_jastrow_en_g(:,:,:,:,nw) = 0.0d0
<span style="color: #a020f0;">do</span> a = 1, nucl_num
<span style="color: #a020f0;">do</span> i = 1, elec_num
expk = dexp(rescale_factor_en(type_nucl_vector(a)+1) * en_distance(a,i,nw))
invdist = 1.d0 / en_distance(a,i,nw)
x = en_distance_rescaled(i,a,nw)
<span style="color: #a020f0;">if</span>(<span style="color: #a020f0;">abs</span>(x) &lt; 1.d-12) <span style="color: #a020f0;">continue</span>
denom = 1.0d0 + a_vector(2, type_nucl_vector(a)+1) * x
invdenom = 1.0d0 / denom
invdenom2 = invdenom*invdenom
f = a_vector(1, type_nucl_vector(a)+1) * invdenom2
<span style="color: #a020f0;">do</span> m = 1, 3
dx(m) = en_distance_rescaled_gl(m,i,a,nw)
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">do</span> m = 1, 3
<span style="color: #a020f0;">do</span> l = 1,3
<span style="color: #a020f0;">if</span> (m == l) <span style="color: #a020f0;">then</span>
forces_jastrow_en_g(m,i,l,a,nw) = forces_jastrow_en_g(m,i,l,a,nw) - f * invdist / expk
<span style="color: #a020f0;">end if</span>
forces_jastrow_en_g(m,i,l,a,nw) = forces_jastrow_en_g(m,i,l,a,nw) + <span style="color: #a020f0;">&amp;</span>
f * dx(m) * dx(l) * expk * (invdist + rescale_factor_en(type_nucl_vector(a)+1))
forces_jastrow_en_g(m,i,l,a,nw) = forces_jastrow_en_g(m,i,l,a,nw) + 2.d0 * f * invdenom * <span style="color: #a020f0;">&amp;</span>
a_vector(2, type_nucl_vector(a)+1) * dx(m) * dx(l)
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
kf = 2.d0
x1 = x
x = 1.d0
<span style="color: #a020f0;">do</span> k=2, aord_num
f = a_vector(k+1,type_nucl_vector(a)+1) * kf * x
f2 = a_vector(k+1,type_nucl_vector(a)+1) * kf * x * (kf-1.d0)
<span style="color: #a020f0;">do</span> m = 1, 3
<span style="color: #a020f0;">do</span> l = 1, 3
<span style="color: #a020f0;">if</span> (m == l) <span style="color: #a020f0;">then</span>
forces_jastrow_en_g(m,i,l,a,nw) = forces_jastrow_en_g(m,i,l,a,nw) - f * x1 * invdist / expk
<span style="color: #a020f0;">end if</span>
forces_jastrow_en_g(m,i,l,a,nw) = forces_jastrow_en_g(m,i,l,a,nw) - f2 * dx(m) * dx(l) <span style="color: #a020f0;">&amp;</span>
+ f * x1 * dx(m) * dx(l) * rescale_factor_en(type_nucl_vector(a)+1) * expk <span style="color: #a020f0;">&amp;</span>
+ f * x1 * dx(m) * dx(l) * invdist * expk
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
x = x*x1
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 do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_en_g_doc</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgb580725" class="outline-4">
<h4 id="orgb580725"><span class="section-number-4">4.1.3.</span> Force of electron-nucleus Jastrow Laplacian</h4>
<div class="outline-text-4" id="text-4-1-3">
<p>
Calculates the force of the electron-nucleus Jastrow Laplacian.
To avoid having to calculate higher order derivatives of the rescaled distances elsewhere, the neccessery terms are calcuculated on the fly.
</p>
\begin{eqnarray}
\partial_{\alpha,m} \nabla^2 J_{en} =& \sum_i \left(\partial_{\alpha,m}\frac{a_1 \nabla^2 \widetilde{R}_{i\alpha}}{(1+a_2 \widetilde{R}_{i\alpha})^2} - \partial_{\alpha,m} \frac{2a_1a_2 (\nabla\widetilde{R}_{i\alpha}\cdot \nabla \widetilde{R}_{i\alpha})}{(1+a_2\widetilde{R}_{i\alpha})^3} + \partial_{\alpha,m} \sum_{k=2}^{N_\text{aord}} a_k k \left( \widetilde{R}_{i\alpha}^{k-1} \nabla^2\widetilde{R}_{i\alpha} + (k-1)\widetilde{R}_{i\alpha}^{k-2} (\nabla \widetilde{R}_{i\alpha}\cdot \nabla \widetilde{R}_{i\alpha} ) \right) \right)\\
=&\sum_i \left( \frac{a_1 \partial_{i,m} \widetilde{R}_{i\alpha}}{(1+a_2 \widetilde{R}_{i\alpha})^2}\left( \frac{2\kappa}{R_{i\alpha}} - \kappa^2 + \frac{2}{R^2_{i\alpha}}\right) + \frac{2a_1a_2\partial_{i,m}\widetilde{R}_{i\alpha}\nabla^2\widetilde{R}_{i\alpha}}{(1+a_2 \widetilde{R}_{i\alpha})^3} - \frac{4a_1a_2\kappa e^{-\kappa R_{i\alpha}}\partial_{i,m}\widetilde{R}_{i\alpha}}{(1+a_2 \widetilde{R}_{i\alpha})^3} - \frac{6 a_1 a_2^2 (\nabla \widetilde{R}_{i\alpha} \cdot \nabla \widetilde{R}_{i\alpha})\partial_{i,m}\widetilde{R}_{i\alpha}}{(1+a_2 \widetilde{R}_{i\alpha})^4} \right.\\
&\left.+ \sum_{k=2}^{N_\text{aord}} a_k k \left( -(k-1) \widetilde{R}_{i\alpha}^{k-2}\partial_{i,m}\widetilde{R}_{i\alpha} \nabla^2\widetilde{R}_{i\alpha} + \widetilde{R}_{i\alpha}^{k-1}\partial_{i,m}\widetilde{R}_{i\alpha}\left(\frac{2\kappa}{R_{i\alpha}} - \kappa^2 + \frac{2}{R_{i\alpha}^2} \right) - (k-1)(k-2)\widetilde{R}_{i\alpha}^{k-3}\partial_{i,m}\widetilde{R}_{i\alpha}(\nabla\widetilde{R}_{i\alpha} \cdot \nabla \widetilde{R}_{i\alpha}) + 2\kappa(k-1)\widetilde{R}_{i\alpha}^{k-2} e^{-\kappa R_{i\alpha}} \partial_{i,m}\widetilde{R}_{i\alpha} \right) \right)
\end{eqnarray}
</div>
<div id="outline-container-org2401312" class="outline-5">
<h5 id="org2401312"><span class="section-number-5">4.1.3.1.</span> Get</h5>
<div class="outline-text-5" id="text-4-1-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_forces_jastrow_en_l</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;">forces_jastrow_en_l</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_forces_jastrow_en_l</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> forces_jastrow_en_l, 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;"> forces_jastrow_en_l(size_max)</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_forces_jastrow_en_l</span>
<span style="color: #a020f0;">end interface</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org4f0a529" class="outline-5">
<h5 id="org4f0a529"><span class="section-number-5">4.1.3.2.</span> Compute</h5>
<div class="outline-text-5" id="text-4-1-3-2">
<table id="org23851cf" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of 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>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">Rescale factor for electron-nucleus</td>
</tr>
<tr>
<td class="org-left"><code>en_distance</code></td>
<td class="org-left"><code>double[walk_num][elec_num][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus distances</td>
</tr>
<tr>
<td class="org-left"><code>en_distance_rescaled</code></td>
<td class="org-left"><code>double[walk_num][nucl_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus distances</td>
</tr>
<tr>
<td class="org-left"><code>en_distance_rescaled_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 distance derivatives</td>
</tr>
<tr>
<td class="org-left"><code>forces_jastrow_en_l</code></td>
<td class="org-left"><code>double[walk_num][nucl_num][3]</code></td>
<td class="org-left">out</td>
<td class="org-left">Forces of electron-nucleus 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_forces_jastrow_en_l_doc</span>( <span style="color: #a020f0;">&amp;</span>
context, walk_num, elec_num, nucl_num, type_nucl_num, <span style="color: #a020f0;">&amp;</span>
type_nucl_vector, aord_num, a_vector, rescale_factor_en, en_distance, <span style="color: #a020f0;">&amp;</span>
en_distance_rescaled, en_distance_rescaled_gl, forces_jastrow_en_l) <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;"> 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;"> 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;"> en_distance(nucl_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;"> 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>(out) ::<span style="color: #a0522d;"> forces_jastrow_en_l(3,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, a, k, nw, ii, m,l</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, x1, kf, grad_c2</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> denom, invdenom, invdenom2, f, f2, expk, invdist</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> dx(4)</span>
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (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
forces_jastrow_en_l(:,:,nw) = 0.0d0
<span style="color: #a020f0;">do</span> a = 1, nucl_num
<span style="color: #a020f0;">do</span> i = 1, elec_num
expk = dexp(rescale_factor_en(type_nucl_vector(a)+1) * en_distance(a,i,nw))
invdist = 1.d0 / en_distance(a,i,nw)
x = en_distance_rescaled(i,a,nw)
<span style="color: #a020f0;">if</span>(<span style="color: #a020f0;">abs</span>(x) &lt; 1.d-12) <span style="color: #a020f0;">continue</span>
denom = 1.0d0 + a_vector(2, type_nucl_vector(a)+1) * x
invdenom = 1.0d0 / denom
invdenom2 = invdenom*invdenom
f = a_vector(1, type_nucl_vector(a)+1) * invdenom2
<span style="color: #a020f0;">do</span> m = 1, 4
dx(m) = en_distance_rescaled_gl(m,i,a,nw)
<span style="color: #a020f0;">end do</span>
grad_c2 = dx(1)*dx(1) + dx(2)*dx(2) + dx(3)*dx(3)
<span style="color: #a020f0;">do</span> m = 1, 3
forces_jastrow_en_l(m,a,nw) = forces_jastrow_en_l(m,a,nw) + f * dx(m) * <span style="color: #a020f0;">&amp;</span>
(rescale_factor_en(type_nucl_vector(a)+1) <span style="color: #a020f0;">&amp;</span>
* (2 *invdist - rescale_factor_en(type_nucl_vector(a)+1)) + 2*invdist*invdist)
forces_jastrow_en_l(m,a,nw) = forces_jastrow_en_l(m,a,nw) + 2.d0 * f <span style="color: #a020f0;">&amp;</span>
* invdenom * a_vector(2, type_nucl_vector(a)+1) * dx(m) * dx(4)
forces_jastrow_en_l(m,a,nw) = forces_jastrow_en_l(m,a,nw) - 4.d0 * f <span style="color: #a020f0;">&amp;</span>
* invdenom * a_vector(2, type_nucl_vector(a)+1) * rescale_factor_en(type_nucl_vector(a)+1) <span style="color: #a020f0;">&amp;</span>
* dx(m)/expk
forces_jastrow_en_l(m,a,nw) = forces_jastrow_en_l(m,a,nw) - 6.d0 * f <span style="color: #a020f0;">&amp;</span>
* invdenom * invdenom * a_vector(2, type_nucl_vector(a)+1) * a_vector(2, type_nucl_vector(a)+1) <span style="color: #a020f0;">&amp;</span>
* grad_c2 * dx(m)
<span style="color: #a020f0;">end do</span>
kf = 2.d0
x1 = x
x = 1.d0
<span style="color: #a020f0;">do</span> k=2, aord_num
f = a_vector(k+1,type_nucl_vector(a)+1) * kf * x
<span style="color: #a020f0;">do</span> m = 1, 3
forces_jastrow_en_l(m,a,nw) = forces_jastrow_en_l(m,a,nw) <span style="color: #a020f0;">&amp;</span>
- f * dx(m) * dx(4) * (kf-1.d0) <span style="color: #a020f0;">&amp;</span>
- f / x1 * (kf-1.d0) * (kf-2.d0) * dx(m) /expk /expk <span style="color: #a020f0;">&amp;</span>
+ f * x1 * rescale_factor_en(type_nucl_vector(a)+1) * dx(m) * dx(4) * expk <span style="color: #a020f0;">&amp;</span>
+ f * x1 * 2 * dx(m) * invdist * invdist <span style="color: #a020f0;">&amp;</span>
+ 2 * f * (kf-1.d0) * dx(m) * rescale_factor_en(type_nucl_vector(a)+1) / expk
<span style="color: #a020f0;">end do</span>
x = x*x1
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 do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_en_l_doc</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgc322296" class="outline-4">
<h4 id="orgc322296"><span class="section-number-4">4.1.4.</span> Force of single electron-nucleus Jastrow value</h4>
<div class="outline-text-4" id="text-4-1-4">
<p>
Calculate the force of the single-electron contribution ot the electron-nucleus Jastrow value.
\[
\delta\partial_{\alpha,m} J_{en} = -\left( \frac{a_1 \partial_{i,m} \widetilde{R}_{i\alpha}^{\text{new}}}{(1+a_2 \widetilde{R}_{i\alpha}^{\text{new}} )^2} + \sum_{k=2}^{N_\text{aord}} a_k k {\widetilde{R}_{i\alpha}^{\text{new}}}^{k-1} \partial_{i,m} \widetilde{R}_{i\alpha}^{\text{new}} \right) + \left( \frac{a_1 \partial_{i,m} \widetilde{R}_{i\alpha}^{\text{old}}}{(1+a_2 \widetilde{R}_{i\alpha}^{\text{old}} )^2} + \sum_{k=2}^{N_\text{aord}} a_k k {\widetilde{R}_{i\alpha}^{\text{old}}}^{k-1} \partial_{i,m} \widetilde{R}_{i\alpha}^{\text{old}} \right)
\]
</p>
<p>
The function <code>qmckl_set_single_point</code> has to be called before this function to set the new electron position.
</p>
</div>
<div id="outline-container-org2f9a044" class="outline-5">
<h5 id="org2f9a044"><span class="section-number-5">4.1.4.1.</span> Get</h5>
<div class="outline-text-5" id="text-4-1-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_forces_jastrow_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;">forces_jastrow_single_en</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf001a60" class="outline-5">
<h5 id="orgf001a60"><span class="section-number-5">4.1.4.2.</span> Compute</h5>
<div class="outline-text-5" id="text-4-1-4-2">
<table id="orgc842e2c" 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>forces_jastrow_single_en</code></td>
<td class="org-left"><code>double[walk_num][nucl_num][3]</code></td>
<td class="org-left">out</td>
<td class="org-left">Single electron-nucleus forces</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_forces_jastrow_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_distance_rescaled_gl, en_rescaled_single, en_rescaled_single_gl, forces_jastrow_single_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_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;"> forces_jastrow_single_en(3,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, 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;"> dx(3), dx_old(3)</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
forces_jastrow_single_en(:,:,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_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)
f = a_vector(1, type_nucl_vector(a)+1) * invdenom2
f_old = a_vector(1, type_nucl_vector(a)+1) * invdenom2_old
forces_jastrow_single_en(1,a,nw) = forces_jastrow_single_en(1,a,nw) + f * dx(1) - f_old * dx_old(1)
forces_jastrow_single_en(2,a,nw) = forces_jastrow_single_en(2,a,nw) + f * dx(2) - f_old * dx_old(2)
forces_jastrow_single_en(3,a,nw) = forces_jastrow_single_en(3,a,nw) + f * dx(3) - f_old * dx_old(3)
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
forces_jastrow_single_en(1,a,nw) = forces_jastrow_single_en(1,a,nw) + f * x1 * dx(1) - f_old * x1_old * dx_old(1)
forces_jastrow_single_en(2,a,nw) = forces_jastrow_single_en(2,a,nw) + f * x1 * dx(2) - f_old * x1_old * dx_old(2)
forces_jastrow_single_en(3,a,nw) = forces_jastrow_single_en(3,a,nw) + f * x1 * dx(3) - f_old * x1_old * dx_old(3)
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_forces_jastrow_single_en_doc</span>
</pre>
</div>
</div>
</div>
</div>
</div>
<div id="outline-container-orgf5dd455" class="outline-3">
<h3 id="orgf5dd455"><span class="section-number-3">4.2.</span> Electron-electron-nucleus Jastrow</h3>
<div class="outline-text-3" id="text-4-2">
</div>
<div id="outline-container-orgd3d751d" class="outline-4">
<h4 id="orgd3d751d"><span class="section-number-4">4.2.1.</span> Force of P matrix</h4>
<div class="outline-text-4" id="text-4-2-1">
<p>
Calculates the force of the P matrix. This is a required component to calculate the force on the 3-body Jastrow.
\[
\partial_{\alpha,m} P_{i,\alpha,k,l} = \sum_j \widetilde{r}_{i,j,k} \partial_{\alpha,m}\widetilde{R}_{j,\alpha,l} = -\sum_j \widetilde{r}_{i,j,k} \partial_{j,m}\widetilde{R}_{j,\alpha,l}
\]
</p>
</div>
<div id="outline-container-orgc9b5792" class="outline-5">
<h5 id="orgc9b5792"><span class="section-number-5">4.2.1.1.</span> Get</h5>
<div class="outline-text-5" id="text-4-2-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_forces_tmp_c</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_tmp_c</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-org70f0661" class="outline-5">
<h5 id="org70f0661"><span class="section-number-5">4.2.1.2.</span> Compute</h5>
<div class="outline-text-5" id="text-4-2-1-2">
<table id="orgc6e6f84" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of 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_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-nucleus rescaled</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 derivatives</td>
</tr>
<tr>
<td class="org-left"><code>forces_tmp_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">out</td>
<td class="org-left">Force on the P matrix</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_forces_tmp_c</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> context, walk_num, elec_num, nucl_num, cord_num,</span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> een_rescaled_e, een_rescaled_n_gl, forces_tmp_c) </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;"> 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_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_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>(out) ::<span style="color: #a0522d;"> forces_tmp_c(elec_num, 4, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> nw, i</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> l, m, k, a,j</span>
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_2
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">if</span> (cord_num &lt; 0) info = QMCKL_INVALID_ARG_5
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <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
info = qmckl_dgemm(context,<span style="color: #8b2252;">'N'</span>,<span style="color: #8b2252;">'N'</span>,elec_num*1_8,<span style="color: #a020f0;">&amp;</span>
nucl_num*(cord_num+1)*4_8, elec_num*1_8, -1.0d0, <span style="color: #a020f0;">&amp;</span>
een_rescaled_e(1,1,i,nw),1_8*elec_num, <span style="color: #a020f0;">&amp;</span>
een_rescaled_n_gl(1,1,1,0,nw),elec_num*1_8, <span style="color: #a020f0;">&amp;</span>
0.0d0, <span style="color: #a020f0;">&amp;</span>
forces_tmp_c(1,1,1,0,i,nw),1_8*elec_num)
<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_forces_tmp_c</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org6c17e6c" class="outline-4">
<h4 id="org6c17e6c"><span class="section-number-4">4.2.2.</span> Force of derivative of the \(P\) matrix</h4>
<div class="outline-text-4" id="text-4-2-2">
<p>
Calculates the force of the derivative of the \(P\) matrix.
\[
\partial_{\alpha,m} \partial_{i,n} P_{i,\alpha,k,l} = \sum_j \partial_{i,n} \widetilde{r}_{i,j,k} \partial_{\alpha,m}\widetilde{R}_{j,\alpha,l} = -\sum_j \partial_{i,n}\widetilde{r}_{i,j,k} \partial_{j,m}\widetilde{R}_{j,\alpha,l}
\]
</p>
</div>
<div id="outline-container-orgb69d90c" class="outline-5">
<h5 id="orgb69d90c"><span class="section-number-5">4.2.2.1.</span> Get</h5>
<div class="outline-text-5" id="text-4-2-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_forces_dtmp_c</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_dtmp_c</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-org7210b06" class="outline-5">
<h5 id="org7210b06"><span class="section-number-5">4.2.2.2.</span> Compute</h5>
<div class="outline-text-5" id="text-4-2-2-2">
<table id="orgf6b5b98" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of 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_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-nucleus rescaled</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 derivatives</td>
</tr>
<tr>
<td class="org-left"><code>forces_dtmp_c</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][4][nucl_num][4][elec_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Force of derivative of the P matrix</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_forces_dtmp_c_doc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> context, walk_num, elec_num, nucl_num, cord_num,</span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> een_rescaled_e_gl, een_rescaled_n_gl, forces_dtmp_c) </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;"> 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_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_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>(out) ::<span style="color: #a0522d;"> forces_dtmp_c(elec_num, 4, nucl_num,4,0:cord_num, 0:cord_num-1, walk_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> nw, i, k</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> l, m, a,j, kk</span>
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_2
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">if</span> (cord_num &lt; 0) info = QMCKL_INVALID_ARG_5
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">do</span> nw = 1, walk_num
<span style="color: #a020f0;">do</span> l = 0, cord_num-1
<span style="color: #a020f0;">do</span> m = 1, cord_num
<span style="color: #a020f0;">do</span> k = 1, 4
<span style="color: #a020f0;">do</span> a = 1, nucl_num
<span style="color: #a020f0;">do</span> kk = 1, 4
<span style="color: #a020f0;">do</span> i = 1, elec_num
forces_dtmp_c(i,kk,a,k,m,l,nw) = 0.d0
<span style="color: #a020f0;">do</span> j = 1, elec_num
forces_dtmp_c(i,kk,a,k,m,l,nw) = forces_dtmp_c(i,kk,a,k,m,l,nw) - <span style="color: #a020f0;">&amp;</span>
een_rescaled_e_gl(i,kk,j,l,nw) * een_rescaled_n_gl(j,k,a,m,nw)
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end 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_forces_dtmp_c_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_forces_dtmp_c_hpc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> context, walk_num, elec_num, nucl_num, cord_num,</span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> een_rescaled_e_gl, een_rescaled_n_gl, forces_dtmp_c) </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;"> 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_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_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>(out) ::<span style="color: #a0522d;"> forces_dtmp_c(elec_num, 4, nucl_num,4,0:cord_num, 0:cord_num-1, walk_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> nw, i, k</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> l, m, a,j, kk</span>
<span style="color: #228b22;">double precision</span>, <span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> tmp(:,:,:,:)</span>
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_2
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">if</span> (cord_num &lt; 0) info = QMCKL_INVALID_ARG_5
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">allocate</span>(tmp(elec_num, 4, 4, nucl_num))
<span style="color: #a020f0;">do</span> nw = 1, walk_num
<span style="color: #a020f0;">do</span> l = 0, cord_num-1
<span style="color: #a020f0;">do</span> m = 1, cord_num
info = qmckl_dgemm(context,<span style="color: #8b2252;">'N'</span>,<span style="color: #8b2252;">'N'</span>, elec_num*4, 4*nucl_num, elec_num, -1.d0, <span style="color: #a020f0;">&amp;</span>
een_rescaled_e_gl(1,1,1,l,nw), elec_num*4_8, <span style="color: #a020f0;">&amp;</span>
een_rescaled_n_gl(1,1,1,m,nw), elec_num, 0.d0, <span style="color: #a020f0;">&amp;</span>
tmp, elec_num*4_8)
<span style="color: #a020f0;">do</span> k = 1, 4
<span style="color: #a020f0;">do</span> a = 1, nucl_num
forces_dtmp_c(:,:,a,k,m,l,nw) = tmp(:,:,k,a)
<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;">deallocate</span>(tmp)
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_dtmp_c_hpc</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgce67295" class="outline-4">
<h4 id="orgce67295"><span class="section-number-4">4.2.3.</span> Force of electron-electron-nucleus Jastrow value</h4>
<div class="outline-text-4" id="text-4-2-3">
<p>
Calculates the force of the eleectron-electorn-nucleus Jastrow value.
\[
\partial_{\alpha,m}J_{een} = \sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}} c_{l,k,p,\alpha} \sum_{i=1}^{N_\text{elec}} \left(\widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{\alpha,m}P_{i\alpha,k,(p-k-l)/2} + \partial_{\alpha,m}\widetilde{R}_{i\alpha}^{(p-k+l)/2} P_{i\alpha,k,(p-k-l)/2}\right)
\]
</p>
</div>
<div id="outline-container-org5c39e4f" class="outline-5">
<h5 id="org5c39e4f"><span class="section-number-5">4.2.3.1.</span> Get</h5>
<div class="outline-text-5" id="text-4-2-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_forces_jastrow_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;">forces_jastrow_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_forces_jastrow_een</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> forces_jastrow_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;"> forces_jastrow_een(size_max)</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_forces_jastrow_een</span>
<span style="color: #a020f0;">end interface</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org605a445" class="outline-5">
<h5 id="org605a445"><span class="section-number-5">4.2.3.2.</span> Compute</h5>
<div class="outline-text-5" id="text-4-2-3-2">
<table id="orgc5aa9e6" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of 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>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</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 derivatives</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>forces_tmp_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">Force of P matrix</td>
</tr>
<tr>
<td class="org-left"><code>forces_jastrow_een</code></td>
<td class="org-left"><code>double[walk_num][nucl_num][3]</code></td>
<td class="org-left">out</td>
<td class="org-left">Force of electron-electron-nucleus Jastrow value</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_forces_jastrow_een</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> context, 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;"> een_rescaled_n, een_rescaled_n_gl, tmp_c, forces_tmp_c,forces_jastrow_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;"> 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;"> 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_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;"> 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;"> forces_tmp_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>(out) ::<span style="color: #a0522d;"> forces_jastrow_een(3, nucl_num, walk_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, p, m, n, nw, ii</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> accu, accu2, cn</span>
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">if</span> (cord_num &lt; 0) info = QMCKL_INVALID_ARG_5
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
forces_jastrow_een = 0.d0
<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> 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>
<span style="color: #a020f0;">do</span> j = 1, elec_num
<span style="color: #a020f0;">do</span> ii = 1, 3
accu = een_rescaled_n(j,a,m,nw) * forces_tmp_c(j,ii,a,m+l,k,nw) <span style="color: #a020f0;">&amp;</span>
- een_rescaled_n_gl(j,ii,a,m,nw) * tmp_c(j,a,m+l,k,nw)
forces_jastrow_een(ii, a, nw) = forces_jastrow_een(ii, a, 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 do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_een</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgb7f6d8e" class="outline-4">
<h4 id="orgb7f6d8e"><span class="section-number-4">4.2.4.</span> Force of derivatives of electron-nucleus rescaled distance</h4>
<div class="outline-text-4" id="text-4-2-4">
<p>
Calculates the force of the derivatives of the electron-nucleus rescaled distance.
</p>
\begin{eqnarray}
\partial_{\alpha,m}\partial_{i,n} \widetilde{R}_{i\alpha} =& \partial_{\alpha,m} \left( -\frac{r_{i,n} - R_{\alpha,n}}{R_{i\alpha}} \kappa l e^{-\kappa l R_{i\alpha}}\right)\\
=& - \frac{(r_{i,n} - R_{\alpha,n})(r_{i,m} - R_{\alpha,m})}{R_{i\alpha}^3}l\kappa e^{-\kappa l R_{i\alpha}} - \frac{(r_{i,n} - R_{\alpha,n})(r_{i,m} - R_{\alpha,m})}{R_{i\alpha}^2} \kappa^2 l^2 e^{-\kappa l R_{i\alpha}} + \delta_{n,m} \frac{1}{r}\kappa l e^{-\kappa l R_{i\alpha}}\\
\partial_{\alpha,m}\nabla^2 \widetilde{R}_{i\alpha} =& \partial_{\alpha,m} \left( \kappa l \left( \kappa l - \frac{2}{R_{i\alpha}}\right) e^{-\kappa l R_{i\alpha}}\right)\\
=&-2\kappa l \frac{r_{i,m} - R_{\alpha,m}}{R_{i\alpha}^3}e^{-\kappa l R_{i\alpha}} + \kappa^2 l^2 \left(\kappa l - \frac{2}{R_{i\alpha}} \right) \frac{r_{i,m}-R_{\alpha,m}}{R_{i\alpha}} e^{-\kappa l R_{i\alpha}}
\end{eqnarray}
</div>
<div id="outline-container-org6c8f54e" class="outline-5">
<h5 id="org6c8f54e"><span class="section-number-5">4.2.4.1.</span> Get</h5>
<div class="outline-text-5" id="text-4-2-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_forces_een_rescaled_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;">forces_een_n</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-org73699b6" class="outline-5">
<h5 id="org73699b6"><span class="section-number-5">4.2.4.2.</span> Compute</h5>
<div class="outline-text-5" id="text-4-2-4-2">
<table id="org6d4ed3a" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of atoms</td>
</tr>
<tr>
<td class="org-left"><code>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>en_distance</code></td>
<td class="org-left"><code>double[walk_num][elec_num][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus distances</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_n</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus 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 derivativies</td>
</tr>
<tr>
<td class="org-left"><code>forces_een_n</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][3][nucl_num][4][elec_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Force of electron-nucleus rescaled distances derivatives</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_forces_een_rescaled_n_gl</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> context, walk_num, elec_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, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> en_distance, een_rescaled_n, een_rescaled_n_gl,forces_een_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;"> walk_num, elec_num, nucl_num, type_nucl_num, cord_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;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_distance(nucl_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;"> 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_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>(out) ::<span style="color: #a0522d;"> forces_een_n(elec_num,4,nucl_num,3,0:cord_num,walk_num)</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, ria_inv, kappa_l, temp</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, k, l, nw, m, n</span>
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
<span style="color: #a020f0;">if</span> (cord_num &lt; 0) <span style="color: #a020f0;">then</span>
info = QMCKL_INVALID_ARG_5
<span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">endif</span>
!<span style="color: #b22222;">forces_een_n = 0.0d0</span>
!<span style="color: #b22222;">do nw = 1, walk_num</span>
! <span style="color: #b22222;">do l = 0, cord_num</span>
! <span style="color: #b22222;">do a = 1, nucl_num</span>
! <span style="color: #b22222;">kappa_l = dble(l)*rescale_factor_en(type_nucl_vector(a)+1)</span>
! <span style="color: #b22222;">do i = 1, elec_num</span>
! <span style="color: #b22222;">ria_inv = 1.0d0 / en_distance(a,i,nw)</span>
! <span style="color: #b22222;">do n = 1, 3</span>
! <span style="color: #b22222;">do m = 1, 3</span>
! <span style="color: #b22222;">if (m == n) then</span>
! <span style="color: #b22222;">forces_een_n(i,m,a,n,l,nw) = forces_een_n(i,m,a,n,l,nw) + &amp;</span>
! <span style="color: #b22222;">kappa_l*een_rescaled_n(i,a,l,nw) * ria_inv</span>
! <span style="color: #b22222;">end if</span>
! <span style="color: #b22222;">temp = een_rescaled_n_gl(i,m,a,l,nw) * een_rescaled_n_gl(i,n,a,l,nw) / een_rescaled_n(i,a,l,nw)</span>
! <span style="color: #b22222;">forces_een_n(i,m,a,n,l,nw) = forces_een_n(i,m,a,n,l,nw) - &amp;</span>
! <span style="color: #b22222;">temp * ria_inv / kappa_l - temp</span>
! <span style="color: #b22222;">end do</span>
! <span style="color: #b22222;">forces_een_n(i,4,a,n,l,nw) = forces_een_n(i,4,a,n,l,nw) + &amp;</span>
! <span style="color: #b22222;">(2.0d0 * ria_inv * ria_inv &amp;</span>
! <span style="color: #b22222;">- een_rescaled_n_gl(i,4,a,l,nw)/een_rescaled_n(i,a,l,nw)) * &amp;</span>
! <span style="color: #b22222;">een_rescaled_n_gl(i,n,a,l,nw)</span>
! <span style="color: #b22222;">end do</span>
! <span style="color: #b22222;">end do</span>
! <span style="color: #b22222;">end do</span>
! <span style="color: #b22222;">end do</span>
!<span style="color: #b22222;">end do</span>
forces_een_n = 0.0d0
<span style="color: #a020f0;">do</span> nw = 1, walk_num
<span style="color: #a020f0;">do</span> i = 1, elec_num
<span style="color: #a020f0;">do</span> a = 1, nucl_num
<span style="color: #a020f0;">do</span> l = 0, cord_num
kappa_l = <span style="color: #a020f0;">dble</span>(l)*rescale_factor_en(type_nucl_vector(a)+1)
<span style="color: #a020f0;">do</span> m = 1, 4
<span style="color: #a020f0;">do</span> n = 1, 3
<span style="color: #a020f0;">if</span> (l == 0) <span style="color: #a020f0;">then</span>
forces_een_n(i,m,a,n,l,nw) = 0.0d0
<span style="color: #a020f0;">else</span>
<span style="color: #a020f0;">if</span> (m == n) <span style="color: #a020f0;">then</span>
forces_een_n(i,m,a,n,l,nw) = forces_een_n(i,m,a,n,l,nw) + <span style="color: #a020f0;">&amp;</span>
kappa_l*een_rescaled_n(i,a,l,nw)/en_distance(a,i,nw)
<span style="color: #a020f0;">end if</span>
<span style="color: #a020f0;">if</span> (m &lt; 4) <span style="color: #a020f0;">then</span>
forces_een_n(i,m,a,n,l,nw) = forces_een_n(i,m,a,n,l,nw) - <span style="color: #a020f0;">&amp;</span>
een_rescaled_n_gl(i,m,a,l,nw) * een_rescaled_n_gl(i,n,a,l,nw) / <span style="color: #a020f0;">&amp;</span>
(kappa_l*een_rescaled_n(i,a,l,nw)*en_distance(a,i,nw)) - <span style="color: #a020f0;">&amp;</span>
een_rescaled_n_gl(i,m,a,l,nw) * <span style="color: #a020f0;">&amp;</span>
een_rescaled_n_gl(i,n,a,l,nw)/een_rescaled_n(i,a,l,nw)
<span style="color: #a020f0;">else</span>
forces_een_n(i,m,a,n,l,nw) = forces_een_n(i,m,a,n,l,nw) + <span style="color: #a020f0;">&amp;</span>
2.0d0 * een_rescaled_n_gl(i,n,a,l,nw) / <span style="color: #a020f0;">&amp;</span>
(en_distance(a,i,nw)*en_distance(a,i,nw)) - <span style="color: #a020f0;">&amp;</span>
een_rescaled_n_gl(i,m,a,l,nw) * <span style="color: #a020f0;">&amp;</span>
een_rescaled_n_gl(i,n,a,l,nw)/een_rescaled_n(i,a,l,nw)
<span style="color: #a020f0;">end if</span>
<span style="color: #a020f0;">end if</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 do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_een_rescaled_n_gl</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orga958ca2" class="outline-4">
<h4 id="orga958ca2"><span class="section-number-4">4.2.5.</span> Force of electron-electron-nucleus Jastrow gradient</h4>
<div class="outline-text-4" id="text-4-2-5">
<p>
Calculates the force of the electron-electron-nucleus Jastrow gradient (and not the Laplacian).
</p>
\begin{eqnarray}
\partial_{\alpha,m} \partial_{i,n}J_{een} =& \partial_{\alpha,m} \sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}} c_{l,k,p,\alpha} \left(\partial_{i,n}\widetilde{R}_{i\alpha}^{(p-k+l)/2} P_{i\alpha,k,(p-k-l)/2} + \partial_{i,n}\widetilde{R}_{i\alpha}^{(p-k-l)/2} P_{i\alpha,k,(p-k+l)/2} + \widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{i,n} P_{i\alpha,k,(p-k-l)/2} + \widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{i,n} P_{i\alpha,k,(p-k+l)/2} \right)\\
=& \sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}} c_{l,k,p,\alpha} \left(\partial_{\alpha,m}\partial_{i,n}\widetilde{R}_{i\alpha}^{(p-k+l)/2} P_{i\alpha,k,(p-k-l)/2} + \partial_{\alpha,m}\partial_{i,n}\widetilde{R}_{i\alpha}^{(p-k-l)/2} P_{i\alpha,k,(p-k+l)/2} + \partial_{\alpha,m}\widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{i,n} P_{i\alpha,k,(p-k-l)/2} + \partial_{\alpha,m}\widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{i,n} P_{i\alpha,k,(p-k+l)/2} \right.\\
&+ \left.\partial_{i,n}\widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{\alpha,m}P_{i\alpha,k,(p-k-l)/2} + \partial_{i,n}\widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{\alpha,m}P_{i\alpha,k,(p-k+l)/2} + \widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{\alpha,m}\partial_{i,n} P_{i\alpha,k,(p-k-l)/2} + \widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{\alpha,m}\partial_{i,n} P_{i\alpha,k,(p-k+l)/2}\right)\\
=& \sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}} c_{l,k,p,\alpha} \left(\partial_{\alpha,m}\partial_{i,n}\widetilde{R}_{i\alpha}^{(p-k+l)/2} P_{i\alpha,k,(p-k-l)/2} + \partial_{\alpha,m}\partial_{i,n}\widetilde{R}_{i\alpha}^{(p-k-l)/2} P_{i\alpha,k,(p-k+l)/2} - \partial_{i,m}\widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{i,n} P_{i\alpha,k,(p-k-l)/2} - \partial_{i,m}\widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{i,n} P_{i\alpha,k,(p-k+l)/2} \right.\\
&+ \left.\partial_{i,n}\widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{\alpha,m}P_{i\alpha,k,(p-k-l)/2} + \partial_{i,n}\widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{\alpha,m}P_{i\alpha,k,(p-k+l)/2} + \widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{\alpha,m}\partial_{i,n} P_{i\alpha,k,(p-k-l)/2} + \widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{\alpha,m}\partial_{i,n} P_{i\alpha,k,(p-k+l)/2}\right)\\
\end{eqnarray}
</div>
<div id="outline-container-org4373291" class="outline-5">
<h5 id="org4373291"><span class="section-number-5">4.2.5.1.</span> Get</h5>
<div class="outline-text-5" id="text-4-2-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_forces_jastrow_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;">forces_jastrow_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_forces_jastrow_een_g</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> forces_jastrow_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;"> forces_jastrow_een_g(size_max)</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_forces_jastrow_een_g</span>
<span style="color: #a020f0;">end interface</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org198f18d" class="outline-5">
<h5 id="org198f18d"><span class="section-number-5">4.2.5.2.</span> Compute</h5>
<div class="outline-text-5" id="text-4-2-5-2">
<table id="org3bb79df" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of 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>en_distance</code></td>
<td class="org-left"><code>double[elec_num][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus distance</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">Derivative of P matrix</td>
</tr>
<tr>
<td class="org-left"><code>forces_tmp_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">Force of P matrix</td>
</tr>
<tr>
<td class="org-left"><code>forces_dtmp_c</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][4][nucl_num][4][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Force of derivative of P matrix</td>
</tr>
<tr>
<td class="org-left"><code>forces_een_n</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][3][nucl_num][4][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Force of derivatives of electron-nucleus rescaled factor</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_n</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus rescaled factor</td>
</tr>
<tr>
<td class="org-left"><code>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">Derivative of electron-nucleus rescaled factor</td>
</tr>
<tr>
<td class="org-left"><code>forces_jastrow_een_g</code></td>
<td class="org-left"><code>double[walk_num][3][nucl_num][3][elec_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Force of the 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_forces_jastrow_een_g</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> context, walk_num, elec_num, nucl_num, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> cord_num, dim_c_vector, c_vector_full, lkpm_combined_index, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> en_distance, tmp_c, dtmp_c, forces_tmp_c, forces_dtmp_c, forces_een_n, een_rescaled_n, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> een_rescaled_n_gl, forces_jastrow_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;"> 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;"> en_distance(nucl_num, 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: #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;"> forces_tmp_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;"> forces_dtmp_c(elec_num, 4, 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;"> forces_een_n(elec_num, 4, nucl_num, 3, 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(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_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>(out) ::<span style="color: #a0522d;"> forces_jastrow_een_g(elec_num,3,nucl_num,3,walk_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, m, n, nw, ii, jj</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> accu, accu2, cn</span>
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">if</span> (cord_num &lt; 0) info = QMCKL_INVALID_ARG_5
<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>
forces_jastrow_een_g = 0.0d0
<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)
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>
<span style="color: #a020f0;">do</span> ii = 1, 3
<span style="color: #a020f0;">do</span> i = 1, elec_num
<span style="color: #a020f0;">do</span> jj = 1, 3
forces_jastrow_een_g(i, ii, a, jj, nw) = forces_jastrow_een_g(i, ii, a, jj, nw) + (<span style="color: #a020f0;">&amp;</span>
tmp_c(i,a, m, k,nw) * forces_een_n(i,ii,a,jj ,m+l,nw) <span style="color: #a020f0;">&amp;</span>
+ forces_tmp_c(i,jj,a, m, k,nw) * een_rescaled_n_gl(i,ii,a,m+l,nw) <span style="color: #a020f0;">&amp;</span>
+ tmp_c(i,a, m+l,k,nw) * forces_een_n(i,ii,a,jj, m, nw) <span style="color: #a020f0;">&amp;</span>
+ forces_tmp_c(i,jj,a, m+l,k,nw) * een_rescaled_n_gl(i,ii,a,m, nw) <span style="color: #a020f0;">&amp;</span>
- dtmp_c(i,ii,a, m, k,nw) * een_rescaled_n_gl(i,jj,a,m+l,nw) <span style="color: #a020f0;">&amp;</span>
+ forces_dtmp_c(i,ii,a,jj,m, k,nw) * een_rescaled_n(i,a, m+l,nw) <span style="color: #a020f0;">&amp;</span>
- dtmp_c(i,ii,a, m+l,k,nw) * een_rescaled_n_gl(i,jj,a,m, nw) <span style="color: #a020f0;">&amp;</span>
+ forces_dtmp_c(i,ii,a,jj,m+l,k,nw) * een_rescaled_n(i,a, m, nw) <span style="color: #a020f0;">&amp;</span>
) * cn
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_een_g</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgdcc714e" class="outline-4">
<h4 id="orgdcc714e"><span class="section-number-4">4.2.6.</span> Force of electron-electron-nucleus Jastrow Laplacian</h4>
<div class="outline-text-4" id="text-4-2-6">
<p>
Calculates the force of the electron-electron-nucleus Jastrow Laplacian.
</p>
\begin{eqnarray}
\partial_{\alpha,m} \nabla^2 J_{een} &=& \partial_{\alpha,m} \sum_{i=1}^{N_\text{elec}}\sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}} c_{l,k,p,\alpha} \left(\nabla^2\widetilde{R}_{i\alpha}^{(p-k+l)/2} P_{i\alpha,k,(p-k-l)/2} + \nabla^2\widetilde{R}_{i\alpha}^{(p-k-l)/2} P_{i\alpha,k,(p-k+l)/2} + \widetilde{R}_{i\alpha}^{(p-k+l)/2} \nabla^2 P_{i\alpha,k,(p-k-l)/2} + \widetilde{R}_{i\alpha}^{(p-k-l)/2} \nabla^2 P_{i\alpha,k,(p-k+l)/2} \right.\\
&&+ \left. 2 \nabla \widetilde{R}_{i\alpha}^{(p-k+l)/2} \cdot \nabla P_{i\alpha,k,(p-k-l)/2} + 2 \nabla \widetilde{R}_{i\alpha}^{(p-k-l)/2} \cdot \nabla P_{i\alpha,k,(p-k+l)/2} \right)\\
&=& \sum_{i=1}^{N_\text{elec}}\sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}} c_{l,k,p,\alpha} \left( \partial_{\alpha,m} \nabla^2\widetilde{R}_{i\alpha}^{(p-k+l)/2} P_{i\alpha,k,(p-k-l)/2} + \partial_{\alpha,m} \nabla^2\widetilde{R}_{i\alpha}^{(p-k-l)/2} P_{i\alpha,k,(p-k+l)/2} + \partial_{\alpha,m} \widetilde{R}_{i\alpha}^{(p-k+l)/2} \nabla^2 P_{i\alpha,k,(p-k-l)/2} + \partial_{\alpha,m} \widetilde{R}_{i\alpha}^{(p-k-l)/2} \nabla^2 P_{i\alpha,k,(p-k+l)/2} \right.\\
&&+\nabla^2\widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{\alpha,m} P_{i\alpha,k,(p-k-l)/2} + \nabla^2\widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{\alpha,m} P_{i\alpha,k,(p-k+l)/2} + \widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{\alpha,m} \nabla^2 P_{i\alpha,k,(p-k-l)/2} + \widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{\alpha,m} \nabla^2 P_{i\alpha,k,(p-k+l)/2} \\
&&+ \left. 2 \partial_{\alpha,m} \nabla \widetilde{R}_{i\alpha}^{(p-k+l)/2} \cdot \nabla P_{i\alpha,k,(p-k-l)/2} + 2 \partial_{\alpha,m} \nabla \widetilde{R}_{i\alpha}^{(p-k-l)/2} \cdot \nabla P_{i\alpha,k,(p-k+l)/2} + 2 \nabla \widetilde{R}_{i\alpha}^{(p-k+l)/2} \cdot \partial_{\alpha,m} \nabla P_{i\alpha,k,(p-k-l)/2} + 2 \nabla \widetilde{R}_{i\alpha}^{(p-k-l)/2} \cdot \partial_{\alpha,m} \nabla P_{i\alpha,k,(p-k+l)/2} \right)\\
&=& \sum_{i=1}^{N_\text{elec}}\sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}} c_{l,k,p,\alpha} \left( \partial_{\alpha,m} \nabla^2\widetilde{R}_{i\alpha}^{(p-k+l)/2} P_{i\alpha,k,(p-k-l)/2} + \partial_{\alpha,m} \nabla^2\widetilde{R}_{i\alpha}^{(p-k-l)/2} P_{i\alpha,k,(p-k+l)/2} - \partial_{i,m} \widetilde{R}_{i\alpha}^{(p-k+l)/2} \nabla^2 P_{i\alpha,k,(p-k-l)/2} - \partial_{i,m} \widetilde{R}_{i\alpha}^{(p-k-l)/2} \nabla^2 P_{i\alpha,k,(p-k+l)/2} \right.\\
&&+\nabla^2\widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{\alpha,m} P_{i\alpha,k,(p-k-l)/2} + \nabla^2\widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{\alpha,m} P_{i\alpha,k,(p-k+l)/2} + \widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{\alpha,m} \nabla^2 P_{i\alpha,k,(p-k-l)/2} + \widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{\alpha,m} \nabla^2 P_{i\alpha,k,(p-k+l)/2} \\
&&+ \left. 2 \partial_{\alpha,m} \nabla \widetilde{R}_{i\alpha}^{(p-k+l)/2} \cdot \nabla P_{i\alpha,k,(p-k-l)/2} + 2 \partial_{\alpha,m} \nabla \widetilde{R}_{i\alpha}^{(p-k-l)/2} \cdot \nabla P_{i\alpha,k,(p-k+l)/2} + 2 \nabla \widetilde{R}_{i\alpha}^{(p-k+l)/2} \cdot \partial_{\alpha,m} \nabla P_{i\alpha,k,(p-k-l)/2} + 2 \nabla \widetilde{R}_{i\alpha}^{(p-k-l)/2} \cdot \partial_{\alpha,m} \nabla P_{i\alpha,k,(p-k+l)/2} \right)
\end{eqnarray}
</div>
<div id="outline-container-orgbe80245" class="outline-5">
<h5 id="orgbe80245"><span class="section-number-5">4.2.6.1.</span> Get</h5>
<div class="outline-text-5" id="text-4-2-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_forces_jastrow_een_l</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;">forces_jastrow_een_l</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_forces_jastrow_een_l</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> forces_jastrow_een_l, 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;"> forces_jastrow_een_l(size_max)</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_forces_jastrow_een_l</span>
<span style="color: #a020f0;">end interface</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org209f6f0" class="outline-5">
<h5 id="org209f6f0"><span class="section-number-5">4.2.6.2.</span> Compute</h5>
<div class="outline-text-5" id="text-4-2-6-2">
<table id="org6f47ee7" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Variable</th>
<th scope="col" class="org-left">Type</th>
<th scope="col" class="org-left">In/Out</th>
<th scope="col" class="org-left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left"><code>context</code></td>
<td class="org-left"><code>qmckl_context</code></td>
<td class="org-left">in</td>
<td class="org-left">Global state</td>
</tr>
<tr>
<td class="org-left"><code>walk_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of walkers</td>
</tr>
<tr>
<td class="org-left"><code>elec_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of electrons</td>
</tr>
<tr>
<td class="org-left"><code>nucl_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of 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>en_distance</code></td>
<td class="org-left"><code>double[elec_num][nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus distance</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">Derivative of P matrix</td>
</tr>
<tr>
<td class="org-left"><code>forces_tmp_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">Force of P matrix</td>
</tr>
<tr>
<td class="org-left"><code>forces_dtmp_c</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][4][nucl_num][4][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Force of derivative of P matrix</td>
</tr>
<tr>
<td class="org-left"><code>forces_een_n</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][3][nucl_num][4][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Force of derivative of electron-nucleus rescaled factor</td>
</tr>
<tr>
<td class="org-left"><code>een_rescaled_n</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Electron-nucleus rescaled factor</td>
</tr>
<tr>
<td class="org-left"><code>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">Derivative of electron-nucleus rescaled factor</td>
</tr>
<tr>
<td class="org-left"><code>forces_jastrow_een_l</code></td>
<td class="org-left"><code>double[walk_num][3][nucl_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Force of electron-electron-nucleus Jastrow 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_forces_jastrow_een_l</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> context, walk_num, elec_num, nucl_num, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> cord_num, dim_c_vector, c_vector_full, lkpm_combined_index, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> en_distance, tmp_c, dtmp_c, forces_tmp_c, forces_dtmp_c, forces_een_n, een_rescaled_n, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> een_rescaled_n_gl, forces_jastrow_een_l)</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;"> 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;"> en_distance(nucl_num, 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: #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;"> forces_tmp_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;"> forces_dtmp_c(elec_num, 4, 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;"> forces_een_n(elec_num, 4, nucl_num, 3, 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(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_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>(out) ::<span style="color: #a0522d;"> forces_jastrow_een_l(nucl_num,3,walk_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, m, n, nw, ii, jj</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> accu, accu2, cn</span>
info = QMCKL_SUCCESS
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
<span style="color: #a020f0;">if</span> (walk_num &lt;= 0) info = QMCKL_INVALID_ARG_2
<span style="color: #a020f0;">if</span> (elec_num &lt;= 0) info = QMCKL_INVALID_ARG_3
<span style="color: #a020f0;">if</span> (nucl_num &lt;= 0) info = QMCKL_INVALID_ARG_4
<span style="color: #a020f0;">if</span> (cord_num &lt; 0) info = QMCKL_INVALID_ARG_5
<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>
forces_jastrow_een_l = 0.0d0
<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)
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>
<span style="color: #a020f0;">do</span> ii = 1, 3
<span style="color: #a020f0;">do</span> i = 1, elec_num
forces_jastrow_een_l(a, ii, nw) = forces_jastrow_een_l(a, ii, nw) + (<span style="color: #a020f0;">&amp;</span>
tmp_c(i,a, m, k,nw) * forces_een_n(i,4,a,ii ,m+l,nw) <span style="color: #a020f0;">&amp;</span>
+ forces_tmp_c(i,ii,a, m, k,nw) * een_rescaled_n_gl(i,4,a,m+l,nw) <span style="color: #a020f0;">&amp;</span>
+ tmp_c(i,a, m+l,k,nw) * forces_een_n(i,4,a,ii, m, nw) <span style="color: #a020f0;">&amp;</span>
+ forces_tmp_c(i,ii,a, m+l,k,nw) * een_rescaled_n_gl(i,4,a,m, nw) <span style="color: #a020f0;">&amp;</span>
- dtmp_c(i,4,a, m, k,nw) * een_rescaled_n_gl(i,ii,a,m+l,nw) <span style="color: #a020f0;">&amp;</span>
+ forces_dtmp_c(i,4,a,ii,m, k,nw) * een_rescaled_n(i,a, m+l,nw) <span style="color: #a020f0;">&amp;</span>
- dtmp_c(i,4,a, m+l,k,nw) * een_rescaled_n_gl(i,ii,a,m, nw) <span style="color: #a020f0;">&amp;</span>
+ forces_dtmp_c(i,4,a,ii,m+l,k,nw) * een_rescaled_n(i,a, m, nw) <span style="color: #a020f0;">&amp;</span>
) * cn
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
cn = cn + cn
<span style="color: #a020f0;">do</span> ii = 1, 3
<span style="color: #a020f0;">do</span> i = 1, elec_num
<span style="color: #a020f0;">do</span> jj = 1, 3
forces_jastrow_een_l(a, ii, nw) = forces_jastrow_een_l(a, ii, nw) + (<span style="color: #a020f0;">&amp;</span>
dtmp_c(i,jj,a,m, k,nw) * forces_een_n(i,jj,a,ii ,m+l,nw) + <span style="color: #a020f0;">&amp;</span>
dtmp_c(i,jj,a,m+l, k,nw) * forces_een_n(i,jj,a,ii ,m,nw) + <span style="color: #a020f0;">&amp;</span>
forces_dtmp_c(i,jj,a,ii,m, k,nw) * een_rescaled_n_gl(i,jj,a,m+l,nw) + <span style="color: #a020f0;">&amp;</span>
forces_dtmp_c(i,jj,a,ii,m+l, k,nw) * een_rescaled_n_gl(i,jj,a,m,nw) <span style="color: #a020f0;">&amp;</span>
) * cn
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_een_l</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org399976b" class="outline-4">
<h4 id="org399976b"><span class="section-number-4">4.2.7.</span> Force of \(\delta P\) matrix</h4>
<div class="outline-text-4" id="text-4-2-7">
<p>
Calculates the force of the \(\delta P\) matrix, required for force in a single-electron move. Here, the \(r^\text{new}\) and \(R^\text{new}\) are the new electron and nucleus positions of the electron that is being moved.
</p>
\begin{eqnarray*}
\partial_{\alpha,m}\delta P_{i,\alpha,k,l} &=& \partial_{\alpha,m} \left(\sum_{j=1}^{N_\text{elec}} \left( \delta \widetilde{r}_{ij}^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)\right) \\
&=& \partial_{\alpha,m} \left(\sum_{j=1}^{N_\text{elec}} \left( \delta \widetilde{r}_{ij}^k \widetilde{R}_{j\alpha}^l \delta_{i,\text{num}} \right)
+ \widetilde{r}_{i,\text{num}}^k \widetilde{R}_{\text{num},\alpha}^l + {\widetilde{r}_{i,\text{num}}^{\text{new}}}^k {\widetilde{R}_{\text{num},\alpha}^{\text{new}}}^l \right) \\
&=& \left(\sum_{j=1}^{N_\text{elec}} \left( \delta \widetilde{r}_{ij}^k \partial_{\alpha,m} \widetilde{R}_{j\alpha}^l \delta_{i,\text{num}} \right)
+ \widetilde{r}_{i,\text{num}}^k \partial_{\alpha,m}\widetilde{R}_{\text{num},\alpha}^l + {\widetilde{r}_{i,\text{num}}^{\text{new}}}^k \partial_{\alpha,m}{\widetilde{R}_{\text{num},\alpha}^{\text{new}}}^l \right) \\
&=& \left(\sum_{j=1}^{N_\text{elec}} \left( -\delta \widetilde{r}_{ij}^k \partial_{i,m} \widetilde{R}_{j\alpha}^l \delta_{i,\text{num}} \right)
- \widetilde{r}_{i,\text{num}}^k \partial_{i,m}\widetilde{R}_{\text{num},\alpha}^l - {\widetilde{r}_{i,\text{num}}^{\text{new}}}^k \partial_{i,m}{\widetilde{R}_{\text{num},\alpha}^{\text{new}}}^l \right) \\
\end{eqnarray*}
<p>
The function <code>qmckl_set_single_point</code> has to be called before this function to set the new electron position.
</p>
</div>
<div id="outline-container-orgd450d68" class="outline-5">
<h5 id="orgd450d68"><span class="section-number-5">4.2.7.1.</span> Get</h5>
<div class="outline-text-5" id="text-4-2-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_forces_jastrow_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;">forces_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-org2643f21" class="outline-5">
<h5 id="org2643f21"><span class="section-number-5">4.2.7.2.</span> Compute</h5>
<div class="outline-text-5" id="text-4-2-7-2">
<table id="org9f61e34" 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_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>forces_delta_p</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][3][elec_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Force of \(\delta P\) matrix</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_forces_jastrow_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, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> een_rescaled_n_gl, een_rescaled_single_n_gl, forces_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>(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;"> forces_delta_p(elec_num,3,nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> tmp1, tmp2</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> delta_e(elec_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;"> tmp, accu</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> LDA, LDB, LDC</span>
num = num_in + 1_8
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>
forces_delta_p = 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=0, cord_num-1
<span style="color: #a020f0;">do</span> j = 1, elec_num
delta_e(j) = een_rescaled_e(j,num,m,nw) - een_rescaled_single_e(j,m,nw)
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">do</span> l=1, cord_num
<span style="color: #a020f0;">do</span> a = 1, nucl_num
<span style="color: #a020f0;">do</span> k = 1, 3
tmp1 = een_rescaled_n_gl(num, k, a, l, nw)
tmp2 = een_rescaled_single_n_gl(k,a,l,nw)
accu = 0.d0
<span style="color: #a020f0;">do</span> j = 1, elec_num
forces_delta_p(j,k,a,l,m,nw) = een_rescaled_e(j,num,m,nw) * tmp1 - <span style="color: #a020f0;">&amp;</span>
een_rescaled_single_e(j,m,nw) * tmp2
accu = accu + delta_e(j) * een_rescaled_n_gl(j,k,a,l,nw)
<span style="color: #a020f0;">end do</span>
forces_delta_p(num,k,a,l,m,nw) = forces_delta_p(num,k,a,l,m,nw) + accu
<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_forces_jastrow_delta_p_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_forces_jastrow_delta_p_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;">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_single_n_gl</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_delta_p</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> (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_single_n_gl == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_12;
<span style="color: #a020f0;">if</span> (cord_num == 0) {
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">size_t</span> <span style="color: #a0522d;">dim</span> = elec_num*3*nucl_num*(cord_num+1)*cord_num;
<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;forces_delta_p[dim*nw],0,dim*<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: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">m</span> = 0; m &lt;= cord_num-1; ++m) {
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">delta_e</span>[elec_num];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_e_</span> = &amp;een_rescaled_e[elec_num*(num+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_single_e_</span> = &amp;een_rescaled_single_e[elec_num*(m+(cord_num+1)*nw)];
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">j</span> = 0; j &lt; elec_num; ++j) {
delta_e[j] = een_rescaled_e_[j] - een_rescaled_single_e_[j];
}
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">l</span> = 1; l &lt;= cord_num; ++l) {
<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;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">k</span> = 0; k &lt; 3; ++k) {
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_n_gl_</span> = &amp;een_rescaled_n_gl[elec_num*(k+4*(a+nucl_num*(l+(cord_num+1)*nw)))];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span> <span style="color: #a0522d;">tmp1</span> = een_rescaled_n_gl_[num];
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span> <span style="color: #a0522d;">tmp2</span> = een_rescaled_single_n_gl[k+4*(a+nucl_num*(l+(cord_num+1)*nw))];
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">forces_delta_p_</span> = &amp;forces_delta_p[elec_num*(k+3*(a+nucl_num*(l+(cord_num+1)*(m+cord_num*nw))))];
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">accu</span> = 0.0;
<span style="color: #483d8b;"> #pragma</span> omp simd reduction(+:accu)
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">j</span> = 0; j &lt; elec_num; ++j) {
forces_delta_p_[j] = een_rescaled_e_[j] * tmp1 - een_rescaled_single_e_[j] * tmp2;
accu += delta_e[j] * een_rescaled_n_gl_[j];
}
forces_delta_p_[num] += accu;
}
}
}
}
}
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
}
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgb37c61b" class="outline-4">
<h4 id="orgb37c61b"><span class="section-number-4">4.2.8.</span> Force of single electron-electron-nucleus Jastrow value</h4>
<div class="outline-text-4" id="text-4-2-8">
<p>
Computes the single-electron contribution to the electron-electron-nucleus Jastrow value force.
</p>
\begin{eqnarray*}
\partial_{\alpha,m} \delta J_{een} &=& \partial_{\alpha,m} \sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}} 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)\\
&=& \sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}} c_{l,k,p,\alpha} \left(
\sum_{i=1}^{N_\text{elec}} \left( \partial_{\alpha,m}\widetilde{R}_{i,\alpha,(p-k-l)/2} \delta P_{i,\alpha,k,(p-k+l)/2} + \widetilde{R}_{i,\alpha,(p-k-l)/2} \partial_{\alpha,m}\delta P_{i,\alpha,k,(p-k+l)/2} \right) \right.\\
&&\left. + \partial_{\alpha,m}\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)
+ \delta \widetilde{R}_{\text{num},\alpha,(p-k-l)/2} \left(\partial_{\alpha,m}P_{\text{num},\alpha,k,(p-k+l)/2} + \partial_{\alpha,m}\delta P_{\text{num},\alpha,k,(p-k+l)/2} \right)\right)\\
&=& \sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}} c_{l,k,p,\alpha} \left(
\sum_{i=1}^{N_\text{elec}} \left( -\partial_{i,m}\widetilde{R}_{i,\alpha,(p-k-l)/2} \delta P_{i,\alpha,k,(p-k+l)/2} + \widetilde{R}_{i,\alpha,(p-k-l)/2} \partial_{\alpha,m}\delta P_{i,\alpha,k,(p-k+l)/2} \right) \right.\\
&&\left. - \partial_{i,m}\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)
+ \delta \widetilde{R}_{\text{num},\alpha,(p-k-l)/2} \left(\partial_{\alpha,m}P_{\text{num},\alpha,k,(p-k+l)/2} + \partial_{\alpha,m}\delta P_{\text{num},\alpha,k,(p-k+l)/2} \right)\right)\\
\end{eqnarray*}
<p>
The function <code>qmckl_set_single_point</code> has to be called before this function to set the new electron position.
</p>
</div>
<div id="outline-container-orgcd33219" class="outline-5">
<h5 id="orgcd33219"><span class="section-number-5">4.2.8.1.</span> Get</h5>
<div class="outline-text-5" id="text-4-2-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_forces_jastrow_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;">forces_jastrow_single_een</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
</pre>
</div>
</div>
</div>
<div id="outline-container-org41a04d7" class="outline-5">
<h5 id="org41a04d7"><span class="section-number-5">4.2.8.2.</span> Compute</h5>
<div class="outline-text-5" id="text-4-2-8-2">
<table id="orgf64af02" 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>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>forces_delta_p</code></td>
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][3][elec_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Force of $&delta; P$matrix</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>forces_tmp_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">Force of 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_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>forces_jastrow_single_een</code></td>
<td class="org-left"><code>double[walk_num][nucl_num][3]</code></td>
<td class="org-left">out</td>
<td class="org-left">Single electron&#x2013;electron-nucleus Jastrow forces</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_forces_jastrow_single_een_doc</span>( <span style="color: #a020f0;">&amp;</span>
context, num_in, walk_num, elec_num, nucl_num, cord_num, <span style="color: #a020f0;">&amp;</span>
dim_c_vector, c_vector_full, lkpm_combined_index, <span style="color: #a020f0;">&amp;</span>
delta_p, forces_delta_p, tmp_c, forces_tmp_c, <span style="color: #a020f0;">&amp;</span>
een_rescaled_n, een_rescaled_single_n, een_rescaled_n_gl, een_rescaled_single_n_gl, forces_jastrow_single_een) <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;"> 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: #a020f0;">value</span> ::<span style="color: #a0522d;"> cord_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;"> 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;"> 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;"> forces_delta_p(elec_num, 3, 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;"> 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;"> forces_tmp_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;"> 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;"> forces_jastrow_single_een(3,nucl_num,walk_num)</span>
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> een_rescaled_delta_n(nucl_num, 0:cord_num), een_rescaled_delta_n_gl(3,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, kk</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>
forces_jastrow_single_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> kk = 1,3
een_rescaled_delta_n_gl(kk,:,:) = een_rescaled_single_n_gl(kk,:,:,nw) - een_rescaled_n_gl(num,kk,:,:,nw)
<span style="color: #a020f0;">end do</span>
<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>
<span style="color: #a020f0;">do</span> kk = 1, 3
accu = 0.0d0
<span style="color: #a020f0;">do</span> j = 1, elec_num
accu = accu - een_rescaled_n_gl(j,kk,a,m,nw) * delta_p(j,a,m+l,k,nw) + <span style="color: #a020f0;">&amp;</span>
een_rescaled_n(j,a,m,nw) * forces_delta_p(j,kk,a,m+l,k,nw)
<span style="color: #a020f0;">end do</span>
accu = accu - een_rescaled_delta_n_gl(kk,a,m) * (tmp_c(num,a,m+l,k,nw) + delta_p(num,a,m+l,k,nw)) + <span style="color: #a020f0;">&amp;</span>
een_rescaled_delta_n(a,m) * (forces_tmp_c(num,kk,a,m+l,k,nw) + forces_delta_p(num,kk,a,m+l,k,nw))
forces_jastrow_single_een(kk,a,nw) = forces_jastrow_single_een(kk,a,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 do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_single_een_doc</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-f90"><span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_single_een_hpc</span>( <span style="color: #a020f0;">&amp;</span>
context, num_in, walk_num, elec_num, nucl_num, cord_num, <span style="color: #a020f0;">&amp;</span>
dim_c_vector, c_vector_full, lkpm_combined_index, <span style="color: #a020f0;">&amp;</span>
delta_p, forces_delta_p, tmp_c, forces_tmp_c, <span style="color: #a020f0;">&amp;</span>
een_rescaled_n, een_rescaled_single_n, een_rescaled_n_gl, een_rescaled_single_n_gl, forces_jastrow_single_een) <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;"> 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: #a020f0;">value</span> ::<span style="color: #a0522d;"> cord_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;"> 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;"> 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;"> forces_delta_p(elec_num, 3, 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;"> 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;"> forces_tmp_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;"> 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;"> forces_jastrow_single_een(3,nucl_num,walk_num)</span>
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
<span style="color: #228b22;">double precision</span>, <span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> een_rescaled_delta_n(:, :), een_rescaled_delta_n_gl(:,:,:)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, p, m, n, nw, num, kk</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> accu2, cn</span>
<span style="color: #228b22;">double precision</span>, <span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> accu(:,:), tmp(:)</span>
<span style="color: #228b22;">double precision</span>, <span style="color: #a020f0;">external</span> ::<span style="color: #a0522d;"> ddot</span>
<span style="color: #228b22;">integer</span> ::<span style="color: #a0522d;"> elec_num4</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>
forces_jastrow_single_een = 0.0d0
<span style="color: #a020f0;">if</span> (cord_num == 0) <span style="color: #a020f0;">return</span>
<span style="color: #a020f0;">allocate</span>(een_rescaled_delta_n(nucl_num, 0:cord_num), een_rescaled_delta_n_gl(3,nucl_num, 0:cord_num), <span style="color: #a020f0;">&amp;</span>
accu(3,nucl_num), tmp(nucl_num))
elec_num4 = <span style="color: #a020f0;">int</span>(elec_num,4)
<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(1:3,:,:) = een_rescaled_single_n_gl(1:3,:,:,nw) - een_rescaled_n_gl(num,1:3,:,:,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)
accu(1:3,a) = 0.0d0
<span style="color: #a020f0;">if</span>(cn == 0.d0) <span style="color: #a020f0;">cycle</span>
tmp(a) = tmp_c(num,a,m+l,k,nw) + delta_p(num,a,m+l,k,nw)
<span style="color: #a020f0;">call</span> <span style="color: #0000ff;">dgemv</span>(<span style="color: #8b2252;">'T'</span>, elec_num4, 3, -1.d0, een_rescaled_n_gl(1,1,a,m,nw), elec_num4, <span style="color: #a020f0;">&amp;</span>
delta_p(1,a,m+l,k,nw), 1, 0.d0, accu(1,a), 1)
<span style="color: #a020f0;">call</span> <span style="color: #0000ff;">dgemv</span>(<span style="color: #8b2252;">'T'</span>, elec_num4, 3, 1.d0, forces_delta_p(1,1,a,m+l,k,nw), elec_num4, <span style="color: #a020f0;">&amp;</span>
een_rescaled_n(1,a,m,nw), 1, 1.d0, accu(1,a), 1)
<span style="color: #a020f0;">enddo</span>
accu(1,:) = accu(1,:) - een_rescaled_delta_n_gl(1,:,m)*tmp(:)
accu(2,:) = accu(2,:) - een_rescaled_delta_n_gl(2,:,m)*tmp(:)
accu(3,:) = accu(3,:) - een_rescaled_delta_n_gl(3,:,m)*tmp(:)
accu(1,:) = accu(1,:) + een_rescaled_delta_n(:,m)*forces_tmp_c(num,1,:,m+l,k,nw)
accu(2,:) = accu(2,:) + een_rescaled_delta_n(:,m)*forces_tmp_c(num,2,:,m+l,k,nw)
accu(3,:) = accu(3,:) + een_rescaled_delta_n(:,m)*forces_tmp_c(num,3,:,m+l,k,nw)
accu(1,:) = accu(1,:) + een_rescaled_delta_n(:,m)*forces_delta_p(num,1,:,m+l,k,nw)
accu(2,:) = accu(2,:) + een_rescaled_delta_n(:,m)*forces_delta_p(num,2,:,m+l,k,nw)
accu(3,:) = accu(3,:) + een_rescaled_delta_n(:,m)*forces_delta_p(num,3,:,m+l,k,nw)
forces_jastrow_single_een(1,:,nw) = forces_jastrow_single_een(1,:,nw) + accu(1,:) * c_vector_full(:,n)
forces_jastrow_single_een(2,:,nw) = forces_jastrow_single_een(2,:,nw) + accu(2,:) * c_vector_full(:,n)
forces_jastrow_single_een(3,:,nw) = forces_jastrow_single_een(3,:,nw) + accu(3,:) * c_vector_full(:,n)
<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_forces_jastrow_single_een_hpc</span>
</pre>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="outline-container-org8c04d8b" class="outline-2">
<h2 id="org8c04d8b"><span class="section-number-2">5.</span> Forces of the orbitals</h2>
<div class="outline-text-2" id="text-5">
</div>
<div id="outline-container-org21630fb" class="outline-3">
<h3 id="org21630fb"><span class="section-number-3">5.1.</span> Force of AO value</h3>
<div class="outline-text-3" id="text-5-1">
<p>
Computes the forces on the values of the atomic orbitals (AO). These are equal to the gradients of the AOs multiplied with a minus sign, and summed over different indices.
</p>
</div>
<div id="outline-container-org8280aab" class="outline-4">
<h4 id="org8280aab"><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_forces_ao_value</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;">forces_ao_value</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-org224a093" class="outline-4">
<h4 id="org224a093"><span class="section-number-4">5.1.2.</span> Compute</h4>
<div class="outline-text-4" id="text-5-1-2">
<table id="org26e512a" 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>ao_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of AOs</td>
</tr>
<tr>
<td class="org-left"><code>shell_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of shells</td>
</tr>
<tr>
<td class="org-left"><code>point_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of points</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>nucleus_index</code></td>
<td class="org-left"><code>int64_t[nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Index of the 1st shell of each nucleus</td>
</tr>
<tr>
<td class="org-left"><code>nucleus_shell_num</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 shells per nucleus</td>
</tr>
<tr>
<td class="org-left"><code>shell_ang_mom</code></td>
<td class="org-left"><code>int32_t[shell_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Angular momentum of each shell</td>
</tr>
<tr>
<td class="org-left"><code>ao_factor</code></td>
<td class="org-left"><code>double[ao_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Normalization factor of the AOs</td>
</tr>
<tr>
<td class="org-left"><code>ao_vgl</code></td>
<td class="org-left"><code>double[point_num][5][shell_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Value, gradients and Laplacian of the shells</td>
</tr>
<tr>
<td class="org-left"><code>forces_ao_value</code></td>
<td class="org-left"><code>double[nucl_num][point_num][3][ao_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Forces of the AOs</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_forces_ao_value_doc</span>(context, <span style="color: #a020f0;">&amp;</span>
ao_num, shell_num, point_num, nucl_num, <span style="color: #a020f0;">&amp;</span>
nucleus_index, nucleus_shell_num, <span style="color: #a020f0;">&amp;</span>
shell_ang_mom, ao_factor, ao_vgl, forces_ao_value) <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_constants</span>
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>, <span style="color: #a020f0;">only</span> : qmckl_ao_polynomial_vgl, qmckl_get_numprec_precision
<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;"> ao_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;"> shell_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;"> point_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: #a0522d;"> nucleus_index(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;"> nucleus_shell_num(nucl_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: #a0522d;"> shell_ang_mom(shell_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;"> ao_factor(ao_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;"> ao_vgl(ao_num,5,point_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;"> forces_ao_value(ao_num,3,point_num,nucl_num)</span>
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
<span style="color: #228b22;">integer</span> ::<span style="color: #a0522d;"> l, il, k</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> ipoint, inucl</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> ishell_start, ishell_end, ishell</span>
<span style="color: #228b22;">integer</span> ::<span style="color: #a0522d;"> lstart(0:20)</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, y, z, r2</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> cutoff</span>
<span style="color: #228b22;">integer</span> , <span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> ao_index(:)</span>
<span style="color: #a020f0;">allocate</span>(ao_index(ao_num))
!<span style="color: #b22222;">forces_ao_value = 0.d0</span>
! <span style="color: #b22222;">Pre-computed data</span>
<span style="color: #a020f0;">do</span> l=0,20
lstart(l) = l*(l+1)*(l+2)/6 +1
<span style="color: #a020f0;">end do</span>
k=1
<span style="color: #a020f0;">do</span> inucl=1,nucl_num
ishell_start = nucleus_index(inucl) + 1
ishell_end = nucleus_index(inucl) + nucleus_shell_num(inucl)
<span style="color: #a020f0;">do</span> ishell = ishell_start, ishell_end
l = shell_ang_mom(ishell)
ao_index(ishell) = k
k = k + lstart(l+1) - lstart(l)
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
info = QMCKL_SUCCESS
<span style="color: #a020f0;">do</span> ipoint = 1, point_num
<span style="color: #a020f0;">do</span> inucl=1,nucl_num
! <span style="color: #b22222;">Loop over shells</span>
ishell_start = nucleus_index(inucl) + 1
ishell_end = nucleus_index(inucl) + nucleus_shell_num(inucl)
<span style="color: #a020f0;">do</span> ishell = ishell_start, ishell_end
l = shell_ang_mom(ishell)
<span style="color: #a020f0;">do</span> k = ao_index(ishell), ao_index(ishell) + lstart(l+1)-lstart(l) -1
forces_ao_value(k,1,ipoint,inucl) = -ao_vgl(k,2,ipoint)
forces_ao_value(k,2,ipoint,inucl) = -ao_vgl(k,3,ipoint)
forces_ao_value(k,3,ipoint,inucl) = -ao_vgl(k,4,ipoint)
<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;">deallocate</span>(ao_index)
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_ao_value_doc</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org0d71afb" class="outline-3">
<h3 id="org0d71afb"><span class="section-number-3">5.2.</span> Force of MO value</h3>
<div class="outline-text-3" id="text-5-2">
<p>
Calculates the force on the molecular orbitals (MO) values. These are calculated by taking a linear combination of AOs.
</p>
</div>
<div id="outline-container-orga011cc4" class="outline-4">
<h4 id="orga011cc4"><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_forces_mo_value</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;">forces_mo_value</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_get_forces_mo_value_inplace</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;">forces_mo_value</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-org1ced40f" class="outline-4">
<h4 id="org1ced40f"><span class="section-number-4">5.2.2.</span> Compute</h4>
<div class="outline-text-4" id="text-5-2-2">
<table id="orga6d89e2" 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 AOs</td>
</tr>
<tr>
<td class="org-left"><code>ao_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of AOs</td>
</tr>
<tr>
<td class="org-left"><code>mo_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of MOs</td>
</tr>
<tr>
<td class="org-left"><code>point_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of points</td>
</tr>
<tr>
<td class="org-left"><code>shell_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of shells</td>
</tr>
<tr>
<td class="org-left"><code>nucleus_index</code></td>
<td class="org-left"><code>int64_t[nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Index of the 1st shell of each nucleus</td>
</tr>
<tr>
<td class="org-left"><code>nucleus_shell_num</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 shells per nucleus</td>
</tr>
<tr>
<td class="org-left"><code>shell_ang_mom</code></td>
<td class="org-left"><code>int32_t[shell_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Angular momentum of each shell</td>
</tr>
<tr>
<td class="org-left"><code>coefficient_t</code></td>
<td class="org-left"><code>double[mo_num][ao_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Transpose of the AO to MO transformation matrix</td>
</tr>
<tr>
<td class="org-left"><code>ao_vgl</code></td>
<td class="org-left"><code>double[point_num][3][ao_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">AO values, gradient and Laplacian</td>
</tr>
<tr>
<td class="org-left"><code>forces_mo_value</code></td>
<td class="org-left"><code>double[nucl_num][point_num][3][mo_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Forces of MOs</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_forces_mo_value_doc</span><span style="color: #a0522d;">(context, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> nucl_num,ao_num, mo_num, point_num, shell_num, nucleus_index, nucleus_shell_num, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> shell_ang_mom, coefficient_t, ao_vgl, forces_mo_value) </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;">nucl_num, ao_num, mo_num, point_num, shell_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;"> ao_vgl(ao_num,5,point_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;"> coefficient_t(mo_num,ao_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;"> nucleus_index(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;"> nucleus_shell_num(nucl_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: #a0522d;"> shell_ang_mom(shell_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;"> forces_mo_value(mo_num,3,point_num,nucl_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i,j,a, m, ishell_start, ishell_end, il, ishell</span>
<span style="color: #228b22;">integer</span> ::<span style="color: #a0522d;"> l, k</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> c1, c2, c3, coef</span>
<span style="color: #228b22;">integer</span>, <span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> ao_index(:)</span>
<span style="color: #228b22;">integer</span> ::<span style="color: #a0522d;"> lstart(0:20)</span>
<span style="color: #a020f0;">allocate</span>(ao_index(ao_num))
<span style="color: #a020f0;">do</span> l=0,20
lstart(l) = l*(l+1)*(l+2)/6 +1
<span style="color: #a020f0;">end do</span>
k=1
<span style="color: #a020f0;">do</span> a=1,nucl_num
ishell_start = nucleus_index(a) + 1
ishell_end = nucleus_index(a) + nucleus_shell_num(a)
<span style="color: #a020f0;">do</span> ishell = ishell_start, ishell_end
l = shell_ang_mom(ishell)
ao_index(ishell) = k
k = k + lstart(l+1) - lstart(l)
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
info = QMCKL_SUCCESS
<span style="color: #a020f0;">do</span> a=1,nucl_num
ishell_start = nucleus_index(a) + 1
ishell_end = nucleus_index(a) + nucleus_shell_num(a)
<span style="color: #a020f0;">do</span> j=1,point_num
forces_mo_value(:,:,j,a) = 0.0d0
<span style="color: #a020f0;">do</span> ishell = ishell_start, ishell_end
l = shell_ang_mom(ishell)
<span style="color: #a020f0;">do</span> k=ao_index(ishell), ao_index(ishell) + lstart(l+1)-lstart(l)-1
c1 = ao_vgl(k,2,j)
c2 = ao_vgl(k,3,j)
c3 = ao_vgl(k,4,j)
<span style="color: #a020f0;">do</span> i=1,mo_num
coef = coefficient_t(i,k)
forces_mo_value(i,1,j,a) = forces_mo_value(i,1,j,a) - c1 * coef
forces_mo_value(i,2,j,a) = forces_mo_value(i,2,j,a) - c2 * coef
forces_mo_value(i,3,j,a) = forces_mo_value(i,3,j,a) - c3 * coef
<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;">deallocate</span>(ao_index)
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_mo_value_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_forces_mo_value_doc</span> (
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nucl_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">ao_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">mo_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">point_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">shell_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">nucleus_index</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">nucleus_shell_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int32_t</span>* <span style="color: #a0522d;">shell_ang_mom</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">coefficient_t</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ao_vgl</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_mo_value</span> );
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org68fe41e" class="outline-3">
<h3 id="org68fe41e"><span class="section-number-3">5.3.</span> Force of MO gradient</h3>
<div class="outline-text-3" id="text-5-3">
<p>
Calculates the forces of the gradients of the MOs. These are calculated by taking a linear combination of the required components of the Hessian of the AOs.
</p>
</div>
<div id="outline-container-orgfba1f64" class="outline-4">
<h4 id="orgfba1f64"><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_forces_mo_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;">forces_mo_g</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
<span style="color: #228b22;">qmckl_exit_code</span>
<span style="color: #0000ff;">qmckl_get_forces_mo_g_inplace</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;">forces_mo_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-org380d151" class="outline-4">
<h4 id="org380d151"><span class="section-number-4">5.3.2.</span> Compute</h4>
<div class="outline-text-4" id="text-5-3-2">
<table id="orgb3f329e" 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>ao_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of AOs</td>
</tr>
<tr>
<td class="org-left"><code>mo_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of MOs</td>
</tr>
<tr>
<td class="org-left"><code>point_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of points</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>shell_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of shells</td>
</tr>
<tr>
<td class="org-left"><code>nucleus_index</code></td>
<td class="org-left"><code>int64_t[nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Index of the 1st shell of each nucleus</td>
</tr>
<tr>
<td class="org-left"><code>nucleus_shell_num</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 shells per nucleus</td>
</tr>
<tr>
<td class="org-left"><code>shell_ang_mom</code></td>
<td class="org-left"><code>int32_t[shell_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Angular momentum of each shell</td>
</tr>
<tr>
<td class="org-left"><code>coefficient_t</code></td>
<td class="org-left"><code>double[mo_num][ao_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Transpose of the AO to MO transformation matrix</td>
</tr>
<tr>
<td class="org-left"><code>ao_hessian</code></td>
<td class="org-left"><code>double[3][point_num][4][ao_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Hessian of AOs</td>
</tr>
<tr>
<td class="org-left"><code>forces_mo_g</code></td>
<td class="org-left"><code>double[nucl_num][3][point_num][3][mo_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Forces on gradients of MOs</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_forces_mo_g_doc</span><span style="color: #a0522d;">(context, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> ao_num, mo_num, point_num, nucl_num, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> shell_num, nucleus_index, nucleus_shell_num, shell_ang_mom, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> coefficient_t, ao_hessian, forces_mo_g) </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> bind(C) 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: #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, ao_num, mo_num, point_num, shell_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;"> nucleus_index(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;"> nucleus_shell_num(nucl_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: #a0522d;"> shell_ang_mom(shell_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;"> coefficient_t(mo_num,ao_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;"> ao_hessian(ao_num,4,point_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;"> forces_mo_g(mo_num,3,point_num,3,nucl_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i,j, m, n,a</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> c1</span>
<span style="color: #228b22;">double precision</span>, <span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> tmp(:,:,:,:)</span>
<span style="color: #a020f0;">allocate</span>(tmp(ao_num,3,point_num,3))
<span style="color: #a020f0;">do</span> a=1,nucl_num
! <span style="color: #b22222;">BROKEN</span>
tmp(:,1:3,:,:) = ao_hessian(:,1:3,:,:)
info = qmckl_dgemm(context, <span style="color: #8b2252;">'N'</span>, <span style="color: #8b2252;">'N'</span>, mo_num, 3*point_num*3, ao_num, <span style="color: #a020f0;">&amp;</span>
-1.d0, coefficient_t, mo_num, <span style="color: #a020f0;">&amp;</span>
tmp, ao_num, 0.d0, forces_mo_g(1,1,1,1,a), mo_num)
<span style="color: #a020f0;">if</span> (info /= 0) <span style="color: #a020f0;">return</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_forces_mo_g_doc</span>
</pre>
</div>
<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_forces_mo_g_hpc</span><span style="color: #a0522d;">(context, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> ao_num, mo_num, point_num, nucl_num, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> shell_num, nucleus_index, nucleus_shell_num, shell_ang_mom, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> coefficient_t, ao_hessian, forces_mo_g) </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> bind(C) 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: #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, ao_num, mo_num, point_num, shell_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;"> nucleus_index(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;"> nucleus_shell_num(nucl_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: #a0522d;"> shell_ang_mom(shell_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;"> coefficient_t(mo_num,ao_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;"> ao_hessian(ao_num,4,point_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;"> forces_mo_g(mo_num,3,point_num,3,nucl_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i,j, m, n,a</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> c1</span>
<span style="color: #228b22;">integer</span> ::<span style="color: #a0522d;"> l, il, k, ao_ind</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> ishell_start, ishell_end, ishell</span>
<span style="color: #228b22;">integer</span> ::<span style="color: #a0522d;"> lstart(0:20)</span>
<span style="color: #228b22;">integer</span> , <span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> ao_index(:)</span>
<span style="color: #a020f0;">allocate</span>(ao_index(ao_num))
<span style="color: #a020f0;">do</span> l=0,20
lstart(l) = l*(l+1)*(l+2)/6 +1
<span style="color: #a020f0;">end do</span>
k=1
<span style="color: #a020f0;">do</span> a=1,nucl_num
ishell_start = nucleus_index(a) + 1
ishell_end = nucleus_index(a) + nucleus_shell_num(a)
<span style="color: #a020f0;">do</span> ishell = ishell_start, ishell_end
l = shell_ang_mom(ishell)
ao_index(ishell) = k
k = k + lstart(l+1) - lstart(l)
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
info = QMCKL_SUCCESS
<span style="color: #a020f0;">do</span> a=1,nucl_num
ishell_start = nucleus_index(a) + 1
ishell_end = nucleus_index(a) + nucleus_shell_num(a)
<span style="color: #a020f0;">do</span> n = 1, 3
<span style="color: #a020f0;">do</span> j=1,point_num
forces_mo_g(:,:,j,n,a) = 0.d0
<span style="color: #a020f0;">do</span> m = 1, 3
<span style="color: #a020f0;">do</span> ishell = ishell_start, ishell_end
l = shell_ang_mom(ishell)
il = lstart(l+1)-lstart(l)
ao_ind = ao_index(ishell)
<span style="color: #a020f0;">do</span> k = ao_ind, ao_ind + il - 1
c1 = ao_hessian(k, m, j, n)
<span style="color: #a020f0;">if</span> (c1 /= 0.d0) <span style="color: #a020f0;">then</span>
<span style="color: #a020f0;">do</span> i=1,mo_num
forces_mo_g(i, m, j, n, a) = forces_mo_g(i, m, j, n, a) - <span style="color: #a020f0;">&amp;</span>
coefficient_t(i,k) * c1
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end if</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 do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">deallocate</span>(ao_index)
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_mo_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_forces_mo_g</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;">ao_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">mo_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">point_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;">shell_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">nucleus_index</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">nucleus_shell_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int32_t</span>* <span style="color: #a0522d;">shell_ang_mom</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">coefficient_t</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ao_hessian</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_mo_g</span> );
<span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_forces_mo_g_doc</span> (
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">ao_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">mo_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">point_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;">shell_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">nucleus_index</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">nucleus_shell_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int32_t</span>* <span style="color: #a0522d;">shell_ang_mom</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">coefficient_t</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ao_hessian</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_mo_g</span> );
<span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_forces_mo_g_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;">ao_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">mo_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">point_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;">shell_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">nucleus_index</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">nucleus_shell_num</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int32_t</span>* <span style="color: #a0522d;">shell_ang_mom</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">coefficient_t</span>,
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ao_hessian</span>,
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_mo_g</span> );
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgae9357c" class="outline-3">
<h3 id="orgae9357c"><span class="section-number-3">5.4.</span> Force of MO Laplacian</h3>
<div class="outline-text-3" id="text-5-4">
<p>
Computes the forces on the Laplacian of the MOs. They are calculated by taking a linear combination of the <code>ao_hessian[:,:,:,3,:]</code> components of the AO Hessian. These store the derivatives of the Laplacian of the AO.
</p>
</div>
<div id="outline-container-org1f3de9c" class="outline-4">
<h4 id="org1f3de9c"><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_forces_mo_l</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;">forces_mo_l</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-org9fe509c" class="outline-4">
<h4 id="org9fe509c"><span class="section-number-4">5.4.2.</span> Compute</h4>
<div class="outline-text-4" id="text-5-4-2">
<table id="org2607060" 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>ao_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of AOs</td>
</tr>
<tr>
<td class="org-left"><code>mo_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of MOs</td>
</tr>
<tr>
<td class="org-left"><code>point_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of points</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>shell_num</code></td>
<td class="org-left"><code>int64_t</code></td>
<td class="org-left">in</td>
<td class="org-left">Number of shells</td>
</tr>
<tr>
<td class="org-left"><code>nucleus_index</code></td>
<td class="org-left"><code>int64_t[nucl_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Index of the 1st shell of each nucleus</td>
</tr>
<tr>
<td class="org-left"><code>nucleus_shell_num</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 shells per nucleus</td>
</tr>
<tr>
<td class="org-left"><code>shell_ang_mom</code></td>
<td class="org-left"><code>int32_t[shell_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Angular momentum of each shell</td>
</tr>
<tr>
<td class="org-left"><code>coefficient_t</code></td>
<td class="org-left"><code>double[mo_num][ao_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Transpose of the AO to MO transformation matrix</td>
</tr>
<tr>
<td class="org-left"><code>ao_hessian</code></td>
<td class="org-left"><code>double[3][point_num][4][ao_num]</code></td>
<td class="org-left">in</td>
<td class="org-left">Hessian of AOs</td>
</tr>
<tr>
<td class="org-left"><code>forces_mo_l</code></td>
<td class="org-left"><code>double[nucl_num][3][point_num][mo_num]</code></td>
<td class="org-left">out</td>
<td class="org-left">Forces on MO Laplacian</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_forces_mo_l_doc</span><span style="color: #a0522d;">(context, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> ao_num, mo_num, point_num, nucl_num, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> shell_num, nucleus_index, nucleus_shell_num, shell_ang_mom, </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> coefficient_t, ao_hessian, forces_mo_l) </span><span style="color: #a020f0;">&amp;</span>
<span style="color: #a0522d;"> bind(C) 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: #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, ao_num, mo_num, point_num, shell_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;"> nucleus_index(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;"> nucleus_shell_num(nucl_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: #a0522d;"> shell_ang_mom(shell_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;"> coefficient_t(mo_num,ao_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;"> ao_hessian(ao_num,4,point_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;"> forces_mo_l(mo_num,point_num,3,nucl_num)</span>
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i,j, m, n,a, il, ishell, ishell_start, ishell_end</span>
<span style="color: #228b22;">integer</span> ::<span style="color: #a0522d;"> lstart(0:20)</span>
<span style="color: #228b22;">integer</span> ::<span style="color: #a0522d;"> l, k</span>
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> c1</span>
<span style="color: #228b22;">integer</span> , <span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> ao_index(:)</span>
<span style="color: #a020f0;">allocate</span>(ao_index(ao_num))
<span style="color: #a020f0;">do</span> l=0,20
lstart(l) = l*(l+1)*(l+2)/6 +1
<span style="color: #a020f0;">end do</span>
k=1
<span style="color: #a020f0;">do</span> a=1,nucl_num
ishell_start = nucleus_index(a) + 1
ishell_end = nucleus_index(a) + nucleus_shell_num(a)
<span style="color: #a020f0;">do</span> ishell = ishell_start, ishell_end
l = shell_ang_mom(ishell)
ao_index(ishell) = k
k = k + lstart(l+1) - lstart(l)
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
forces_mo_l = 0.d0
info = QMCKL_SUCCESS
<span style="color: #a020f0;">do</span> a=1, nucl_num
ishell_start = nucleus_index(a) + 1
ishell_end = nucleus_index(a) + nucleus_shell_num(a)
<span style="color: #a020f0;">do</span> j=1,point_num
<span style="color: #a020f0;">do</span> n = 1, 3
<span style="color: #a020f0;">do</span> ishell = ishell_start, ishell_end
k = ao_index(ishell)
l = shell_ang_mom(ishell)
<span style="color: #a020f0;">do</span> il = lstart(l), lstart(l+1)-1
c1 = ao_hessian(k, 4, j, n)
<span style="color: #a020f0;">if</span> (c1 == 0.d0) <span style="color: #a020f0;">then</span>
k = k + 1
<span style="color: #a020f0;">cycle</span>
<span style="color: #a020f0;">end if</span>
<span style="color: #a020f0;">do</span> i=1,mo_num
forces_mo_l(i, j, n, a) = forces_mo_l(i, j, n, a) - coefficient_t(i,k) * c1
<span style="color: #a020f0;">end do</span>
k = k+1
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">end do</span>
<span style="color: #a020f0;">deallocate</span>(ao_index)
!<span style="color: #b22222;">do a=1,nucl_num</span>
! <span style="color: #b22222;">do m = 1, 3</span>
! <span style="color: #b22222;">info = qmckl_dgemm(context,'N', 'N', mo_num, point_num, ao_num, &amp;</span>
! <span style="color: #b22222;">-1.d0, coefficient_t, mo_num, &amp;</span>
! <span style="color: #b22222;">ao_hessian(:, 4, :, m, a), ao_num, &amp;</span>
! <span style="color: #b22222;">1.d0, forces_mo_l(:, :, m, a), mo_num)</span>
! <span style="color: #b22222;">end do</span>
!<span style="color: #b22222;">end do</span>
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_mo_l_doc</span>
</pre>
</div>
</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>