mirror of
https://github.com/TREX-CoE/qmckl.git
synced 2025-05-01 12:54:46 +02:00
6014 lines
338 KiB
HTML
6014 lines
338 KiB
HTML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
|
<head>
|
|
<!-- 2025-04-29 Tue 08:44 -->
|
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title>CHAMP Jastrow Factor Single</title>
|
|
<meta name="author" content="TREX CoE" />
|
|
<meta name="generator" content="Org Mode" />
|
|
<style>
|
|
#content { max-width: 60em; margin: auto; }
|
|
.title { text-align: center;
|
|
margin-bottom: .2em; }
|
|
.subtitle { text-align: center;
|
|
font-size: medium;
|
|
font-weight: bold;
|
|
margin-top:0; }
|
|
.todo { font-family: monospace; color: red; }
|
|
.done { font-family: monospace; color: green; }
|
|
.priority { font-family: monospace; color: orange; }
|
|
.tag { background-color: #eee; font-family: monospace;
|
|
padding: 2px; font-size: 80%; font-weight: normal; }
|
|
.timestamp { color: #bebebe; }
|
|
.timestamp-kwd { color: #5f9ea0; }
|
|
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
|
|
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
|
|
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
|
|
.underline { text-decoration: underline; }
|
|
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
|
|
p.verse { margin-left: 3%; }
|
|
pre {
|
|
border: 1px solid #e6e6e6;
|
|
border-radius: 3px;
|
|
background-color: #f2f2f2;
|
|
padding: 8pt;
|
|
font-family: monospace;
|
|
overflow: auto;
|
|
margin: 1.2em;
|
|
}
|
|
pre.src {
|
|
position: relative;
|
|
overflow: auto;
|
|
}
|
|
pre.src:before {
|
|
display: none;
|
|
position: absolute;
|
|
top: -8px;
|
|
right: 12px;
|
|
padding: 3px;
|
|
color: #555;
|
|
background-color: #f2f2f299;
|
|
}
|
|
pre.src:hover:before { display: inline; margin-top: 14px;}
|
|
/* Languages per Org manual */
|
|
pre.src-asymptote:before { content: 'Asymptote'; }
|
|
pre.src-awk:before { content: 'Awk'; }
|
|
pre.src-authinfo::before { content: 'Authinfo'; }
|
|
pre.src-C:before { content: 'C'; }
|
|
/* pre.src-C++ doesn't work in CSS */
|
|
pre.src-clojure:before { content: 'Clojure'; }
|
|
pre.src-css:before { content: 'CSS'; }
|
|
pre.src-D:before { content: 'D'; }
|
|
pre.src-ditaa:before { content: 'ditaa'; }
|
|
pre.src-dot:before { content: 'Graphviz'; }
|
|
pre.src-calc:before { content: 'Emacs Calc'; }
|
|
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
|
|
pre.src-fortran:before { content: 'Fortran'; }
|
|
pre.src-gnuplot:before { content: 'gnuplot'; }
|
|
pre.src-haskell:before { content: 'Haskell'; }
|
|
pre.src-hledger:before { content: 'hledger'; }
|
|
pre.src-java:before { content: 'Java'; }
|
|
pre.src-js:before { content: 'Javascript'; }
|
|
pre.src-latex:before { content: 'LaTeX'; }
|
|
pre.src-ledger:before { content: 'Ledger'; }
|
|
pre.src-lisp:before { content: 'Lisp'; }
|
|
pre.src-lilypond:before { content: 'Lilypond'; }
|
|
pre.src-lua:before { content: 'Lua'; }
|
|
pre.src-matlab:before { content: 'MATLAB'; }
|
|
pre.src-mscgen:before { content: 'Mscgen'; }
|
|
pre.src-ocaml:before { content: 'Objective Caml'; }
|
|
pre.src-octave:before { content: 'Octave'; }
|
|
pre.src-org:before { content: 'Org mode'; }
|
|
pre.src-oz:before { content: 'OZ'; }
|
|
pre.src-plantuml:before { content: 'Plantuml'; }
|
|
pre.src-processing:before { content: 'Processing.js'; }
|
|
pre.src-python:before { content: 'Python'; }
|
|
pre.src-R:before { content: 'R'; }
|
|
pre.src-ruby:before { content: 'Ruby'; }
|
|
pre.src-sass:before { content: 'Sass'; }
|
|
pre.src-scheme:before { content: 'Scheme'; }
|
|
pre.src-screen:before { content: 'Gnu Screen'; }
|
|
pre.src-sed:before { content: 'Sed'; }
|
|
pre.src-sh:before { content: 'shell'; }
|
|
pre.src-sql:before { content: 'SQL'; }
|
|
pre.src-sqlite:before { content: 'SQLite'; }
|
|
/* additional languages in org.el's org-babel-load-languages alist */
|
|
pre.src-forth:before { content: 'Forth'; }
|
|
pre.src-io:before { content: 'IO'; }
|
|
pre.src-J:before { content: 'J'; }
|
|
pre.src-makefile:before { content: 'Makefile'; }
|
|
pre.src-maxima:before { content: 'Maxima'; }
|
|
pre.src-perl:before { content: 'Perl'; }
|
|
pre.src-picolisp:before { content: 'Pico Lisp'; }
|
|
pre.src-scala:before { content: 'Scala'; }
|
|
pre.src-shell:before { content: 'Shell Script'; }
|
|
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
|
|
/* additional language identifiers per "defun org-babel-execute"
|
|
in ob-*.el */
|
|
pre.src-cpp:before { content: 'C++'; }
|
|
pre.src-abc:before { content: 'ABC'; }
|
|
pre.src-coq:before { content: 'Coq'; }
|
|
pre.src-groovy:before { content: 'Groovy'; }
|
|
/* additional language identifiers from org-babel-shell-names in
|
|
ob-shell.el: ob-shell is the only babel language using a lambda to put
|
|
the execution function name together. */
|
|
pre.src-bash:before { content: 'bash'; }
|
|
pre.src-csh:before { content: 'csh'; }
|
|
pre.src-ash:before { content: 'ash'; }
|
|
pre.src-dash:before { content: 'dash'; }
|
|
pre.src-ksh:before { content: 'ksh'; }
|
|
pre.src-mksh:before { content: 'mksh'; }
|
|
pre.src-posh:before { content: 'posh'; }
|
|
/* Additional Emacs modes also supported by the LaTeX listings package */
|
|
pre.src-ada:before { content: 'Ada'; }
|
|
pre.src-asm:before { content: 'Assembler'; }
|
|
pre.src-caml:before { content: 'Caml'; }
|
|
pre.src-delphi:before { content: 'Delphi'; }
|
|
pre.src-html:before { content: 'HTML'; }
|
|
pre.src-idl:before { content: 'IDL'; }
|
|
pre.src-mercury:before { content: 'Mercury'; }
|
|
pre.src-metapost:before { content: 'MetaPost'; }
|
|
pre.src-modula-2:before { content: 'Modula-2'; }
|
|
pre.src-pascal:before { content: 'Pascal'; }
|
|
pre.src-ps:before { content: 'PostScript'; }
|
|
pre.src-prolog:before { content: 'Prolog'; }
|
|
pre.src-simula:before { content: 'Simula'; }
|
|
pre.src-tcl:before { content: 'tcl'; }
|
|
pre.src-tex:before { content: 'TeX'; }
|
|
pre.src-plain-tex:before { content: 'Plain TeX'; }
|
|
pre.src-verilog:before { content: 'Verilog'; }
|
|
pre.src-vhdl:before { content: 'VHDL'; }
|
|
pre.src-xml:before { content: 'XML'; }
|
|
pre.src-nxml:before { content: 'XML'; }
|
|
/* add a generic configuration mode; LaTeX export needs an additional
|
|
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
|
|
pre.src-conf:before { content: 'Configuration File'; }
|
|
|
|
table { border-collapse:collapse; }
|
|
caption.t-above { caption-side: top; }
|
|
caption.t-bottom { caption-side: bottom; }
|
|
td, th { vertical-align:top; }
|
|
th.org-right { text-align: center; }
|
|
th.org-left { text-align: center; }
|
|
th.org-center { text-align: center; }
|
|
td.org-right { text-align: right; }
|
|
td.org-left { text-align: left; }
|
|
td.org-center { text-align: center; }
|
|
dt { font-weight: bold; }
|
|
.footpara { display: inline; }
|
|
.footdef { margin-bottom: 1em; }
|
|
.figure { padding: 1em; }
|
|
.figure p { text-align: center; }
|
|
.equation-container {
|
|
display: table;
|
|
text-align: center;
|
|
width: 100%;
|
|
}
|
|
.equation {
|
|
vertical-align: middle;
|
|
}
|
|
.equation-label {
|
|
display: table-cell;
|
|
text-align: right;
|
|
vertical-align: middle;
|
|
}
|
|
.inlinetask {
|
|
padding: 10px;
|
|
border: 2px solid gray;
|
|
margin: 10px;
|
|
background: #ffffcc;
|
|
}
|
|
#org-div-home-and-up
|
|
{ text-align: right; font-size: 70%; white-space: nowrap; }
|
|
textarea { overflow-x: auto; }
|
|
.linenr { font-size: smaller }
|
|
.code-highlighted { background-color: #ffff00; }
|
|
.org-info-js_info-navigation { border-style: none; }
|
|
#org-info-js_console-label
|
|
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
|
|
.org-info-js_search-highlight
|
|
{ background-color: #ffff00; color: #000000; font-weight: bold; }
|
|
.org-svg { }
|
|
</style>
|
|
<link rel="stylesheet" title="Standard" href="qmckl.css" type="text/css" />
|
|
|
|
<script src="org-info.js">
|
|
// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3-or-Later
|
|
// @license-end
|
|
</script>
|
|
|
|
<script>
|
|
// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3-or-Later
|
|
org_html_manager.set("TOC_DEPTH", "4");
|
|
org_html_manager.set("LINK_HOME", "index.html");
|
|
org_html_manager.set("LINK_UP", "");
|
|
org_html_manager.set("LOCAL_TOC", "1");
|
|
org_html_manager.set("VIEW_BUTTONS", "0");
|
|
org_html_manager.set("MOUSE_HINT", "underline");
|
|
org_html_manager.set("FIXED_TOC", "0");
|
|
org_html_manager.set("TOC", "1");
|
|
org_html_manager.set("VIEW", "info");
|
|
org_html_manager.setup(); // activate after the parameters are set
|
|
// @license-end
|
|
</script>
|
|
<script>
|
|
window.MathJax = {
|
|
tex: {
|
|
ams: {
|
|
multlineWidth: '85%'
|
|
},
|
|
tags: 'ams',
|
|
tagSide: 'right',
|
|
tagIndent: '.8em'
|
|
},
|
|
chtml: {
|
|
scale: 1.0,
|
|
displayAlign: 'center',
|
|
displayIndent: '0em'
|
|
},
|
|
svg: {
|
|
scale: 1.0,
|
|
displayAlign: 'center',
|
|
displayIndent: '0em'
|
|
},
|
|
output: {
|
|
font: 'mathjax-modern',
|
|
displayOverflow: 'overflow'
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<script
|
|
id="MathJax-script"
|
|
async
|
|
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">
|
|
</script>
|
|
</head>
|
|
<body>
|
|
<div id="org-div-home-and-up">
|
|
<a accesskey="h" href=""> UP </a>
|
|
|
|
|
<a accesskey="H" href="index.html"> HOME </a>
|
|
</div><div id="content" class="content">
|
|
<h1 class="title">CHAMP Jastrow Factor Single</h1>
|
|
<div id="table-of-contents" role="doc-toc">
|
|
<h2>Table of Contents</h2>
|
|
<div id="text-table-of-contents" role="doc-toc">
|
|
<ul>
|
|
<li><a href="#orgfc61824">1. Introduction</a></li>
|
|
<li><a href="#org1122ff3">2. Context</a>
|
|
<ul>
|
|
<li><a href="#orgb51fc80">2.1. Data structure</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgf4c5abf">3. Single point</a>
|
|
<ul>
|
|
<li><a href="#org5d3744f">3.1. Set</a></li>
|
|
<li><a href="#org295fa70">3.2. Touch</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org98a8ef3">4. Electron-electron and electron-nucleus distances for single point</a>
|
|
<ul>
|
|
<li><a href="#orgee9b5cd">4.1. Electron-electron distances</a>
|
|
<ul>
|
|
<li><a href="#org19eb2c6">4.1.1. Get</a></li>
|
|
<li><a href="#org56ba431">4.1.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org0875b58">4.2. Electron-nucleus distances</a>
|
|
<ul>
|
|
<li><a href="#org37d8465">4.2.1. Get</a></li>
|
|
<li><a href="#org3178ea8">4.2.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org27edc40">5. Electron-electron-nucleus Jastrow</a>
|
|
<ul>
|
|
<li><a href="#orgf692897">5.1. Electron-electron rescaled distances</a>
|
|
<ul>
|
|
<li><a href="#orgf3cd9c7">5.1.1. Get</a></li>
|
|
<li><a href="#org4be8179">5.1.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org9a7ab24">5.2. Electron-nucleus rescaled distances</a>
|
|
<ul>
|
|
<li><a href="#org519a63b">5.2.1. Get</a></li>
|
|
<li><a href="#org891e551">5.2.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgc9430c2">5.3. \(\delta P\) matrix</a>
|
|
<ul>
|
|
<li><a href="#orgce7689f">5.3.1. Get</a></li>
|
|
<li><a href="#org6a8bf97">5.3.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgef0997a">5.4. Electron-electron-nucleus Jastrow value</a>
|
|
<ul>
|
|
<li><a href="#org633e0b5">5.4.1. Get</a></li>
|
|
<li><a href="#org03d6a88">5.4.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org9251069">5.5. Electron-nucleus rescaled distance derivative</a>
|
|
<ul>
|
|
<li><a href="#org48e8202">5.5.1. Get</a></li>
|
|
<li><a href="#org60f753a">5.5.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgfdca020">5.6. Electron-electron rescaled distances derivative</a>
|
|
<ul>
|
|
<li><a href="#orgd883675">5.6.1. Get</a></li>
|
|
<li><a href="#orgb45e5a6">5.6.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org7b28016">5.7. \(\delta P\) matrix gradients and Laplacian</a>
|
|
<ul>
|
|
<li><a href="#orgf304e93">5.7.1. Get</a></li>
|
|
<li><a href="#org2ab66c1">5.7.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgbf5025c">5.8. Electron-electron-nucleus Jastrow gradients and Laplacian</a>
|
|
<ul>
|
|
<li><a href="#org79819a2">5.8.1. Get</a></li>
|
|
<li><a href="#orgefe2876">5.8.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgd89842a">5.9. \(\delta P\) matrix gradient only</a>
|
|
<ul>
|
|
<li><a href="#org7cd2604">5.9.1. Get</a></li>
|
|
<li><a href="#orgccaa59e">5.9.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org9d21d33">5.10. Electron-electron-nucleus Jastrow gradients</a>
|
|
<ul>
|
|
<li><a href="#org6bfa162">5.10.1. Get</a></li>
|
|
<li><a href="#org0b4d7cd">5.10.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgb148091">6. Electron-electron Jastrow</a>
|
|
<ul>
|
|
<li><a href="#org8f52cee">6.1. Electron-electron rescaled distance</a>
|
|
<ul>
|
|
<li><a href="#org14f5b44">6.1.1. Get</a></li>
|
|
<li><a href="#orgec8117b">6.1.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org2557842">6.2. Electron-electron Jastrow value</a>
|
|
<ul>
|
|
<li><a href="#org4c240d5">6.2.1. Get</a></li>
|
|
<li><a href="#org333e3fe">6.2.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org1e40ea1">6.3. Electron-electron rescaled distances derivatives</a>
|
|
<ul>
|
|
<li><a href="#orged85a72">6.3.1. Get</a></li>
|
|
<li><a href="#orgf4511b4">6.3.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org0ce7313">6.4. Electron-electron Jastrow gradients and Laplacian</a>
|
|
<ul>
|
|
<li><a href="#org9538621">6.4.1. Get</a></li>
|
|
<li><a href="#orgc134e8b">6.4.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgbf0e336">7. Electron-nucleus Jastrow</a>
|
|
<ul>
|
|
<li><a href="#orgbdc1f14">7.1. Electron-nucleus rescaled distance</a>
|
|
<ul>
|
|
<li><a href="#org03340ae">7.1.1. Get</a></li>
|
|
<li><a href="#orgfc6a2ec">7.1.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org36ed085">7.2. Single electron-nucleus Jastrow value</a>
|
|
<ul>
|
|
<li><a href="#orgf0f9820">7.2.1. Get</a></li>
|
|
<li><a href="#org173d970">7.2.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org5138156">7.3. Electron-nucleus rescaled distances derivatives</a>
|
|
<ul>
|
|
<li><a href="#orgb7b718d">7.3.1. Get</a></li>
|
|
<li><a href="#org54a571c">7.3.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org97e6ae7">7.4. Electron-nucleus Jastrow gradients and Laplacian</a>
|
|
<ul>
|
|
<li><a href="#orgb4a13cf">7.4.1. Get</a></li>
|
|
<li><a href="#orge222f69">7.4.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orge57cc8d">8. Accept single electron move</a>
|
|
<ul>
|
|
<li><a href="#org7a55cff">8.1. Code</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgfc61824" class="outline-2">
|
|
<h2 id="orgfc61824"><span class="section-number-2">1.</span> Introduction</h2>
|
|
<div class="outline-text-2" id="text-1">
|
|
<p>
|
|
Single-electron move version of the Jastrow factor functions. The single-electron move calculates the difference between the old Jastrow values, gradients and derivatives and the new ones (if the single electron would have been moved).
|
|
That is to say, it calculates
|
|
\[
|
|
\delta J = J(\mathbf{r}^\prime,\mathbf{R}) - J(\mathbf{r},\mathbf{R})
|
|
\]
|
|
for all the neccessery quantities.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org1122ff3" class="outline-2">
|
|
<h2 id="org1122ff3"><span class="section-number-2">2.</span> Context</h2>
|
|
<div class="outline-text-2" id="text-2">
|
|
</div>
|
|
<div id="outline-container-orgb51fc80" class="outline-3">
|
|
<h3 id="orgb51fc80"><span class="section-number-3">2.1.</span> Data structure</h3>
|
|
<div class="outline-text-3" id="text-2-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #a020f0;">typedef</span> <span style="color: #a020f0;">struct</span> <span style="color: #228b22;">qmckl_jastrow_champ_single_struct</span>{
|
|
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">num</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">date</span>;
|
|
<span style="color: #228b22;">qmckl_matrix</span> <span style="color: #a0522d;">coord</span>;
|
|
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">een_rescaled_single_e</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">een_rescaled_single_e_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">een_rescaled_single_e_maxsize</span>;
|
|
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">een_rescaled_single_n</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">een_rescaled_single_n_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">een_rescaled_single_n_maxsize</span>;
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">single_ee_distance</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">single_ee_distance_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">single_ee_distance_maxsize</span>;
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">single_en_distance</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">single_en_distance_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">single_en_distance_maxsize</span>;
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">delta_een</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_een_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_een_maxsize</span>;
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">delta_p</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_p_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_p_maxsize</span>;
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ee_rescaled_single</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">ee_rescaled_single_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">ee_rescaled_single_maxsize</span>;
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">en_rescaled_single</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">en_rescaled_single_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">en_rescaled_single_maxsize</span>;
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">delta_en</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_en_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_en_maxsize</span>;
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">delta_ee</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_ee_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_ee_maxsize</span>;
|
|
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">een_rescaled_single_e_gl</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">een_rescaled_single_e_gl_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">een_rescaled_single_e_gl_maxsize</span>;
|
|
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">een_rescaled_single_n_gl</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">een_rescaled_single_n_gl_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">een_rescaled_single_n_gl_maxsize</span>;
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">delta_p_gl</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_p_gl_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_p_gl_maxsize</span>;
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">delta_p_g</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_p_g_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_p_g_maxsize</span>;
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">delta_een_gl</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_een_gl_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_een_gl_maxsize</span>;
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">delta_een_g</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_een_g_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_een_g_maxsize</span>;
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ee_rescaled_single_gl</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">ee_rescaled_single_gl_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">ee_rescaled_single_gl_maxsize</span>;
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">en_rescaled_single_gl</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">en_rescaled_single_gl_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">en_rescaled_single_gl_maxsize</span>;
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">delta_en_gl</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_en_gl_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_en_gl_maxsize</span>;
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">delta_ee_gl</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_ee_gl_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">delta_ee_gl_maxsize</span>;
|
|
|
|
} <span style="color: #228b22;">qmckl_jastrow_champ_single_struct</span>;
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgf4c5abf" class="outline-2">
|
|
<h2 id="orgf4c5abf"><span class="section-number-2">3.</span> Single point</h2>
|
|
<div class="outline-text-2" id="text-3">
|
|
</div>
|
|
<div id="outline-container-org5d3744f" class="outline-3">
|
|
<h3 id="org5d3744f"><span class="section-number-3">3.1.</span> Set</h3>
|
|
<div class="outline-text-3" id="text-3-1">
|
|
<p>
|
|
We set the coordinates of the <code>num</code>-th electron for all walkers, where <code>num</code> is the electron which has to be moved.
|
|
The dimension of <code>coord</code> is
|
|
</p>
|
|
<ul class="org-ul">
|
|
<li>[walk<sub>num</sub>][3] if <code>transp</code> is <code>'N'</code></li>
|
|
<li>[3][walk<sub>num</sub>] if <code>transp</code> is <code>'T'</code></li>
|
|
</ul>
|
|
|
|
<p>
|
|
Internally, the coordinates are stored in 'N' format as opposed to elec<sub>coord</sub>.
|
|
This function has to be called before any other functions from this module.
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_set_single_point</span> (<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">char</span> <span style="color: #a0522d;">transp</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">coord</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<p>
|
|
The Fortran function shifts the <code>num</code> by 1 because of 1-based
|
|
indexing.
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_set_single_point_f</span> (<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">char</span> <span style="color: #a0522d;">transp</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">coord</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_set_single_point</span> (<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">char</span> <span style="color: #a0522d;">transp</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">coord</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>)
|
|
{
|
|
|
|
<span style="color: #a020f0;">if</span> (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) {
|
|
<span style="color: #a020f0;">return</span> QMCKL_NULL_CONTEXT;
|
|
}
|
|
|
|
<span style="color: #a020f0;">if</span> (num < 0) {
|
|
<span style="color: #a020f0;">return</span> qmckl_failwith( context,
|
|
QMCKL_INVALID_ARG_3,
|
|
<span style="color: #8b2252;">"qmckl_set_single_point"</span>,
|
|
<span style="color: #8b2252;">"Incorrect point number"</span>);
|
|
}
|
|
|
|
<span style="color: #a020f0;">if</span> (transp != <span style="color: #8b2252;">'N'</span> && transp != <span style="color: #8b2252;">'T'</span>) {
|
|
<span style="color: #a020f0;">return</span> qmckl_failwith( context,
|
|
QMCKL_INVALID_ARG_2,
|
|
<span style="color: #8b2252;">"qmckl_set_single_point"</span>,
|
|
<span style="color: #8b2252;">"transp should be 'N' or 'T'"</span>);
|
|
}
|
|
|
|
<span style="color: #a020f0;">if</span> (coord == <span style="color: #008b8b;">NULL</span>) {
|
|
<span style="color: #a020f0;">return</span> qmckl_failwith( context,
|
|
QMCKL_INVALID_ARG_3,
|
|
<span style="color: #8b2252;">"qmckl_set_single_point"</span>,
|
|
<span style="color: #8b2252;">"coord is a NULL pointer"</span>);
|
|
}
|
|
|
|
<span style="color: #228b22;">qmckl_context_struct</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">ctx</span> = (<span style="color: #228b22;">qmckl_context_struct</span>*) context;
|
|
assert (ctx != <span style="color: #008b8b;">NULL</span>);
|
|
|
|
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span> = ctx->electron.walker.num;
|
|
|
|
<span style="color: #a020f0;">if</span> (size_max < 3*walk_num) {
|
|
<span style="color: #a020f0;">return</span> qmckl_failwith( context,
|
|
QMCKL_INVALID_ARG_4,
|
|
<span style="color: #8b2252;">"qmckl_set_single_point"</span>,
|
|
<span style="color: #8b2252;">"Array too small"</span>);
|
|
}
|
|
|
|
//<span style="color: #b22222;">qmckl_exit_code rc;</span>
|
|
|
|
//<span style="color: #b22222;">if (ctx->single_point.coord.data != NULL) {</span>
|
|
// <span style="color: #b22222;">rc = qmckl_matrix_free(context, &(ctx->single_point.coord));</span>
|
|
// <span style="color: #b22222;">assert (rc == QMCKL_SUCCESS);</span>
|
|
//<span style="color: #b22222;">}</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (ctx->single_point.coord.data == <span style="color: #008b8b;">NULL</span>) {
|
|
ctx->single_point.coord = qmckl_matrix_alloc(context, walk_num, 3);
|
|
<span style="color: #a020f0;">if</span> (ctx->single_point.coord.data == <span style="color: #008b8b;">NULL</span>) {
|
|
<span style="color: #a020f0;">return</span> qmckl_failwith( context,
|
|
QMCKL_ALLOCATION_FAILED,
|
|
<span style="color: #8b2252;">"qmckl_set_single_point"</span>,
|
|
<span style="color: #008b8b;">NULL</span>);
|
|
}
|
|
}
|
|
|
|
ctx->single_point.num = num;
|
|
|
|
<span style="color: #a020f0;">if</span> (transp == <span style="color: #8b2252;">'N'</span>) {
|
|
<span style="color: #228b22;">double</span> *<span style="color: #a0522d;">a</span> = ctx->single_point.coord.data;
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">i</span>=0 ; i<3*walk_num ; ++i) {
|
|
a[i] = coord[i];
|
|
}
|
|
} <span style="color: #a020f0;">else</span> {
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">i</span>=0 ; i<walk_num ; ++i) {
|
|
qmckl_mat(ctx->single_point.coord, i, 0) = coord[i*walk_num + 0];
|
|
qmckl_mat(ctx->single_point.coord, i, 1) = coord[i*walk_num + 1];
|
|
qmckl_mat(ctx->single_point.coord, i, 2) = coord[i*walk_num + 2];
|
|
}
|
|
}
|
|
|
|
/* <span style="color: #b22222;">Increment the date of the single point</span> */
|
|
ctx->single_point.date += 1UL;
|
|
|
|
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
|
|
|
|
}
|
|
|
|
<span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_set_single_point_f</span> (<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">char</span> <span style="color: #a0522d;">transp</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">coord</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>)
|
|
{
|
|
<span style="color: #a020f0;">return</span> qmckl_set_single_point(context, transp, num-1, coord, size_max);
|
|
}
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_set_single_point</span><span style="color: #a0522d;">(context, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> transp, num, coord, size_max) bind(C, name=</span><span style="color: #8b2252;">"qmckl_set_single_point_f"</span><span style="color: #a0522d;">)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">import</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">character</span>(<span style="color: #008b8b;">c_char</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> transp</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coord(*)</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
|
|
<span style="color: #a020f0;">end function</span>
|
|
<span style="color: #a020f0;">end interface</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org295fa70" class="outline-3">
|
|
<h3 id="org295fa70"><span class="section-number-3">3.2.</span> Touch</h3>
|
|
<div class="outline-text-3" id="text-3-2">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_single_touch</span> (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div id="outline-container-org98a8ef3" class="outline-2">
|
|
<h2 id="org98a8ef3"><span class="section-number-2">4.</span> Electron-electron and electron-nucleus distances for single point</h2>
|
|
<div class="outline-text-2" id="text-4">
|
|
<p>
|
|
In order to calculate the \(\delta J\), the updated electron-electron and electron-nucleus distances are required.
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-orgee9b5cd" class="outline-3">
|
|
<h3 id="orgee9b5cd"><span class="section-number-3">4.1.</span> Electron-electron distances</h3>
|
|
<div class="outline-text-3" id="text-4-1">
|
|
<p>
|
|
Electron-electron distance between the single electron and all
|
|
electrons for all walkers.
|
|
Dimension is <code>[walk_num][elec_num]</code>.
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org19eb2c6" class="outline-4">
|
|
<h4 id="org19eb2c6"><span class="section-number-4">4.1.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-4-1-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_get_single_electron_ee_distance</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">distance</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org56ba431" class="outline-4">
|
|
<h4 id="org56ba431"><span class="section-number-4">4.1.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-4-1-2">
|
|
<table id="org7026c89" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Index of single electron</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>coord</code></td>
|
|
<td class="org-left"><code>double[3][walk_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron coordinates</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>single_coord</code></td>
|
|
<td class="org-left"><code>double[walk_num][3]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Single electron coordinates</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>single_ee_distance</code></td>
|
|
<td class="org-left"><code>double[walk_num][elec_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Electron-electron distances for single electron</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_single_ee_distance</span><span style="color: #a0522d;">(context, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> num_in, elec_num, walk_num, coord, single_coord, single_ee_distance) </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> result(info) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num, num_in</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coord(elec_num,walk_num,3)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> single_coord(3,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> single_ee_distance(elec_num,walk_num)</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> k, i, j, num</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, y, z</span>
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
num = num_in + 1
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (elec_num <= 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_2
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_3
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">do</span> k=1,walk_num
|
|
info = qmckl_distance(context, <span style="color: #8b2252;">'T'</span>, <span style="color: #8b2252;">'N'</span>, elec_num, 1_8, <span style="color: #a020f0;">&</span>
|
|
coord(1,k,1), elec_num*walk_num, <span style="color: #a020f0;">&</span>
|
|
single_coord(1,k), 3_8, <span style="color: #a020f0;">&</span>
|
|
single_ee_distance(1,k), elec_num)
|
|
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">then</span>
|
|
<span style="color: #a020f0;">exit</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
single_ee_distance(num,k) = 0.0d0
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_single_ee_distance</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org0875b58" class="outline-3">
|
|
<h3 id="org0875b58"><span class="section-number-3">4.2.</span> Electron-nucleus distances</h3>
|
|
<div class="outline-text-3" id="text-4-2">
|
|
<p>
|
|
Electron-nucleus distance between the single electron and all
|
|
nuclei for all walkers.
|
|
Dimension is <code>[walk_num][nucl_num]</code>.
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org37d8465" class="outline-4">
|
|
<h4 id="org37d8465"><span class="section-number-4">4.2.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-4-2-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_single_electron_en_distance</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">distance</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org3178ea8" class="outline-4">
|
|
<h4 id="org3178ea8"><span class="section-number-4">4.2.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-4-2-2">
|
|
<table id="orgd8eaa48" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_coord</code></td>
|
|
<td class="org-left"><code>double[3][walk_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron coordinates</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_coord</code></td>
|
|
<td class="org-left"><code>double[3][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Nuclear coordinates</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>single_en_distance</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Electron-nucleus distances for single-electron</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_single_en_distance</span><span style="color: #a0522d;">(context, nucl_num, walk_num, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> elec_coord, nucl_coord, single_en_distance) result(info) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> nucl_num, walk_num</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> elec_coord(3,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> nucl_coord(nucl_num,3)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> single_en_distance(nucl_num, walk_num)</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> k</span>
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (nucl_num <= 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_2
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
info = qmckl_distance(context, <span style="color: #8b2252;">'T'</span>, <span style="color: #8b2252;">'N'</span>, nucl_num, walk_num, <span style="color: #a020f0;">&</span>
|
|
nucl_coord, nucl_num, <span style="color: #a020f0;">&</span>
|
|
elec_coord, 3_8, <span style="color: #a020f0;">&</span>
|
|
single_en_distance, nucl_num)
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_single_en_distance</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org27edc40" class="outline-2">
|
|
<h2 id="org27edc40"><span class="section-number-2">5.</span> Electron-electron-nucleus Jastrow</h2>
|
|
<div class="outline-text-2" id="text-5">
|
|
<p>
|
|
Calcules the single electron contributions to the electron-electron-nucleus Jastrow term.
|
|
First, the rescaled distances for the single electron electron-nucleus and electron-electron distances are computed.
|
|
These rescaled distances can be calculates by
|
|
\[
|
|
\widetilde{R}_{i\alpha} = e^{-\kappa l R_{i\alpha}} \quad \text{and} \quad \widetilde{r}_{ij} = e^{-\kappa l r_{ij}}.
|
|
\]
|
|
Here, \(\kappa\) is the rescaling factor and \(l\) the power. The neccessery powers are stored in the same array.
|
|
From these, we can calculate the \(\delta \widetilde{R}\) and \(\delta \widetilde{r}\) using
|
|
</p>
|
|
\begin{eqnarray*}
|
|
\delta \widetilde{R}_{i\alpha} &=& \widetilde{R}_{i\alpha}^\text{new} - \widetilde{R}_{i\alpha}^\text{old} \quad \text{and}\\
|
|
\delta \widetilde{r}_{ij} &=& \widetilde{r}_{ij}^\text{new} - \widetilde{r}_{ij}^\text{old}.
|
|
\end{eqnarray*}
|
|
|
|
|
|
<p>
|
|
With these, we can now calculate the single electron contribution to the \(\delta P\) matrix, using the equation
|
|
</p>
|
|
\begin{eqnarray*}
|
|
\delta P_{i,\alpha,k,l} &=& P^{\text{new}}_{i,\alpha,k,l} - P^{\text{old}}_{i,\alpha,k,l}\\
|
|
&=& \sum_{j=1}^{N_\text{elec}} \left(\widetilde{r}_{i,j,k} \delta \widetilde{R}_{j,\alpha,l}\delta_{j,\text{num}} +
|
|
\delta \widetilde{r}_{i,j,k} \widetilde{R}_{j,\alpha,l} (\delta_{j,\text{num}}
|
|
+ \delta_{i,\text{num}}) + \delta \widetilde{r}_{i,j,k} \delta \widetilde{R}_{j,\alpha,l} \delta_{j,\text{num}}\right)\\
|
|
&=& \sum_{j=1}^{N_\text{elec}} \left( \delta \widetilde{r}_{i,j,k} \widetilde{R}_{j,\alpha,l} \delta_{i,\text{num}} \right)
|
|
+ \widetilde{r}_{i,\text{num},k} \delta \widetilde{R}_{\text{num},\alpha,l} + \delta \widetilde{r}_{i,\text{num},k} \left( \widetilde{R}_{\text{num},\alpha,l}
|
|
+ \delta \widetilde{R}_{\text{num},\alpha,l} \right).
|
|
\end{eqnarray*}
|
|
|
|
<p>
|
|
Then, the electron-electron-nucleus Jastrow value can be calculated by
|
|
</p>
|
|
\begin{eqnarray*}
|
|
\delta J_{een} &=& J_{een}^{\text{new}} - J_{een}^{\text{old}}\\
|
|
&=&\sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}}\sum_{\alpha=1}^{N_\text{nucl}} c_{l,k,p,\alpha}
|
|
\sum_{i=1}^{N_\text{elec}} \left( \delta \widetilde{R}_{i,\alpha,(p-k-l)/2} P_{i,\alpha,k,(p-k+l)/2} \delta_{i,\text{num}}
|
|
+ \widetilde{R}_{i,\alpha,(p-k-l)/2} \delta P_{i,\alpha,k,(p-k+l)/2}
|
|
+ \delta \widetilde{R}_{i,\alpha,(p-k-l)/2} \delta P_{i,\alpha,k,(p-k+l)/2} \delta_{i,\text{num}} \right)\\
|
|
&=& \sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}}\sum_{\alpha=1}^{N_\text{nucl}} c_{l,k,p,\alpha} \left(
|
|
\sum_{i=1}^{N_\text{elec}} \left( \widetilde{R}_{i,\alpha,(p-k-l)/2} \delta P_{i,\alpha,k,(p-k+l)/2} \right)
|
|
+ \delta \widetilde{R}_{\text{num},\alpha,(p-k-l)/2} \left(P_{\text{num},\alpha,k,(p-k+l)/2} + \delta P_{\text{num},\alpha,k,(p-k+l)/2} \right)\right)
|
|
\end{eqnarray*}
|
|
|
|
|
|
<p>
|
|
To calculate the gradients and Laplacian of the electron-electron-nucleus Jastrow,
|
|
we first have to calculate the gradients and Laplacian of the rescaled distances,
|
|
\[
|
|
\partial_{i,m} \widetilde{R}_{i\alpha} = -\kappa l e^{-\kappa l R_{i\alpha}} \frac{r_{i,m} - R_{\alpha,m}}{R_{i\alpha}} \quad \text{and} \quad
|
|
\partial_{i,4} \widetilde{R}_{i\alpha} = -\kappa l \left(\frac{2}{R_{i\alpha}}- \kappa l \right) e^{-\kappa l R_{i\alpha}},
|
|
\]
|
|
where \(i\) is the electron of which we are taking the derivative and \(m=1:3\) are the gradients and \(m=4\) is the Laplacian.
|
|
The derivatives of the single electron rescaled electron-nucleus distances are only nonzero when \(i=\text{num}\).
|
|
Similarly for \(r\) we get
|
|
\[
|
|
\partial_{i,m} \widetilde{r}_{ij} = -\kappa l e^{-\kappa l r_{ij}} \frac{r_{i,m} - r_{j,m}}{r_{ij}} \quad \text{and} \quad
|
|
\partial_{i,4} \widetilde{r}_{ij} = -\kappa l \left(\frac{2}{r_{ij}}- \kappa l \right) e^{-\kappa l r_{ij}}.
|
|
\]
|
|
</p>
|
|
|
|
<p>
|
|
With these, we can now calculate the gradient and Laplacian of the \(\delta P\) matrix, using the equation
|
|
</p>
|
|
\begin{eqnarray*}
|
|
\partial_{i,m} \delta P_{i,\alpha,k,l} &=& \partial_{i,m} P_{i,\alpha,k,l}^\text{new} - \partial_{i,m} P_{i,\alpha,k,l}^\text{old}\\
|
|
&=& \partial_{i,m}\delta \widetilde{r}_{\text{num},i,k} \left(\partial_{i,m}\delta \widetilde{R}_{\text{num},\alpha,l} + \partial_{i,m}\widetilde{R}_{\text{num},\alpha,l} \right) g_m
|
|
+ \partial_{i,m}\widetilde{r}_{\text{num},i,k} \delta \widetilde{R}_{\text{num},\alpha,l}
|
|
+ \delta_{i,\text{num}} \sum_{j=1}^{N_\text{elec}} \left( \partial_{j,m} \delta \widetilde{r}_{\text{num},j,k} \widetilde{R}_{j,\alpha,l} \right),
|
|
\end{eqnarray*}
|
|
<p>
|
|
where \(g_m = \{-1,-1,-1,1\}\).
|
|
</p>
|
|
|
|
<p>
|
|
Then, the gradient and Laplacian of the electron-electron-nucleus Jastrow value can be calculated by
|
|
</p>
|
|
\begin{eqnarray*}
|
|
\delta \partial_{i,m} J_{een} &=& \partial_{i,m} J_{een}^{\text{new}} - \partial_{i,m} J_{een}^{\text{old}}\\
|
|
&=&\sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}}\sum_{\alpha=1}^{N_\text{nucl}} c_{l,k,p,\alpha}
|
|
\left( \widetilde{R}_{i,\alpha,(p-k-l)/2} \partial_{i,m} \delta P_{i,\alpha,k,(p-k+l)/2}
|
|
+ \widetilde{R}_{i,\alpha,(p-k+l)/2} \partial_{i,m} \delta P_{i,\alpha,k,(p-k-l)/2} \right. \\
|
|
& &\ + \partial_{i,m}\widetilde{R}_{i,\alpha,(p-k-l)/2} \delta P_{i,\alpha,k,(p-k+l)/2}
|
|
+ \partial_{i,m}\widetilde{R}_{i,\alpha,(p-k+l)/2} \delta P_{i,\alpha,k,(p-k-l)/2} \\
|
|
& &\ + \delta_{i,\text{num}} \left( \delta \widetilde{R}_{i,\alpha,(p-k-l)/2} \left ( \partial_{i,m} P_{i,\alpha,k,(p-k+l)/2} + \partial_{i,m} \delta P_{i,\alpha,k,(p-k+l)/2} \right)
|
|
+ \delta \widetilde{R}_{i,\alpha,(p-k+l)/2} \left ( \partial_{i,m} P_{i,\alpha,k,(p-k-l)/2} + \partial_{i,m} \delta P_{i,\alpha,k,(p-k-l)/2} \right) \right. \\
|
|
& &\ \left. + \partial_{i,m} \delta \widetilde{R}_{i,\alpha,(p-k-l)/2} \left ( P_{i,\alpha,k,(p-k+l)/2} + \delta P_{i,\alpha,k,(p-k+l)/2} \right)
|
|
+ \partial_{i,m} \delta \widetilde{R}_{i,\alpha,(p-k+l)/2} \left ( P_{i,\alpha,k,(p-k-l)/2} + \delta P_{i,\alpha,k,(p-k-l)/2} \right) \right)\\
|
|
& &\ + \delta_{m,4} \sum_{d=1}^3 \left( \partial_{i,d} \widetilde{R}_{i,\alpha,(p-k-l)/2} \partial_{i,d} \delta P_{i,\alpha,k,(p-k+l)/2}
|
|
+ \partial_{i,d} \widetilde{R}_{i,\alpha,(p-k+l)/2} \partial_{i,d} \delta P_{i,\alpha,k,(p-k-l)/2} \right)\\
|
|
& &\ \left. + \delta_{m,4}\delta_{i,\text{num}} \sum_{d=1}^3\left( \partial_{i,d}\delta \widetilde{R}_{i,\alpha,(p-k-l)/2} \left( \partial_{i,d} P_{i,\alpha,k,(p-k+l)/2} + \partial_{i,d}\delta P_{i,\alpha,k,(p-k+l)/2} \right)
|
|
+ \partial_{i,d}\delta \widetilde{R}_{i,\alpha,(p-k+l)/2} \left( \partial_{i,d} P_{i,\alpha,k,(p-k-l)/2} + \partial_{i,d} \delta P_{i,\alpha,k,(p-k-l)/2} \right) \right) \right)
|
|
\end{eqnarray*}
|
|
</div>
|
|
|
|
<div id="outline-container-orgf692897" class="outline-3">
|
|
<h3 id="orgf692897"><span class="section-number-3">5.1.</span> Electron-electron rescaled distances</h3>
|
|
<div class="outline-text-3" id="text-5-1">
|
|
<p>
|
|
Computes the new components of the \(\widetilde{r}_{ij}\) matrix. Because only one electron is moved, the new matrix only has one dimension of size <code>elec_num</code>.
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-orgf3cd9c7" class="outline-4">
|
|
<h4 id="orgf3cd9c7"><span class="section-number-4">5.1.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-5-1-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_een_rescaled_single_e</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">distance_rescaled</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org4be8179" class="outline-4">
|
|
<h4 id="org4be8179"><span class="section-number-4">5.1.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-5-1-2">
|
|
<table id="org4446a5f" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of single electron</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>cord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Order of polynomials</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>rescale_factor_ee</code></td>
|
|
<td class="org-left"><code>double</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Factor to rescale ee distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>single_ee_distance</code></td>
|
|
<td class="org-left"><code>double[walk_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Single electron-electron distances for each walker</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_e</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Rescaled electron-electron distances for each walker</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_e</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Single electron-electron rescaled distances for each walker</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_een_rescaled_single_e_doc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> context, num_in, walk_num, elec_num, cord_num, rescale_factor_ee, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> single_ee_distance, een_rescaled_e, een_rescaled_single_e) </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> result(info) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> cord_num</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> rescale_factor_ee</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> single_ee_distance(elec_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_e(elec_num,elec_num,0:cord_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> een_rescaled_single_e(elec_num,0:cord_num,walk_num)</span>
|
|
|
|
<span style="color: #228b22;">double precision</span>,<span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> een_rescaled_single_e_ij(:,:)</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x</span>
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, j, k, l, nw, num</span>
|
|
|
|
num = num_in + 1
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 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 <= 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_3
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (cord_num < 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_4
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">allocate</span>(een_rescaled_single_e_ij(elec_num, cord_num + 1))
|
|
|
|
! <span style="color: #b22222;">Prepare table of exponentiated distances raised to appropriate power</span>
|
|
<span style="color: #a020f0;">do</span> nw = 1, walk_num
|
|
een_rescaled_single_e_ij(:, 1) = 1.0d0
|
|
|
|
|
|
<span style="color: #a020f0;">do</span> j = 1, elec_num
|
|
een_rescaled_single_e_ij(j, 2) = dexp(-rescale_factor_ee * single_ee_distance(j, nw))
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
|
|
<span style="color: #a020f0;">do</span> l = 2, cord_num
|
|
<span style="color: #a020f0;">do</span> k = 1, elec_num
|
|
een_rescaled_single_e_ij(k, l + 1) = een_rescaled_single_e_ij(k, l) * een_rescaled_single_e_ij(k, 2)
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
! <span style="color: #b22222;">prepare the actual een table</span>
|
|
een_rescaled_single_e(:,0,nw) = 1.0d0
|
|
|
|
<span style="color: #a020f0;">do</span> l = 1, cord_num
|
|
<span style="color: #a020f0;">do</span> j = 1, elec_num
|
|
x = een_rescaled_single_e_ij(j, l + 1)
|
|
een_rescaled_single_e(j, l, nw) = x
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
een_rescaled_single_e(num, :, :) = 0.0d0
|
|
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_een_rescaled_single_e_doc</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div id="outline-container-org9a7ab24" class="outline-3">
|
|
<h3 id="org9a7ab24"><span class="section-number-3">5.2.</span> Electron-nucleus rescaled distances</h3>
|
|
<div class="outline-text-3" id="text-5-2">
|
|
<p>
|
|
Computes the new components of the \(\widetilde{R}_{i\alpha}\) matrix.
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org519a63b" class="outline-4">
|
|
<h4 id="org519a63b"><span class="section-number-4">5.2.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-5-2-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_een_rescaled_single_n</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">distance_rescaled</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org891e551" class="outline-4">
|
|
<h4 id="org891e551"><span class="section-number-4">5.2.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-5-2-2">
|
|
<table id="orge19a0cd" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of single electron</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of atoms</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of atoms</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of atom types</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_vector</code></td>
|
|
<td class="org-left"><code>int64_t[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Types of atoms</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>cord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Order of polynomials</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>rescale_factor_en</code></td>
|
|
<td class="org-left"><code>double[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Factor to rescale ee distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>single_en_distance</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Single electron-nucleus rescaled distances</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_een_rescaled_single_n</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> context, num_in, walk_num, elec_num, nucl_num, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> type_nucl_num, type_nucl_vector, cord_num, rescale_factor_en, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> single_en_distance, een_rescaled_n, een_rescaled_single_n) </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> result(info) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> nucl_num</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> type_nucl_num</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> type_nucl_vector(nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> cord_num</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> rescale_factor_en(type_nucl_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> single_en_distance(nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n(elec_num,nucl_num,0:cord_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> een_rescaled_single_n(nucl_num,0:cord_num,walk_num)</span>
|
|
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x</span>
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, k, l, nw, num</span>
|
|
|
|
num = num_in + 1
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_2
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (nucl_num <= 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_3
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (cord_num < 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_4
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">do</span> nw = 1, walk_num
|
|
|
|
! <span style="color: #b22222;">prepare the actual een table</span>
|
|
een_rescaled_single_n(:, 0, nw) = 1.0d0
|
|
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
een_rescaled_single_n(a, 1, nw) = dexp(-rescale_factor_en(type_nucl_vector(a)+1) * single_en_distance(a, nw))
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">do</span> l = 2, cord_num
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
een_rescaled_single_n(a, l, nw) = een_rescaled_single_n(a, l - 1, nw) * een_rescaled_single_n(a, 1, nw)
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_een_rescaled_single_n</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgc9430c2" class="outline-3">
|
|
<h3 id="orgc9430c2"><span class="section-number-3">5.3.</span> \(\delta P\) matrix</h3>
|
|
<div class="outline-text-3" id="text-5-3">
|
|
<p>
|
|
Computes the \(\delta P\) matrix.
|
|
</p>
|
|
\begin{eqnarray*}
|
|
\delta P_{i,\alpha,k,l} = \sum_{j=1}^{N_\text{elec}} \left( \delta \widetilde{r}_{i,j,k} \widetilde{R}_{j,\alpha,l} \delta_{i,\text{num}} \right)
|
|
+ \widetilde{r}_{i,\text{num},k} \delta \widetilde{R}_{\text{num},\alpha,l} + \delta \widetilde{r}_{i,\text{num},k} \left( \widetilde{R}_{\text{num},\alpha,l}
|
|
+ \delta \widetilde{R}_{\text{num},\alpha,l} \right).
|
|
\end{eqnarray*}
|
|
</div>
|
|
|
|
<div id="outline-container-orgce7689f" class="outline-4">
|
|
<h4 id="orgce7689f"><span class="section-number-4">5.3.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-5-3-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_jastrow_champ_delta_p</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">delta_p</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org6a8bf97" class="outline-4">
|
|
<h4 id="org6a8bf97"><span class="section-number-4">5.3.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-5-3-2">
|
|
<table id="org5ee9e98" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Single point index</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>cord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">order of polynomials</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_e</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus single rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_e</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron single rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>delta_p</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Delta P matrix</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_jastrow_champ_delta_p_doc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> context, num_in, walk_num, elec_num, nucl_num, cord_num, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> een_rescaled_n, een_rescaled_e, een_rescaled_single_n, een_rescaled_single_e, delta_p) </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> result(info) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in, walk_num, elec_num, cord_num, nucl_num</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n(elec_num, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_e(elec_num, elec_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n(nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_e(elec_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_p(elec_num, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> een_rescaled_delta_e(elec_num)</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, c, j, l, k, p, m, n, nw, num</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> dn, dn2</span>
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> LDA, LDB, LDC</span>
|
|
|
|
num = num_in + 1
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) info = QMCKL_INVALID_ARG_3
|
|
<span style="color: #a020f0;">if</span> (elec_num <= 0) info = QMCKL_INVALID_ARG_4
|
|
<span style="color: #a020f0;">if</span> (nucl_num <= 0) info = QMCKL_INVALID_ARG_5
|
|
<span style="color: #a020f0;">if</span> (cord_num < 0) info = QMCKL_INVALID_ARG_6
|
|
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (cord_num == 0) <span style="color: #a020f0;">return</span>
|
|
|
|
<span style="color: #a020f0;">do</span> nw=1, walk_num
|
|
|
|
<span style="color: #a020f0;">do</span> i=0, cord_num-1
|
|
|
|
een_rescaled_delta_e(:) = een_rescaled_single_e(:,i,nw) - een_rescaled_e(:,num,i,nw)
|
|
|
|
<span style="color: #a020f0;">do</span> c=0,cord_num
|
|
<span style="color: #a020f0;">do</span> a=1,nucl_num
|
|
dn = een_rescaled_single_n(a,c,nw) - een_rescaled_n(num,a,c,nw)
|
|
dn2 = een_rescaled_single_n(a,c,nw)
|
|
<span style="color: #a020f0;">do</span> j=1,elec_num
|
|
delta_p(j,a,c,i,nw) = een_rescaled_e(j,num,i,nw)*dn + een_rescaled_delta_e(j) * dn2
|
|
<span style="color: #a020f0;">enddo</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
info = qmckl_dgemm(context, <span style="color: #8b2252;">'T'</span>, <span style="color: #8b2252;">'N'</span>, 1_8, nucl_num * (cord_num+1_8), elec_num, 1.0d0, <span style="color: #a020f0;">&</span>
|
|
een_rescaled_delta_e,elec_num, <span style="color: #a020f0;">&</span>
|
|
een_rescaled_n(1,1,0,nw),elec_num, <span style="color: #a020f0;">&</span>
|
|
1.0d0, <span style="color: #a020f0;">&</span>
|
|
delta_p(num,1,0,i,nw),elec_num)
|
|
|
|
<span style="color: #a020f0;">enddo</span>
|
|
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_delta_p_doc</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgef0997a" class="outline-3">
|
|
<h3 id="orgef0997a"><span class="section-number-3">5.4.</span> Electron-electron-nucleus Jastrow value</h3>
|
|
<div class="outline-text-3" id="text-5-4">
|
|
<p>
|
|
Computes \(\delta J_{een}\) by combining \(\delta \widetilde{R}_{i\alpha}\) and \(\delta P\).
|
|
</p>
|
|
\begin{eqnarray*}
|
|
J_{een} = \sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}}\sum_{\alpha=1}^{N_\text{nucl}} c_{l,k,p,\alpha} \left(
|
|
\sum_{i=1}^{N_\text{elec}} \left( \widetilde{R}_{i,\alpha,(p-k-l)/2} \delta P_{i,\alpha,k,(p-k+l)/2} \right)
|
|
+ \delta \widetilde{R}_{\text{num},\alpha,(p-k-l)/2} \left(P_{\text{num},\alpha,k,(p-k+l)/2} + \delta P_{\text{num},\alpha,k,(p-k+l)/2} \right)\right)
|
|
\end{eqnarray*}
|
|
</div>
|
|
|
|
<div id="outline-container-org633e0b5" class="outline-4">
|
|
<h4 id="org633e0b5"><span class="section-number-4">5.4.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-5-4-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_jastrow_champ_single_een</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">delta_een</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_get_jastrow_champ_single_een</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> delta_een, size_max) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">import</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span> (qmckl_context) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>), <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_een(size_max)</span>
|
|
<span style="color: #a020f0;">end function</span>
|
|
<span style="color: #a020f0;">end interface</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org03d6a88" class="outline-4">
|
|
<h4 id="org03d6a88"><span class="section-number-4">5.4.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-5-4-2">
|
|
<table id="org946faf2" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Single point number</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>cord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">order of polynomials</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>dim_c_vector</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">dimension of full coefficient vector</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>c_vector_full</code></td>
|
|
<td class="org-left"><code>double[dim_c_vector][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">full coefficient vector</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>lkpm_combined_index</code></td>
|
|
<td class="org-left"><code>int64_t[4][dim_c_vector]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">combined indices</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>tmp_c</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">P matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>delta_p</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Delta P matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_e</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus single rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_e</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron single rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>delta_een</code></td>
|
|
<td class="org-left"><code>double[walk_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Single electron electron-electron-nucleus Jastrow</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_jastrow_champ_factor_single_een_doc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> context, num_in, walk_num, elec_num, nucl_num, cord_num, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> dim_c_vector, c_vector_full, lkpm_combined_index, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> tmp_c, delta_p, een_rescaled_n, een_rescaled_e, een_rescaled_single_n, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> een_rescaled_single_e, delta_een) </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> result(info) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in, walk_num, elec_num, cord_num, nucl_num, dim_c_vector</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> lkpm_combined_index(dim_c_vector,4)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> c_vector_full(nucl_num, dim_c_vector)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> tmp_c(elec_num, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> delta_p(elec_num, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n(elec_num, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_e(elec_num, elec_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n(nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_e(elec_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_een(walk_num)</span>
|
|
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> delta_c(nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> delta_c2(elec_num, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> een_rescaled_delta_n(nucl_num, 0:cord_num)</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, p, m, n, nw, num</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> accu, accu2, cn</span>
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> LDA, LDB, LDC</span>
|
|
|
|
num = num_in + 1
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) info = QMCKL_INVALID_ARG_3
|
|
<span style="color: #a020f0;">if</span> (elec_num <= 0) info = QMCKL_INVALID_ARG_4
|
|
<span style="color: #a020f0;">if</span> (nucl_num <= 0) info = QMCKL_INVALID_ARG_5
|
|
<span style="color: #a020f0;">if</span> (cord_num < 0) info = QMCKL_INVALID_ARG_6
|
|
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
|
|
|
|
delta_een = 0.0d0
|
|
|
|
<span style="color: #a020f0;">if</span> (cord_num == 0) <span style="color: #a020f0;">return</span>
|
|
|
|
<span style="color: #a020f0;">do</span> nw =1, walk_num
|
|
een_rescaled_delta_n(:,:) = een_rescaled_single_n(:,:,nw) - een_rescaled_n(num,:,:,nw)
|
|
<span style="color: #a020f0;">do</span> n = 1, dim_c_vector
|
|
l = lkpm_combined_index(n, 1)
|
|
k = lkpm_combined_index(n, 2)
|
|
p = lkpm_combined_index(n, 3)
|
|
m = lkpm_combined_index(n, 4)
|
|
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
cn = c_vector_full(a, n)
|
|
<span style="color: #a020f0;">if</span>(cn == 0.d0) <span style="color: #a020f0;">cycle</span>
|
|
|
|
accu = 0.0d0
|
|
<span style="color: #a020f0;">do</span> j = 1, elec_num
|
|
accu = accu + een_rescaled_n(j,a,m,nw) * delta_p(j,a,m+l,k,nw)
|
|
<span style="color: #a020f0;">end do</span>
|
|
accu = accu + een_rescaled_delta_n(a,m) * (tmp_c(num,a,m+l,k,nw) + delta_p(num,a,m+l,k,nw))
|
|
delta_een(nw) = delta_een(nw) + accu * cn
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_factor_single_een_doc</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org9251069" class="outline-3">
|
|
<h3 id="org9251069"><span class="section-number-3">5.5.</span> Electron-nucleus rescaled distance derivative</h3>
|
|
<div class="outline-text-3" id="text-5-5">
|
|
<p>
|
|
Calculates \(\partial_{i,m} \widetilde{R}_{i,\alpha}\), which is required to compute the derivative of \(J_{een}\).
|
|
\[
|
|
\partial_{i,m} \widetilde{R}_{i\alpha} = -\kappa l e^{-\kappa l R_{i\alpha}} \frac{r_{i,m} - R_{\alpha,m}}{R_{i\alpha}} \quad \text{and} \quad
|
|
\partial_{i,4} \widetilde{R}_{i\alpha} = -\kappa l \left(\frac{2}{R_{i\alpha}}- \kappa l \right) e^{-\kappa l R_{i\alpha}},
|
|
\]
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org48e8202" class="outline-4">
|
|
<h4 id="org48e8202"><span class="section-number-4">5.5.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-5-5-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_een_rescaled_single_n_gl</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">distance_rescaled</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org60f753a" class="outline-4">
|
|
<h4 id="org60f753a"><span class="section-number-4">5.5.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-5-5-2">
|
|
<table id="orga43cfe6" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of atoms</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of atom types</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_vector</code></td>
|
|
<td class="org-left"><code>int64_t[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Types of atoms</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>cord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Order of polynomials</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>rescale_factor_en</code></td>
|
|
<td class="org-left"><code>double[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Factor to rescale ee distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>coord_ee</code></td>
|
|
<td class="org-left"><code>double[walk_num][3]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron coordinates</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>coord_n</code></td>
|
|
<td class="org-left"><code>double[3][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Nuclear coordinates</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>single_en_distance</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus single distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled single distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_n_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Electron-nucleus rescaled single distances derivative</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_een_rescaled_single_n_gl</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> context, walk_num, nucl_num, type_nucl_num, type_nucl_vector, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> cord_num, rescale_factor_en, coord_ee, coord_n, single_en_distance, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> een_rescaled_single_n, een_rescaled_single_n_gl) </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> result(info) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> nucl_num</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> type_nucl_num</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> type_nucl_vector(nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> cord_num</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> rescale_factor_en(type_nucl_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coord_ee(3,walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coord_n(nucl_num,3)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> single_en_distance(nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n(nucl_num,0:cord_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> een_rescaled_single_n_gl(4,nucl_num,0:cord_num,walk_num)</span>
|
|
|
|
<span style="color: #228b22;">double precision</span>,<span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> elnuc_dist_gl(:,:)</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, ria_inv, kappa_l</span>
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, k, l, nw, ii</span>
|
|
|
|
<span style="color: #a020f0;">allocate</span>(elnuc_dist_gl(4, nucl_num))
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_2
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
|
|
<span style="color: #a020f0;">if</span> (nucl_num <= 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_3
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (cord_num < 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_4
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
! <span style="color: #b22222;">Prepare table of exponentiated distances raised to appropriate power</span>
|
|
een_rescaled_single_n_gl = 0.0d0
|
|
<span style="color: #a020f0;">do</span> nw = 1, walk_num
|
|
! <span style="color: #b22222;">prepare the actual een table</span>
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
ria_inv = 1.0d0 / single_en_distance(a, nw)
|
|
<span style="color: #a020f0;">do</span> ii = 1, 3
|
|
elnuc_dist_gl(ii, a) = (coord_ee(ii,nw) - coord_n(a, ii)) * ria_inv
|
|
<span style="color: #a020f0;">end do</span>
|
|
elnuc_dist_gl(4, a) = 2.0d0 * ria_inv
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">do</span> l = 0, cord_num
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
kappa_l = - <span style="color: #a020f0;">dble</span>(l) * rescale_factor_en(type_nucl_vector(a)+1)
|
|
een_rescaled_single_n_gl(1, a, l, nw) = kappa_l * elnuc_dist_gl(1, a)
|
|
een_rescaled_single_n_gl(2, a, l, nw) = kappa_l * elnuc_dist_gl(2, a)
|
|
een_rescaled_single_n_gl(3, a, l, nw) = kappa_l * elnuc_dist_gl(3, a)
|
|
een_rescaled_single_n_gl(4, a, l, nw) = kappa_l * (elnuc_dist_gl(4, a) + kappa_l)
|
|
|
|
een_rescaled_single_n_gl(1, a, l, nw) = een_rescaled_single_n_gl(1, a, l, nw) * <span style="color: #a020f0;">&</span>
|
|
een_rescaled_single_n(a, l, nw)
|
|
een_rescaled_single_n_gl(2, a, l, nw) = een_rescaled_single_n_gl(2, a, l, nw) * <span style="color: #a020f0;">&</span>
|
|
een_rescaled_single_n(a, l, nw)
|
|
een_rescaled_single_n_gl(3, a, l, nw) = een_rescaled_single_n_gl(3, a, l, nw) * <span style="color: #a020f0;">&</span>
|
|
een_rescaled_single_n(a, l, nw)
|
|
een_rescaled_single_n_gl(4, a, l, nw) = een_rescaled_single_n_gl(4, a, l, nw) * <span style="color: #a020f0;">&</span>
|
|
een_rescaled_single_n(a, l, nw)
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_een_rescaled_single_n_gl</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgfdca020" class="outline-3">
|
|
<h3 id="orgfdca020"><span class="section-number-3">5.6.</span> Electron-electron rescaled distances derivative</h3>
|
|
<div class="outline-text-3" id="text-5-6">
|
|
<p>
|
|
Calculates the updated terms of \(\partial_{i,m} \widetilde{r}_{ij}\), required for computing the derivative of \(J_{een}\).
|
|
\[
|
|
\partial_{i,m} \widetilde{r}_{ij} = -\kappa l e^{-\kappa l r_{ij}} \frac{r_{i,m} - r_{j,m}}{r_{ij}} \quad \text{and} \quad
|
|
\partial_{i,4} \widetilde{r}_{ij} = -\kappa l \left(\frac{2}{r_{ij}}- \kappa l \right) e^{-\kappa l r_{ij}}.
|
|
\]
|
|
</p>
|
|
</div>
|
|
|
|
|
|
<div id="outline-container-orgd883675" class="outline-4">
|
|
<h4 id="orgd883675"><span class="section-number-4">5.6.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-5-6-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_een_rescaled_single_e_gl</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">distance_rescaled</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgb45e5a6" class="outline-4">
|
|
<h4 id="orgb45e5a6"><span class="section-number-4">5.6.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-5-6-2">
|
|
<table id="org2ba14d6" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Index of single electron</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>cord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Order of polynomials</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>rescale_factor_ee</code></td>
|
|
<td class="org-left"><code>double</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Factor to rescale ee distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>coord</code></td>
|
|
<td class="org-left"><code>double[walk_num][3]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Single electron coordinates</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>coord_ee</code></td>
|
|
<td class="org-left"><code>double[3][walk_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron coordinates</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>single_ee_distance</code></td>
|
|
<td class="org-left"><code>double[walk_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron single distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_e</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron rescaled single distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_e_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num][4]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Electron-electron rescaled single distances derivative</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_een_rescaled_single_e_gl_doc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> context, num_in, walk_num, elec_num, cord_num, rescale_factor_ee, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> coord, coord_ee, single_ee_distance, een_rescaled_single_e, een_rescaled_single_e_gl) </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> result(info) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> cord_num</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> rescale_factor_ee</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coord(3,walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coord_ee(elec_num,walk_num,3)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> single_ee_distance(elec_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_e(elec_num,0:cord_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> een_rescaled_single_e_gl(4,elec_num,0:cord_num,walk_num)</span>
|
|
|
|
<span style="color: #228b22;">double precision</span>,<span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> elec_dist_gl(:,:)</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, rij_inv, kappa_l</span>
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, j, k, l, nw, ii, num</span>
|
|
|
|
num = num_in + 1
|
|
|
|
<span style="color: #a020f0;">allocate</span>(elec_dist_gl(4, elec_num))
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 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 <= 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 < 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_5
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
! <span style="color: #b22222;">Not necessary: should be set to zero by qmckl_malloc</span>
|
|
! <span style="color: #b22222;">een_rescaled_single_e_gl = 0.0d0</span>
|
|
|
|
! <span style="color: #b22222;">Prepare table of exponentiated distances raised to appropriate power</span>
|
|
|
|
<span style="color: #a020f0;">do</span> nw = 1, walk_num
|
|
<span style="color: #a020f0;">do</span> i = 1, elec_num
|
|
<span style="color: #a020f0;">if</span> (i == num) <span style="color: #a020f0;">cycle</span>
|
|
rij_inv = 1.0d0 / single_ee_distance(i, nw)
|
|
<span style="color: #a020f0;">do</span> ii = 1, 3
|
|
elec_dist_gl(ii, i) = (coord(ii, nw) - coord_ee(i, nw, ii)) * rij_inv
|
|
<span style="color: #a020f0;">end do</span>
|
|
elec_dist_gl(4, i) = 2.0d0 * rij_inv
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
elec_dist_gl(:, num) = 0.0d0
|
|
|
|
<span style="color: #a020f0;">do</span> l = 1, cord_num
|
|
kappa_l = - <span style="color: #a020f0;">dble</span>(l) * rescale_factor_ee
|
|
<span style="color: #a020f0;">do</span> i = 1, elec_num
|
|
een_rescaled_single_e_gl(1, i, l, nw) = kappa_l * elec_dist_gl(1, i)
|
|
een_rescaled_single_e_gl(2, i, l, nw) = kappa_l * elec_dist_gl(2, i)
|
|
een_rescaled_single_e_gl(3, i, l, nw) = kappa_l * elec_dist_gl(3, i)
|
|
een_rescaled_single_e_gl(4, i, l, nw) = kappa_l * (elec_dist_gl(4, i) + kappa_l)
|
|
|
|
een_rescaled_single_e_gl(1,i,l,nw) = een_rescaled_single_e_gl(1,i,l,nw) * een_rescaled_single_e(i,l,nw)
|
|
een_rescaled_single_e_gl(2,i,l,nw) = een_rescaled_single_e_gl(2,i,l,nw) * een_rescaled_single_e(i,l,nw)
|
|
een_rescaled_single_e_gl(3,i,l,nw) = een_rescaled_single_e_gl(3,i,l,nw) * een_rescaled_single_e(i,l,nw)
|
|
een_rescaled_single_e_gl(4,i,l,nw) = een_rescaled_single_e_gl(4,i,l,nw) * een_rescaled_single_e(i,l,nw)
|
|
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_een_rescaled_single_e_gl_doc</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org7b28016" class="outline-3">
|
|
<h3 id="org7b28016"><span class="section-number-3">5.7.</span> \(\delta P\) matrix gradients and Laplacian</h3>
|
|
<div class="outline-text-3" id="text-5-7">
|
|
<p>
|
|
Calculate \(\partial_{i,m} \delta P\).
|
|
</p>
|
|
\begin{eqnarray*}
|
|
\partial_{i,m} \delta P_{i,\alpha,k,l} = \partial_{i,m}\delta \widetilde{r}_{\text{num},i,k} \left(\partial_{i,m}\delta \widetilde{R}_{\text{num},\alpha,l} + \partial_{i,m}\widetilde{R}_{\text{num},\alpha,l} \right) g_m
|
|
+ \partial_{i,m}\widetilde{r}_{\text{num},i,k} \delta \widetilde{R}_{\text{num},\alpha,l}
|
|
+ \delta_{i,\text{num}} \sum_{j=1}^{N_\text{elec}} \left( \partial_{j,m} \delta \widetilde{r}_{\text{num},j,k} \widetilde{R}_{j,\alpha,l} \right),
|
|
\end{eqnarray*}
|
|
<p>
|
|
where \(g_m = \{-1,-1,-1,1\}\).
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-orgf304e93" class="outline-4">
|
|
<h4 id="orgf304e93"><span class="section-number-4">5.7.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-5-7-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_jastrow_champ_delta_p_gl</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">delta_p_gl</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org2ab66c1" class="outline-4">
|
|
<h4 id="org2ab66c1"><span class="section-number-4">5.7.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-5-7-2">
|
|
<table id="org9216706" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Index of single electron</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>cord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">order of polynomials</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_e</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus single rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_e</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron single rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distances derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_e_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron rescaled distances derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_n_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus single rescaled distances derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_e_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num][4]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron single rescaled distances derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>delta_p_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][4][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Delta P matrix gradient and Laplacian</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_jastrow_champ_delta_p_gl_doc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> context, num_in, walk_num, elec_num, nucl_num, cord_num, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> een_rescaled_n, een_rescaled_e, een_rescaled_single_n, een_rescaled_single_e, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> een_rescaled_n_gl, een_rescaled_e_gl, een_rescaled_single_n_gl, een_rescaled_single_e_gl, delta_p_gl) </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> result(info) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in, walk_num, elec_num, cord_num, nucl_num</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n(elec_num, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_e(elec_num, elec_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n(nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_e(elec_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n_gl(elec_num, 4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_e_gl(elec_num, 4, elec_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n_gl(4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_e_gl(4,elec_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_p_gl(elec_num,nucl_num,4,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> delta_e_gl(elec_num,4)</span>
|
|
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> een_rescaled_delta_n, een_re_n, een_re_single_n</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, p, m, n, nw, num</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> tmp, cummu</span>
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> LDA, LDB, LDC</span>
|
|
|
|
num = num_in + 1
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) info = QMCKL_INVALID_ARG_3
|
|
<span style="color: #a020f0;">if</span> (elec_num <= 0) info = QMCKL_INVALID_ARG_4
|
|
<span style="color: #a020f0;">if</span> (nucl_num <= 0) info = QMCKL_INVALID_ARG_5
|
|
<span style="color: #a020f0;">if</span> (cord_num < 0) info = QMCKL_INVALID_ARG_6
|
|
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
|
|
|
|
|
|
<span style="color: #a020f0;">if</span> (cord_num == 0) <span style="color: #a020f0;">then</span>
|
|
delta_p_gl = 0.d0
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">do</span> nw=1, walk_num
|
|
<span style="color: #a020f0;">do</span> m=1, cord_num-1
|
|
<span style="color: #a020f0;">do</span> k = 1, 4
|
|
<span style="color: #a020f0;">do</span> j = 1, elec_num
|
|
delta_e_gl(j,k) = een_rescaled_single_e_gl(k,j,m,nw) - een_rescaled_e_gl(num, k, j, m, nw)
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">do</span> k = 1, 4
|
|
delta_e_gl(num, k) = 0.0d0
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">do</span> l=0, cord_num
|
|
<span style="color: #a020f0;">do</span> k = 1, 3
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
|
|
een_re_n = een_rescaled_n(num, a, l, nw)
|
|
een_re_single_n = een_rescaled_single_n(a,l,nw)
|
|
|
|
cummu = 0.0d0
|
|
<span style="color: #a020f0;">do</span> i = 1, elec_num
|
|
|
|
delta_p_gl(i,a,k,l,m,nw) = -een_rescaled_e_gl(i,k,num,m,nw) * een_re_n <span style="color: #a020f0;">&</span>
|
|
- een_rescaled_single_e_gl(k,i,m,nw) * een_re_single_n
|
|
|
|
cummu = cummu + delta_e_gl(i,k) * een_rescaled_n(i,a,l,nw)
|
|
<span style="color: #a020f0;">end do</span>
|
|
delta_p_gl(num,a,k,l,m,nw) = delta_p_gl(num,a,k,l,m,nw) + cummu
|
|
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
een_rescaled_delta_n = een_rescaled_single_n(a,l,nw) - een_rescaled_n(num, a, l, nw)
|
|
cummu = 0.0d0
|
|
een_re_single_n = een_rescaled_single_n(a,l,nw)
|
|
|
|
<span style="color: #a020f0;">do</span> i = 1, elec_num
|
|
delta_p_gl(i,a,4,l,m,nw) = een_rescaled_e_gl(i,4,num,m,nw) * een_rescaled_delta_n <span style="color: #a020f0;">&</span>
|
|
+delta_e_gl(i,4) * een_re_single_n
|
|
|
|
cummu = cummu + delta_e_gl(i,4) * een_rescaled_n(i,a,l,nw)
|
|
<span style="color: #a020f0;">end do</span>
|
|
delta_p_gl(num,a,4,l,m,nw) = delta_p_gl(num,a,4,l,m,nw) + cummu
|
|
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_delta_p_gl_doc</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgbf5025c" class="outline-3">
|
|
<h3 id="orgbf5025c"><span class="section-number-3">5.8.</span> Electron-electron-nucleus Jastrow gradients and Laplacian</h3>
|
|
<div class="outline-text-3" id="text-5-8">
|
|
<p>
|
|
Calculates the gradients and Laplacian of \(\delta J_{een}\).
|
|
</p>
|
|
\begin{eqnarray*}
|
|
\partial_{i,m} J_{een} &=& \sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}}\sum_{\alpha=1}^{N_\text{nucl}} c_{l,k,p,\alpha}
|
|
\left( \widetilde{R}_{i,\alpha,(p-k-l)/2} \partial_{i,m} \delta P_{i,\alpha,k,(p-k+l)/2}
|
|
+ \widetilde{R}_{i,\alpha,(p-k+l)/2} \partial_{i,m} \delta P_{i,\alpha,k,(p-k-l)/2} \right. \\
|
|
& &\ + \partial_{i,m}\widetilde{R}_{i,\alpha,(p-k-l)/2} \delta P_{i,\alpha,k,(p-k+l)/2}
|
|
+ \partial_{i,m}\widetilde{R}_{i,\alpha,(p-k+l)/2} \delta P_{i,\alpha,k,(p-k-l)/2} \\
|
|
& &\ + \delta_{i,\text{num}} \left( \delta \widetilde{R}_{i,\alpha,(p-k-l)/2} \left ( \partial_{i,m} P_{i,\alpha,k,(p-k+l)/2} + \partial_{i,m} \delta P_{i,\alpha,k,(p-k+l)/2} \right)
|
|
+ \delta \widetilde{R}_{i,\alpha,(p-k+l)/2} \left ( \partial_{i,m} P_{i,\alpha,k,(p-k-l)/2} + \partial_{i,m} \delta P_{i,\alpha,k,(p-k-l)/2} \right) \right. \\
|
|
& &\ \left. + \partial_{i,m} \delta \widetilde{R}_{i,\alpha,(p-k-l)/2} \left ( P_{i,\alpha,k,(p-k+l)/2} + \delta P_{i,\alpha,k,(p-k+l)/2} \right)
|
|
+ \partial_{i,m} \delta \widetilde{R}_{i,\alpha,(p-k+l)/2} \left ( P_{i,\alpha,k,(p-k-l)/2} + \delta P_{i,\alpha,k,(p-k-l)/2} \right) \right)\\
|
|
& &\ + \delta_{m,4} \sum_{d=1}^3 \left( \partial_{i,d} \widetilde{R}_{i,\alpha,(p-k-l)/2} \partial_{i,d} \delta P_{i,\alpha,k,(p-k+l)/2}
|
|
+ \partial_{i,d} \widetilde{R}_{i,\alpha,(p-k+l)/2} \partial_{i,d} \delta P_{i,\alpha,k,(p-k-l)/2} \right)\\
|
|
& &\ \left. + \delta_{m,4}\delta_{i,\text{num}} \sum_{d=1}^3\left( \partial_{i,d}\delta \widetilde{R}_{i,\alpha,(p-k-l)/2} \left( \partial_{i,d} P_{i,\alpha,k,(p-k+l)/2} + \partial_{i,d}\delta P_{i,\alpha,k,(p-k+l)/2} \right)
|
|
+ \partial_{i,d}\delta \widetilde{R}_{i,\alpha,(p-k+l)/2} \left( \partial_{i,d} P_{i,\alpha,k,(p-k-l)/2} + \partial_{i,d} \delta P_{i,\alpha,k,(p-k-l)/2} \right) \right) \right)
|
|
\end{eqnarray*}
|
|
</div>
|
|
|
|
|
|
<div id="outline-container-org79819a2" class="outline-4">
|
|
<h4 id="org79819a2"><span class="section-number-4">5.8.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-5-8-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_jastrow_champ_single_een_gl</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">delta_een_gl</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_get_jastrow_champ_single_een_gl</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> delta_een_gl, size_max) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">import</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span> (qmckl_context) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>), <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_een_gl(size_max)</span>
|
|
<span style="color: #a020f0;">end function</span>
|
|
<span style="color: #a020f0;">end interface</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgefe2876" class="outline-4">
|
|
<h4 id="orgefe2876"><span class="section-number-4">5.8.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-5-8-2">
|
|
<table id="org341e34a" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Index of single electron</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>cord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">order of polynomials</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>dim_c_vector</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">dimension of full coefficient vector</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>c_vector_full</code></td>
|
|
<td class="org-left"><code>double[dim_c_vector][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">full coefficient vector</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>lkpm_combined_index</code></td>
|
|
<td class="org-left"><code>int64_t[4][dim_c_vector]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">combined indices</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>tmp_c</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">P matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>dtmp_c</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">P matrix derivative</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>delta_p</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Delta P matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>delta_p_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][4][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Delta P matrix derivative</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus single rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distances derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_n_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus single rescaled distances derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>delta_een_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][4][elec_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Delta electron-electron-nucleus jastrow gradient and Laplacian</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_jastrow_champ_factor_single_een_gl_doc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> context, num_in, walk_num, elec_num, nucl_num, cord_num, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> dim_c_vector, c_vector_full, lkpm_combined_index, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> tmp_c, dtmp_c, delta_p, delta_p_gl, een_rescaled_n, een_rescaled_single_n, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> een_rescaled_n_gl, een_rescaled_single_n_gl, delta_een_gl) </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> result(info) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in, walk_num, elec_num, cord_num, nucl_num, dim_c_vector</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> lkpm_combined_index(dim_c_vector,4)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> c_vector_full(nucl_num, dim_c_vector)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> tmp_c(elec_num, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> dtmp_c(elec_num, 4, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> delta_p(elec_num, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> delta_p_gl(elec_num, nucl_num, 4, 0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n(elec_num, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n(nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n_gl(elec_num, 4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n_gl(4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_een_gl(elec_num, 4, walk_num)</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, p, m, n, nw, kk, num</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> accu, accu2, cn</span>
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> LDA, LDB, LDC</span>
|
|
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> een_rescaled_delta_n(nucl_num, 0:cord_num)</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> een_rescaled_delta_n_gl(4, nucl_num, 0:cord_num)</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> dpg1_m, dpg1_ml, dp_m, dp_ml, een_r_m, een_r_ml, een_r_gl_m, een_r_gl_ml</span>
|
|
num = num_in + 1
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) info = QMCKL_INVALID_ARG_3
|
|
<span style="color: #a020f0;">if</span> (elec_num <= 0) info = QMCKL_INVALID_ARG_4
|
|
<span style="color: #a020f0;">if</span> (nucl_num <= 0) info = QMCKL_INVALID_ARG_5
|
|
<span style="color: #a020f0;">if</span> (cord_num < 0) info = QMCKL_INVALID_ARG_6
|
|
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
|
|
|
|
delta_een_gl = 0.0d0
|
|
|
|
<span style="color: #a020f0;">if</span> (cord_num == 0) <span style="color: #a020f0;">return</span>
|
|
|
|
|
|
<span style="color: #a020f0;">do</span> nw =1, walk_num
|
|
|
|
een_rescaled_delta_n(:,:) = een_rescaled_single_n(:,:,nw) - een_rescaled_n(num, :, :, nw)
|
|
een_rescaled_delta_n_gl(:,:,:) = een_rescaled_single_n_gl(:,:,:,nw) - een_rescaled_n_gl(num, :,:,:,nw)
|
|
|
|
<span style="color: #a020f0;">do</span> n = 1, dim_c_vector
|
|
l = lkpm_combined_index(n, 1)
|
|
k = lkpm_combined_index(n, 2)
|
|
p = lkpm_combined_index(n, 3)
|
|
m = lkpm_combined_index(n, 4)
|
|
|
|
<span style="color: #a020f0;">do</span> kk = 1, 4
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
cn = c_vector_full(a, n)
|
|
<span style="color: #a020f0;">if</span>(cn == 0.d0) <span style="color: #a020f0;">cycle</span>
|
|
<span style="color: #a020f0;">do</span> i = 1, elec_num
|
|
delta_een_gl(i,kk,nw) = delta_een_gl(i,kk,nw) + ( <span style="color: #a020f0;">&</span>
|
|
delta_p_gl(i,a,kk,m ,k,nw) * een_rescaled_n(i,a,m+l,nw) + <span style="color: #a020f0;">&</span>
|
|
delta_p_gl(i,a,kk,m+l,k,nw) * een_rescaled_n(i,a,m ,nw) + <span style="color: #a020f0;">&</span>
|
|
delta_p(i,a,m ,k,nw) * een_rescaled_n_gl(i,kk,a,m+l,nw) + <span style="color: #a020f0;">&</span>
|
|
delta_p(i,a,m+l,k,nw) * een_rescaled_n_gl(i,kk,a,m ,nw) ) * cn
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
delta_een_gl(num,kk,nw) = delta_een_gl(num,kk,nw) + ( <span style="color: #a020f0;">&</span>
|
|
(dtmp_c(num,kk,a,m ,k,nw) + delta_p_gl(num,a,kk,m ,k,nw)) * een_rescaled_delta_n(a,m+l) + <span style="color: #a020f0;">&</span>
|
|
(dtmp_c(num,kk,a,m+l,k,nw) + delta_p_gl(num,a,kk,m+l,k,nw)) * een_rescaled_delta_n(a,m ) + <span style="color: #a020f0;">&</span>
|
|
(tmp_c(num,a,m ,k,nw) + delta_p(num,a,m ,k,nw)) * een_rescaled_delta_n_gl(kk,a,m+l) + <span style="color: #a020f0;">&</span>
|
|
(tmp_c(num,a,m+l,k,nw) + delta_p(num,a,m+l,k,nw)) * een_rescaled_delta_n_gl(kk,a,m ) )* cn
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
cn = c_vector_full(a, n)
|
|
<span style="color: #a020f0;">if</span>(cn == 0.d0) <span style="color: #a020f0;">cycle</span>
|
|
cn = cn + cn
|
|
<span style="color: #a020f0;">do</span> i = 1, elec_num
|
|
delta_een_gl(i,4,nw) = delta_een_gl(i,4,nw) + ( <span style="color: #a020f0;">&</span>
|
|
delta_p_gl(i,a,1,m ,k,nw) * een_rescaled_n_gl(i,1,a,m+l,nw) + <span style="color: #a020f0;">&</span>
|
|
delta_p_gl(i,a,1,m+l,k,nw) * een_rescaled_n_gl(i,1,a,m ,nw) + <span style="color: #a020f0;">&</span>
|
|
delta_p_gl(i,a,2,m ,k,nw) * een_rescaled_n_gl(i,2,a,m+l,nw) + <span style="color: #a020f0;">&</span>
|
|
delta_p_gl(i,a,2,m+l,k,nw) * een_rescaled_n_gl(i,2,a,m ,nw) + <span style="color: #a020f0;">&</span>
|
|
delta_p_gl(i,a,3,m ,k,nw) * een_rescaled_n_gl(i,3,a,m+l,nw) + <span style="color: #a020f0;">&</span>
|
|
delta_p_gl(i,a,3,m+l,k,nw) * een_rescaled_n_gl(i,3,a,m ,nw) ) * cn
|
|
<span style="color: #a020f0;">end do</span>
|
|
delta_een_gl(num,4,nw) = delta_een_gl(num,4,nw) + ( <span style="color: #a020f0;">&</span>
|
|
(delta_p_gl(num,a,1,m ,k,nw) + dtmp_c(num,1,a,m ,k,nw)) * een_rescaled_delta_n_gl(1,a,m+l) + <span style="color: #a020f0;">&</span>
|
|
(delta_p_gl(num,a,1,m+l,k,nw) + dtmp_c(num,1,a,m+l,k,nw)) * een_rescaled_delta_n_gl(1,a,m ) + <span style="color: #a020f0;">&</span>
|
|
(delta_p_gl(num,a,2,m ,k,nw) + dtmp_c(num,2,a,m ,k,nw)) * een_rescaled_delta_n_gl(2,a,m+l) + <span style="color: #a020f0;">&</span>
|
|
(delta_p_gl(num,a,2,m+l,k,nw) + dtmp_c(num,2,a,m+l,k,nw)) * een_rescaled_delta_n_gl(2,a,m ) + <span style="color: #a020f0;">&</span>
|
|
(delta_p_gl(num,a,3,m ,k,nw) + dtmp_c(num,3,a,m ,k,nw)) * een_rescaled_delta_n_gl(3,a,m+l) + <span style="color: #a020f0;">&</span>
|
|
(delta_p_gl(num,a,3,m+l,k,nw) + dtmp_c(num,3,a,m+l,k,nw)) * een_rescaled_delta_n_gl(3,a,m ) ) * cn
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_factor_single_een_gl_doc</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_compute_jastrow_champ_factor_single_een_gl_hpc</span> (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">elec_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nucl_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">cord_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">dim_c_vector</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">c_vector_full</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">lkpm_combined_index</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">tmp_c</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dtmp_c</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">delta_p</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">delta_p_gl</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_rescaled_n</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_rescaled_single_n</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_rescaled_n_gl</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_rescaled_single_n_gl</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">delta_een_gl</span> )
|
|
{
|
|
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">return</span> QMCKL_INVALID_CONTEXT;
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_3;
|
|
<span style="color: #a020f0;">if</span> (elec_num <= 0) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_4;
|
|
<span style="color: #a020f0;">if</span> (nucl_num <= 0) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_5;
|
|
<span style="color: #a020f0;">if</span> (cord_num < 0) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_6;
|
|
|
|
<span style="color: #a020f0;">if</span> (cord_num == 0) {
|
|
<span style="color: #483d8b;"> #pragma</span> omp parallel <span style="color: #a020f0;">for</span>
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">size_t</span> <span style="color: #a0522d;">i</span>=0 ; i<walk_num*4*elec_num ; ++i) {
|
|
delta_een_gl[i] = 0.;
|
|
}
|
|
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
|
|
}
|
|
|
|
<span style="color: #483d8b;">#ifdef</span> HAVE_OPENMP
|
|
<span style="color: #483d8b;">#pragma</span> omp parallel <span style="color: #a020f0;">for</span>
|
|
<span style="color: #483d8b;">#endif</span>
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nw</span>=0 ; nw<walk_num ; nw++) {
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">i</span>=0 ; i<4*elec_num ; ++i) {
|
|
delta_een_gl[i+nw*4*elec_num] = 0.;
|
|
}
|
|
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">een_rescaled_delta_n</span>[nucl_num*(cord_num+1)];
|
|
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">een_rescaled_delta_n_gl</span>[4*nucl_num*(cord_num+1)];
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">k</span>=0 ; k<nucl_num*(cord_num+1) ; ++k) {
|
|
een_rescaled_delta_n[k] = een_rescaled_single_n[k+nucl_num*(cord_num+1)*nw] - een_rescaled_n[num+elec_num*(k+nucl_num*(cord_num+1)*nw)];
|
|
een_rescaled_delta_n_gl[0+4*k] = een_rescaled_single_n_gl[0+4*(k+nucl_num*(cord_num+1)*nw)] - een_rescaled_n_gl[num+elec_num*(0+4*(k+nucl_num*(cord_num+1)*nw))];
|
|
een_rescaled_delta_n_gl[1+4*k] = een_rescaled_single_n_gl[1+4*(k+nucl_num*(cord_num+1)*nw)] - een_rescaled_n_gl[num+elec_num*(1+4*(k+nucl_num*(cord_num+1)*nw))];
|
|
een_rescaled_delta_n_gl[2+4*k] = een_rescaled_single_n_gl[2+4*(k+nucl_num*(cord_num+1)*nw)] - een_rescaled_n_gl[num+elec_num*(2+4*(k+nucl_num*(cord_num+1)*nw))];
|
|
een_rescaled_delta_n_gl[3+4*k] = een_rescaled_single_n_gl[3+4*(k+nucl_num*(cord_num+1)*nw)] - een_rescaled_n_gl[num+elec_num*(3+4*(k+nucl_num*(cord_num+1)*nw))];
|
|
}
|
|
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">n</span>=0 ; n<dim_c_vector ; ++n) {
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">l</span> = lkpm_combined_index[n];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">k</span> = lkpm_combined_index[n+dim_c_vector];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">m</span> = lkpm_combined_index[n+3*dim_c_vector];
|
|
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">kk</span>=0 ; kk<4 ; ++kk) {
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dgl</span> = &delta_een_gl[elec_num*(kk+4*nw)];
|
|
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">a</span>=0 ; a<nucl_num ; ++a) {
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span> <span style="color: #a0522d;">cn</span> = c_vector_full[a+n*nucl_num];
|
|
<span style="color: #a020f0;">if</span> (cn == 0.) <span style="color: #a020f0;">continue</span>;
|
|
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dpg1_m</span> = &delta_p_gl[elec_num*(a+nucl_num*(kk+4*(m+(cord_num+1)*(k+cord_num*nw))))];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dpg1_ml</span> = &delta_p_gl[elec_num*(a+nucl_num*(kk+4*(m+l+(cord_num+1)*(k+cord_num*nw))))];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dp_m</span> = &delta_p[elec_num*(a+nucl_num*(m+(cord_num+1)*(k+cord_num*nw)))];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dp_ml</span> = &delta_p[elec_num*(a+nucl_num*(m+l+(cord_num+1)*(k+cord_num*nw)))];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_r_m</span> = &een_rescaled_n[elec_num*(a+nucl_num*(m+(cord_num+1)*nw))];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_r_ml</span> = &een_rescaled_n[elec_num*(a+nucl_num*(m+l+(cord_num+1)*nw))];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_r_gl_m</span> = &een_rescaled_n_gl[elec_num*(kk+4*(a+nucl_num*(m+(cord_num+1)*nw)))];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_r_gl_ml</span> = &een_rescaled_n_gl[elec_num*(kk+4*(a+nucl_num*(m+l+(cord_num+1)*nw)))];
|
|
|
|
<span style="color: #483d8b;">#ifdef</span> HAVE_OPENMP
|
|
<span style="color: #483d8b;"> #pragma</span> omp simd
|
|
<span style="color: #483d8b;">#endif</span>
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">i</span>=0 ; i<elec_num ; ++i) {
|
|
dgl[i] += cn * (dpg1_m[i] * een_r_ml[i] + dpg1_ml[i] * een_r_m[i] +
|
|
dp_m[i] * een_r_gl_ml[i] + dp_ml[i] * een_r_gl_m[i]);
|
|
}
|
|
dgl[num] += ( (dtmp_c[num+elec_num*(kk+4*(a+nucl_num*(m+(cord_num+1)*(k+cord_num*nw))))] +
|
|
dpg1_m[num]
|
|
) * een_rescaled_delta_n[a+nucl_num*(m+l)] +
|
|
(dtmp_c[num+elec_num*(kk+4*(a+nucl_num*(m+l+(cord_num+1)*(k+cord_num*nw))))] +
|
|
dpg1_ml[num]
|
|
) * een_rescaled_delta_n[a+nucl_num*m] +
|
|
(tmp_c[num+elec_num*(a+nucl_num*(m+(cord_num+1)*(k+cord_num*nw)))] +
|
|
dp_m[num]
|
|
) * een_rescaled_delta_n_gl[kk+4*(a+nucl_num*(m+l))] +
|
|
(tmp_c[num+elec_num*(a+nucl_num*(m+l+(cord_num+1)*(k+cord_num*nw)))] +
|
|
dp_ml[num]
|
|
) * een_rescaled_delta_n_gl[kk+4*(a+nucl_num*m)]
|
|
) * cn;
|
|
}
|
|
}
|
|
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">a</span>=0 ; a<nucl_num ; ++a) {
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span> <span style="color: #a0522d;">cn</span> = 2. * c_vector_full[a+n*nucl_num];
|
|
<span style="color: #a020f0;">if</span> (cn == 0.) <span style="color: #a020f0;">continue</span>;
|
|
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dgl4</span> = &delta_een_gl[elec_num*(3+4*nw)];
|
|
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dpg1_m</span> = &delta_p_gl[elec_num*(a+nucl_num*(0+4*(m+(cord_num+1)*(k+cord_num*nw))))];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dpg2_m</span> = &delta_p_gl[elec_num*(a+nucl_num*(1+4*(m+(cord_num+1)*(k+cord_num*nw))))];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dpg3_m</span> = &delta_p_gl[elec_num*(a+nucl_num*(2+4*(m+(cord_num+1)*(k+cord_num*nw))))];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dpg1_ml</span> = &delta_p_gl[elec_num*(a+nucl_num*(0+4*(m+l+(cord_num+1)*(k+cord_num*nw))))];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dpg2_ml</span> = &delta_p_gl[elec_num*(a+nucl_num*(1+4*(m+l+(cord_num+1)*(k+cord_num*nw))))];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">dpg3_ml</span> = &delta_p_gl[elec_num*(a+nucl_num*(2+4*(m+l+(cord_num+1)*(k+cord_num*nw))))];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_r_gl1_m</span> = &een_rescaled_n_gl[elec_num*(0+4*(a+nucl_num*(m+(cord_num+1)*nw)))];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_r_gl2_m</span> = &een_rescaled_n_gl[elec_num*(1+4*(a+nucl_num*(m+(cord_num+1)*nw)))];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_r_gl3_m</span> = &een_rescaled_n_gl[elec_num*(2+4*(a+nucl_num*(m+(cord_num+1)*nw)))];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_r_gl1_ml</span> = &een_rescaled_n_gl[elec_num*(0+4*(a+nucl_num*(m+l+(cord_num+1)*nw)))];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_r_gl2_ml</span> = &een_rescaled_n_gl[elec_num*(1+4*(a+nucl_num*(m+l+(cord_num+1)*nw)))];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">een_r_gl3_ml</span> = &een_rescaled_n_gl[elec_num*(2+4*(a+nucl_num*(m+l+(cord_num+1)*nw)))];
|
|
|
|
<span style="color: #483d8b;">#ifdef</span> HAVE_OPENMP
|
|
<span style="color: #483d8b;"> #pragma</span> omp simd
|
|
<span style="color: #483d8b;">#endif</span>
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">i</span>=0 ; i<elec_num ; ++i) {
|
|
dgl4[i] += (dpg1_m[i] * een_r_gl1_ml[i] + dpg1_ml[i] * een_r_gl1_m[i] +
|
|
dpg2_m[i] * een_r_gl2_ml[i] + dpg2_ml[i] * een_r_gl2_m[i] +
|
|
dpg3_m[i] * een_r_gl3_ml[i] + dpg3_ml[i] * een_r_gl3_m[i] ) * cn;
|
|
}
|
|
dgl4[num] += ((dpg1_m[num] +
|
|
dtmp_c[num+elec_num*(0+4*(a+nucl_num*(m+(cord_num+1)*(k+cord_num*nw))))]
|
|
) * een_rescaled_delta_n_gl[0+4*(a+nucl_num*(m+l))] +
|
|
(dpg1_ml[num] +
|
|
dtmp_c[num+elec_num*(0+4*(a+nucl_num*(m+l+(cord_num+1)*(k+cord_num*nw))))]
|
|
) * een_rescaled_delta_n_gl[0+4*(a+nucl_num*m)] +
|
|
(dpg2_m[num] +
|
|
dtmp_c[num+elec_num*(1+4*(a+nucl_num*(m+(cord_num+1)*(k+cord_num*nw))))]
|
|
) * een_rescaled_delta_n_gl[1+4*(a+nucl_num*(m+l))] +
|
|
(dpg2_ml[num] +
|
|
dtmp_c[num+elec_num*(1+4*(a+nucl_num*(m+l+(cord_num+1)*(k+cord_num*nw))))]
|
|
) * een_rescaled_delta_n_gl[1+4*(a+nucl_num*m)] +
|
|
(dpg3_m[num] +
|
|
dtmp_c[num+elec_num*(2+4*(a+nucl_num*(m+(cord_num+1)*(k+cord_num*nw))))]
|
|
) * een_rescaled_delta_n_gl[2+4*(a+nucl_num*(m+l))] +
|
|
(dpg3_ml[num] +
|
|
dtmp_c[num+elec_num*(2+4*(a+nucl_num*(m+l+(cord_num+1)*(k+cord_num*nw))))]
|
|
) * een_rescaled_delta_n_gl[2+4*(a+nucl_num*m)] ) * cn;
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
|
|
}
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgd89842a" class="outline-3">
|
|
<h3 id="orgd89842a"><span class="section-number-3">5.9.</span> \(\delta P\) matrix gradient only</h3>
|
|
<div class="outline-text-3" id="text-5-9">
|
|
<p>
|
|
To allow for more efficient treatment of nonlocal pseudopotentials, we also include a routine for only calculating the gradient (and not the Laplacian) of \(\delta J_{een}\).
|
|
For this, we calculate the gradient of \(\delta P\).
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org7cd2604" class="outline-4">
|
|
<h4 id="org7cd2604"><span class="section-number-4">5.9.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-5-9-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_jastrow_champ_delta_p_g</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">delta_p_g</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgccaa59e" class="outline-4">
|
|
<h4 id="orgccaa59e"><span class="section-number-4">5.9.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-5-9-2">
|
|
<table id="orge40a62d" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Index of single electron</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>cord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">order of polynomials</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_e</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus single rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_e</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron single rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distances derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_e_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron rescaled distances derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_n_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus single rescaled distances derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_e_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num][4]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron single rescaled distances derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>delta_p_g</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][4][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Delta P matrix gradient</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_jastrow_champ_delta_p_g_doc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> context, num_in, walk_num, elec_num, nucl_num, cord_num, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> een_rescaled_n, een_rescaled_e, een_rescaled_single_n, een_rescaled_single_e, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> een_rescaled_n_gl, een_rescaled_e_gl, een_rescaled_single_n_gl, een_rescaled_single_e_gl, delta_p_g) </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> result(info) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in, walk_num, elec_num, cord_num, nucl_num</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n(elec_num, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_e(elec_num, elec_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n(nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_e(elec_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n_gl(elec_num, 4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_e_gl(elec_num, 4, elec_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n_gl(4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_e_gl(4,elec_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_p_g(elec_num,nucl_num,4,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> delta_e_gl(elec_num,4)</span>
|
|
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> een_rescaled_delta_n, een_re_n, een_re_single_n</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, p, m, n, nw, num</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> tmp, cummu</span>
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> LDA, LDB, LDC</span>
|
|
|
|
num = num_in + 1
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">if</span> (num <= 0) info = QMCKL_INVALID_ARG_2
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) info = QMCKL_INVALID_ARG_3
|
|
<span style="color: #a020f0;">if</span> (elec_num <= 0) info = QMCKL_INVALID_ARG_4
|
|
<span style="color: #a020f0;">if</span> (nucl_num <= 0) info = QMCKL_INVALID_ARG_5
|
|
<span style="color: #a020f0;">if</span> (cord_num < 0) info = QMCKL_INVALID_ARG_6
|
|
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
|
|
|
|
|
|
<span style="color: #a020f0;">if</span> (cord_num == 0) <span style="color: #a020f0;">then</span>
|
|
delta_p_g = 0.d0
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">do</span> nw=1, walk_num
|
|
<span style="color: #a020f0;">do</span> m=1, cord_num-1
|
|
<span style="color: #a020f0;">do</span> j = 1, elec_num
|
|
<span style="color: #a020f0;">do</span> k = 1, 4
|
|
delta_e_gl(j,k) = een_rescaled_single_e_gl(k,j,m,nw) - een_rescaled_e_gl(num, k, j, m, nw)
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">do</span> k = 1, 4
|
|
delta_e_gl(num, k) = 0.0d0
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">do</span> l=0, cord_num
|
|
<span style="color: #a020f0;">do</span> k = 1, 3
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
|
|
cummu = 0.0d0
|
|
<span style="color: #a020f0;">do</span> i = 1, elec_num
|
|
cummu = cummu + delta_e_gl(i,k) * een_rescaled_n(i,a,l,nw)
|
|
<span style="color: #a020f0;">end do</span>
|
|
delta_p_g(num,a,k,l,m,nw) = cummu
|
|
|
|
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_delta_p_g_doc</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_jastrow_champ_delta_p_g_hpc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> context, num_in, walk_num, elec_num, nucl_num, cord_num, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> een_rescaled_n, een_rescaled_e, een_rescaled_single_n, een_rescaled_single_e, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> een_rescaled_n_gl, een_rescaled_e_gl, een_rescaled_single_n_gl, een_rescaled_single_e_gl, delta_p_g) </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> result(info) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in, walk_num, elec_num, cord_num, nucl_num</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n(elec_num, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_e(elec_num, elec_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n(nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_e(elec_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n_gl(elec_num, 4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_e_gl(elec_num, 4, elec_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n_gl(4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_e_gl(4,elec_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_p_g(elec_num,nucl_num,4,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> delta_e_gl(3,elec_num)</span>
|
|
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> een_rescaled_delta_n, een_re_n, een_re_single_n</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, p, m, n, nw, num</span>
|
|
<span style="color: #228b22;">double precision</span>, <span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> tmp(:,:,:)</span>
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> LDA, LDB, LDC</span>
|
|
|
|
num = num_in + 1
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">if</span> (num <= 0) info = QMCKL_INVALID_ARG_2
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) info = QMCKL_INVALID_ARG_3
|
|
<span style="color: #a020f0;">if</span> (elec_num <= 0) info = QMCKL_INVALID_ARG_4
|
|
<span style="color: #a020f0;">if</span> (nucl_num <= 0) info = QMCKL_INVALID_ARG_5
|
|
<span style="color: #a020f0;">if</span> (cord_num < 0) info = QMCKL_INVALID_ARG_6
|
|
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
|
|
|
|
|
|
<span style="color: #a020f0;">if</span> (cord_num == 0) <span style="color: #a020f0;">then</span>
|
|
delta_p_g = 0.d0
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">allocate</span>( tmp(3,nucl_num,0:cord_num) )
|
|
<span style="color: #a020f0;">do</span> nw=1, walk_num
|
|
<span style="color: #a020f0;">do</span> m=1, cord_num-1
|
|
delta_e_gl(1:3,1:elec_num) = een_rescaled_single_e_gl(1:3,1:elec_num,m,nw) - <span style="color: #a020f0;">&</span>
|
|
een_rescaled_e_gl(num, 1:3, 1:elec_num, m, nw)
|
|
delta_e_gl(1:3,num) = 0.0d0
|
|
|
|
<span style="color: #a020f0;">call</span> <span style="color: #0000ff;">dgemm</span>(<span style="color: #8b2252;">'N'</span>,<span style="color: #8b2252;">'N'</span>, 3, nucl_num*(cord_num+1), elec_num, 1.d0, <span style="color: #a020f0;">&</span>
|
|
delta_e_gl(1,1), 3, een_rescaled_n(1,1,0,nw), elec_num, 0.d0, <span style="color: #a020f0;">&</span>
|
|
tmp, 3)
|
|
|
|
delta_p_g(num,1:nucl_num,1,0:cord_num,m,nw) = tmp(1,1:nucl_num,0:cord_num)
|
|
delta_p_g(num,1:nucl_num,2,0:cord_num,m,nw) = tmp(2,1:nucl_num,0:cord_num)
|
|
delta_p_g(num,1:nucl_num,3,0:cord_num,m,nw) = tmp(3,1:nucl_num,0:cord_num)
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">deallocate</span>(tmp)
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_delta_p_g_hpc</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_compute_jastrow_champ_delta_p_g_hpc2</span> (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">elec_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nucl_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">cord_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_n</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_e</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_single_n</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_single_e</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_n_gl</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_e_gl</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_single_n_gl</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_single_e_gl</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">delta_p_g</span> )
|
|
{
|
|
<span style="color: #a020f0;">if</span> (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">return</span> QMCKL_NULL_CONTEXT;
|
|
<span style="color: #a020f0;">if</span> (num < 0) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_2;
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_3;
|
|
<span style="color: #a020f0;">if</span> (elec_num <= 0) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_4;
|
|
<span style="color: #a020f0;">if</span> (nucl_num <= 0) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_5;
|
|
<span style="color: #a020f0;">if</span> (cord_num < 0) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_6;
|
|
<span style="color: #a020f0;">if</span> (een_rescaled_n == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_7;
|
|
<span style="color: #a020f0;">if</span> (een_rescaled_e == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_8;
|
|
<span style="color: #a020f0;">if</span> (een_rescaled_single_n == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_9;
|
|
<span style="color: #a020f0;">if</span> (een_rescaled_single_e == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_10;
|
|
<span style="color: #a020f0;">if</span> (een_rescaled_n_gl == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_11;
|
|
<span style="color: #a020f0;">if</span> (een_rescaled_e_gl == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_12;
|
|
<span style="color: #a020f0;">if</span> (een_rescaled_single_n_gl == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_13;
|
|
<span style="color: #a020f0;">if</span> (een_rescaled_single_e_gl == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_14;
|
|
<span style="color: #a020f0;">if</span> (delta_p_g == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_15;
|
|
|
|
<span style="color: #a020f0;">if</span> (cord_num == 0) {
|
|
<span style="color: #483d8b;"> #pragma</span> omp parallel <span style="color: #a020f0;">for</span>
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nw</span>=0 ; nw<walk_num ; ++nw) {
|
|
memset(&delta_p_g[elec_num*nucl_num*4*(cord_num+1)*cord_num*nw], 0,
|
|
elec_num*nucl_num*4*(cord_num+1)*cord_num*<span style="color: #a020f0;">sizeof</span>(<span style="color: #228b22;">double</span>));
|
|
}
|
|
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
|
|
}
|
|
|
|
<span style="color: #483d8b;"> #pragma</span> omp parallel <span style="color: #a020f0;">for</span>
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nw</span>=0 ; nw<walk_num ; ++nw) {
|
|
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">delta_e_gl</span>[elec_num*4];
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">m</span>=1 ; m<=cord_num-1 ; ++m) {
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_single_e_gl_</span> = &een_rescaled_single_e_gl[4*elec_num*(m+(cord_num+1)*nw)];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_e_gl_</span> = &een_rescaled_e_gl[num+elec_num*4*elec_num*(m+(cord_num+1)*nw)];
|
|
|
|
<span style="color: #483d8b;"> #pragma</span> omp simd
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">kj</span>=0 ; kj<4*elec_num ; ++kj) {
|
|
delta_e_gl[kj] = een_rescaled_single_e_gl_[kj] - een_rescaled_e_gl_[kj+elec_num];
|
|
}
|
|
<span style="color: #483d8b;"> #pragma</span> omp simd
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">k</span>=0 ; k<4; ++k) {
|
|
delta_e_gl[4*num+k] = 0.;
|
|
}
|
|
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">l</span>=0 ; l<=cord_num ; ++l) {
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">k</span>=0 ; k<3; ++k) {
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">a</span>=0 ; a<nucl_num; ++a) {
|
|
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">accu</span> = 0.0;
|
|
<span style="color: #483d8b;"> #pragma</span> omp simd
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">i</span>=0 ; i<elec_num ; ++i) {
|
|
accu += delta_e_gl[k+4*i] * een_rescaled_n[i+elec_num*(a+nucl_num*(l+(cord_num+1)*nw))];
|
|
}
|
|
delta_p_g[num+elec_num*(a+nucl_num*(k+4*(l+(cord_num+1)*(m+(cord_num-1+1)*nw))))] = accu;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
|
|
}
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div id="outline-container-org9d21d33" class="outline-3">
|
|
<h3 id="org9d21d33"><span class="section-number-3">5.10.</span> Electron-electron-nucleus Jastrow gradients</h3>
|
|
<div class="outline-text-3" id="text-5-10">
|
|
<p>
|
|
Computes the gradient of the \(\delta J_{een}\).
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org6bfa162" class="outline-4">
|
|
<h4 id="org6bfa162"><span class="section-number-4">5.10.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-5-10-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_jastrow_champ_single_een_g</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">delta_een_g</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_get_jastrow_champ_single_een_g</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> delta_een_g, size_max) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">import</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span> (qmckl_context) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>), <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_een_g(size_max)</span>
|
|
<span style="color: #a020f0;">end function</span>
|
|
<span style="color: #a020f0;">end interface</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org0b4d7cd" class="outline-4">
|
|
<h4 id="org0b4d7cd"><span class="section-number-4">5.10.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-5-10-2">
|
|
<table id="org2a9ab02" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Index of single electron</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>cord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">order of polynomials</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>dim_c_vector</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">dimension of full coefficient vector</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>c_vector_full</code></td>
|
|
<td class="org-left"><code>double[dim_c_vector][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">full coefficient vector</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>lkpm_combined_index</code></td>
|
|
<td class="org-left"><code>int64_t[4][dim_c_vector]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">combined indices</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>tmp_c</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">P matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>dtmp_c</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">P matrix derivative</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>delta_p</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Delta P matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>delta_p_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][4][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Delta P matrix derivative</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus single rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distances derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_n_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus single rescaled distances derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>delta_een_g</code></td>
|
|
<td class="org-left"><code>double[walk_num][4][elec_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Delta electron-electron-nucleus jastrow gradient</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_jastrow_champ_factor_single_een_g_doc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> context, num_in, walk_num, elec_num, nucl_num, cord_num, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> dim_c_vector, c_vector_full, lkpm_combined_index, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> tmp_c, dtmp_c, delta_p, delta_p_gl, een_rescaled_n, een_rescaled_single_n, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> een_rescaled_n_gl, een_rescaled_single_n_gl, delta_een_g) </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> result(info) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in, walk_num, elec_num, cord_num, nucl_num, dim_c_vector</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> lkpm_combined_index(dim_c_vector,4)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> c_vector_full(nucl_num, dim_c_vector)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> tmp_c(elec_num, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> dtmp_c(elec_num, 4, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> delta_p(elec_num, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> delta_p_gl(elec_num, nucl_num, 4, 0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n(elec_num, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n(nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n_gl(elec_num, 4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n_gl(4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_een_g(elec_num, 4, walk_num)</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, p, m, n, nw, kk, num</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> accu, accu2, cn</span>
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> LDA, LDB, LDC</span>
|
|
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> een_rescaled_delta_n_gl(4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> een_rescaled_delta_n(nucl_num, 0:cord_num, walk_num)</span>
|
|
|
|
num = num_in + 1
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) info = QMCKL_INVALID_ARG_3
|
|
<span style="color: #a020f0;">if</span> (elec_num <= 0) info = QMCKL_INVALID_ARG_4
|
|
<span style="color: #a020f0;">if</span> (nucl_num <= 0) info = QMCKL_INVALID_ARG_5
|
|
<span style="color: #a020f0;">if</span> (cord_num < 0) info = QMCKL_INVALID_ARG_6
|
|
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
|
|
|
|
delta_een_g = 0.0d0
|
|
|
|
<span style="color: #a020f0;">if</span> (cord_num == 0) <span style="color: #a020f0;">return</span>
|
|
|
|
een_rescaled_delta_n(:,:,:) = een_rescaled_single_n(:,:,:) - een_rescaled_n(num, :, :, :)
|
|
een_rescaled_delta_n_gl(:,:,:,:) = een_rescaled_single_n_gl(:,:,:,:) - een_rescaled_n_gl(num, :,:,:,:)
|
|
|
|
|
|
<span style="color: #a020f0;">do</span> nw =1, walk_num
|
|
<span style="color: #a020f0;">do</span> n = 1, dim_c_vector
|
|
l = lkpm_combined_index(n, 1)
|
|
k = lkpm_combined_index(n, 2)
|
|
p = lkpm_combined_index(n, 3)
|
|
m = lkpm_combined_index(n, 4)
|
|
|
|
<span style="color: #a020f0;">do</span> kk = 1, 3
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
cn = c_vector_full(a, n)
|
|
<span style="color: #a020f0;">if</span>(cn == 0.d0) <span style="color: #a020f0;">cycle</span>
|
|
|
|
! <span style="color: #b22222;">delta_een_g(num,kk,nw) = delta_een_g(num,kk,nw) + ( &</span>
|
|
! <span style="color: #b22222;">delta_p_gl(num,a,kk,m ,k,nw) * een_rescaled_n(num,a,m+l,nw) + &</span>
|
|
! <span style="color: #b22222;">delta_p_gl(num,a,kk,m+l,k,nw) * een_rescaled_n(num,a,m ,nw) + &</span>
|
|
! <span style="color: #b22222;">delta_p(num,a,m ,k,nw) * een_rescaled_n_gl(num,kk,a,m+l,nw) + &</span>
|
|
! <span style="color: #b22222;">delta_p(num,a,m+l,k,nw) * een_rescaled_n_gl(num,kk,a,m ,nw) ) * cn</span>
|
|
|
|
!<span style="color: #b22222;">delta_een_g(num,kk,nw) = delta_een_g(num,kk,nw) + ( &</span>
|
|
! <span style="color: #b22222;">(dtmp_c(num,kk,a,m ,k,nw) + delta_p_gl(num,a,kk,m ,k,nw)) * een_rescaled_delta_n(a,m+l,nw) + &</span>
|
|
! <span style="color: #b22222;">(dtmp_c(num,kk,a,m+l,k,nw) + delta_p_gl(num,a,kk,m+l,k,nw)) * een_rescaled_delta_n(a,m ,nw) + &</span>
|
|
! <span style="color: #b22222;">(tmp_c(num,a,m ,k,nw) + delta_p(num,a,m ,k,nw)) * een_rescaled_delta_n_gl(kk,a,m+l,nw) + &</span>
|
|
! <span style="color: #b22222;">(tmp_c(num,a,m+l,k,nw) + delta_p(num,a,m+l,k,nw)) * een_rescaled_delta_n_gl(kk,a,m ,nw) )* cn</span>
|
|
|
|
|
|
|
|
delta_een_g(num,kk,nw) = delta_een_g(num,kk,nw) + ( <span style="color: #a020f0;">&</span>
|
|
dtmp_c(num,kk,a,m ,k,nw) * een_rescaled_delta_n(a,m+l,nw) + <span style="color: #a020f0;">&</span>
|
|
dtmp_c(num,kk,a,m+l,k,nw) * een_rescaled_delta_n(a,m ,nw) + <span style="color: #a020f0;">&</span>
|
|
tmp_c(num,a,m ,k,nw) * een_rescaled_delta_n_gl(kk,a,m+l,nw) + <span style="color: #a020f0;">&</span>
|
|
tmp_c(num,a,m+l,k,nw) * een_rescaled_delta_n_gl(kk,a,m ,nw) + <span style="color: #a020f0;">&</span>
|
|
delta_p_gl(num,a,kk,m ,k,nw) * een_rescaled_single_n(a,m+l,nw) + <span style="color: #a020f0;">&</span>
|
|
delta_p_gl(num,a,kk,m+l,k,nw) * een_rescaled_single_n(a,m ,nw) + <span style="color: #a020f0;">&</span>
|
|
delta_p(num,a,m ,k,nw) * een_rescaled_single_n_gl(kk,a,m+l,nw) + <span style="color: #a020f0;">&</span>
|
|
delta_p(num,a,m+l,k,nw) * een_rescaled_single_n_gl(kk,a,m ,nw) )* cn
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_factor_single_een_g_doc</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgb148091" class="outline-2">
|
|
<h2 id="orgb148091"><span class="section-number-2">6.</span> Electron-electron Jastrow</h2>
|
|
<div class="outline-text-2" id="text-6">
|
|
<p>
|
|
Calculates the single-electron move contribution to the \(J_{ee}\) Jastrow factor.
|
|
Similar to the 3-body case above, we need to compute the single-electron contributions to the rescaled distances.
|
|
The rescaled electron-electron distance for the 2-body term is defined as
|
|
\[
|
|
\widetilde{r}_{ij} = \frac{1-e^{-\kappa r_{ij}}}{\kappa}.
|
|
\]
|
|
For the electron-electro Jastrow, no intermediate terms have to be calculated, as we can immidiatly calculate
|
|
\[
|
|
\delta J_{ee} = \sum_i \sum_{j\lt i} \delta_{j,\text{num}} \left(\frac{b_1 \widetilde{r}_{ij}^{\text{new}}}{1+b_2 \widetilde{r}_{ij}^{\text{new}}} - \frac{b_1 \widetilde{r}_{ij}^{\text{old}}}{1+b_2 \widetilde{r}_{ij}^{\text{old}}} + \sum_{k=2}^{N_{\text{bord}}} b_k ({\widetilde{r}_{ij}^{\text{new}}}^k - {\widetilde{r}_{ij}^{\text{old}}}^k )\right),
|
|
\]
|
|
where num is the electron that is being moved.
|
|
The gradient and Laplacian of the rescaled distances are given by
|
|
\[
|
|
\partial_{i,m} \widetilde{r}_{ij} = \frac{r_{i,m} - r_{j,m}}{r_{ij}} e^{-\kappa r_{ij}} \quad \text{and} \quad \partial_{i,4} \widetilde{r}_{ij} = \left(\frac{2}{r_{ij}} - \kappa \right)e^{-\kappa r_{ij}}
|
|
\]
|
|
Then,
|
|
</p>
|
|
\begin{eqnarray*}
|
|
\partial_{i,m}\delta J_{ee} = & \sum_j \delta_{j,\text{num}} \left( \frac{b_1 \partial_{i,m}\widetilde{r}^{\text{new}}_{ij}}{(1+b_2 \widetilde{r}^{\text{new}}_{ij})^2} - \frac{b_1 \partial_{i,m}\widetilde{r}^{\text{old}}_{ij}}{(1+b_2 \widetilde{r}^{\text{old}}_{ij})^2} + \sum_{k=2}^{N_{\text{bord}}} b_k k \left({\widetilde{r}_{ij}^{\text{new}}}^{k-1} \partial_{i,m}\widetilde{r}^{\text{new}}_{ij} - {\widetilde{r}_{ij}^{\text{old}}}^{k-1} \partial_{i,m}\widetilde{r}^{\text{old}}_{ij} \right) \right)\\
|
|
\partial_{i,4}\delta J_{ee} = & \sum_j \delta_{j,\text{num}} \left( \frac{b_1}{(1+b_2 \widetilde{r}^{\text{new}}_{ij})^2} \left(\partial_{i,4}\widetilde{r}^{\text{new}}_{ij} - 2 b_2 \frac{\nabla\widetilde{r}^{\text{new}}_{ij} \cdot \nabla \widetilde{r}^{\text{new}}_{ij}}{1+b_2 \widetilde{r}^{\text{new}}_{ij}} \right) - \frac{b_1}{(1+b_2 \widetilde{r}^{\text{old}}_{ij})^2} \left(\partial_{i,4}\widetilde{r}^{\text{old}}_{ij} - 2 b_2 \frac{\nabla\widetilde{r}^{\text{old}}_{ij} \cdot \nabla \widetilde{r}^{\text{old}}_{ij}}{1+b_2 \widetilde{r}^{\text{old}}_{ij}} \right) \right.\\
|
|
& \left.+ \sum_{k=2}^{N_{\text{bord}}} b_k k \left({\widetilde{r}_{ij}^{\text{new}}}^{k-1}\partial_{i,4}\widetilde{r}_{ij}^{\text{new}} + (k-1)(\nabla\widetilde{r}_{ij}^{\text{new}} \cdot \nabla \widetilde{r}_{ij}^{\text{new}}) {\widetilde{r}_{ij}^{\text{new}}}^{k-2} - {\widetilde{r}_{ij}^{\text{old}}}^{k-1}\partial_{i,4}\widetilde{r}_{ij}^{\text{old}} - (k-1)(\nabla\widetilde{r}_{ij}^{\text{old}} \cdot \nabla \widetilde{r}_{ij}^{\text{old}}) {\widetilde{r}_{ij}^{\text{old}}}^{k-2} \right) \right)
|
|
\end{eqnarray*}
|
|
<p>
|
|
In the special case that \(i = \text{num}\), the gradient and Laplacian change to
|
|
</p>
|
|
\begin{eqnarray*}
|
|
\partial_{\text{num},m}\delta J_{ee} = & -\sum_i \sum_j \delta_{j,\text{num}} \left(\frac{b_1 \partial_{i,m}\widetilde{r}^{\text{new}}_{ij}}{(1+b_2 \widetilde{r}^{\text{new}}_{ij})^2} - \frac{b_1 \partial_{i,m}\widetilde{r}^{\text{old}}_{ij}}{(1+b_2 \widetilde{r}^{\text{old}}_{ij})^2} + \sum_{k=2}^{N_{\text{bord}}} b_k k \left({\widetilde{r}_{ij}^{\text{new}}}^{k-1} \partial_{i,m}\widetilde{r}^{\text{new}}_{ij} - {\widetilde{r}_{ij}^{\text{old}}}^{k-1} \partial_{i,m}\widetilde{r}^{\text{old}}_{ij} \right) \right) \\
|
|
\partial_{\text{num},4}\delta J_{ee} = & -\sum_i \sum_j \delta_{j,\text{num}} \left( \frac{b_1}{(1+b_2 \widetilde{r}^{\text{new}}_{ij})^2} \left(\partial_{i,4}\widetilde{r}^{\text{new}}_{ij} - 2 b_2 \frac{\nabla\widetilde{r}^{\text{new}}_{ij} \cdot \nabla \widetilde{r}^{\text{new}}_{ij}}{1+b_2 \widetilde{r}^{\text{new}}_{ij}} \right) - \frac{b_1}{(1+b_2 \widetilde{r}^{\text{old}}_{ij})^2} \left(\partial_{i,4}\widetilde{r}^{\text{old}}_{ij} - 2 b_2 \frac{\nabla\widetilde{r}^{\text{old}}_{ij} \cdot \nabla \widetilde{r}^{\text{old}}_{ij}}{1+b_2 \widetilde{r}^{\text{old}}_{ij}} \right)\right. \\
|
|
& \left. + \sum_{k=2}^{N_{\text{bord}}} b_k k \left({\widetilde{r}_{ij}^{\text{new}}}^{k-1}\partial_{i,4}\widetilde{r}_{ij}^{\text{new}} + (k-1)(\nabla\widetilde{r}_{ij}^{\text{new}} \cdot \nabla \widetilde{r}_{ij}^{\text{new}}) {\widetilde{r}_{ij}^{\text{new}}}^{k-2} - {\widetilde{r}_{ij}^{\text{old}}}^{k-1}\partial_{i,4}\widetilde{r}_{ij}^{\text{old}} - (k-1)(\nabla\widetilde{r}_{ij}^{\text{old}} \cdot \nabla \widetilde{r}_{ij}^{\text{old}}) {\widetilde{r}_{ij}^{\text{old}}}^{k-2} \right) \right)
|
|
\end{eqnarray*}
|
|
</div>
|
|
<div id="outline-container-org8f52cee" class="outline-3">
|
|
<h3 id="org8f52cee"><span class="section-number-3">6.1.</span> Electron-electron rescaled distance</h3>
|
|
<div class="outline-text-3" id="text-6-1">
|
|
<p>
|
|
Calculates the rescaled electron-electron distances
|
|
\[
|
|
\widetilde{r}_{ij} = \frac{1-e^{-\kappa r_{ij}}}{\kappa}.
|
|
\]
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org14f5b44" class="outline-4">
|
|
<h4 id="org14f5b44"><span class="section-number-4">6.1.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-6-1-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_ee_rescaled_single</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">distance_rescaled</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgec8117b" class="outline-4">
|
|
<h4 id="orgec8117b"><span class="section-number-4">6.1.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-6-1-2">
|
|
<table id="org1593c32" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>rescale_factor_ee</code></td>
|
|
<td class="org-left"><code>double</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Factor to rescale ee distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>single_ee_distance</code></td>
|
|
<td class="org-left"><code>double[walk_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Single electron-electron distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>ee_rescaled_single</code></td>
|
|
<td class="org-left"><code>double[walk_num][elec_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Electron-electron rescaled distances</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_ee_rescaled_single_doc</span>(context, <span style="color: #a020f0;">&</span>
|
|
elec_num, rescale_factor_ee, walk_num, <span style="color: #a020f0;">&</span>
|
|
single_ee_distance, ee_rescaled_single) <span style="color: #a020f0;">&</span>
|
|
<span style="color: #a020f0;">bind</span>(C) <span style="color: #a020f0;">result</span>(info)
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
|
|
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> rescale_factor_ee</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> single_ee_distance(elec_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> ee_rescaled_single(elec_num,walk_num)</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> k, i</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span>) ::<span style="color: #a0522d;"> inverse_rescale_factor_ee</span>
|
|
|
|
inverse_rescale_factor_ee = 1.0d0 / rescale_factor_ee
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (elec_num <= 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_2
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_3
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">do</span> k=1,walk_num
|
|
<span style="color: #a020f0;">do</span> i=1,elec_num
|
|
ee_rescaled_single(i,k) = (1.0d0 - dexp(-rescale_factor_ee * single_ee_distance(i,k))) * inverse_rescale_factor_ee
|
|
<span style="color: #a020f0;">enddo</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_ee_rescaled_single_doc</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org2557842" class="outline-3">
|
|
<h3 id="org2557842"><span class="section-number-3">6.2.</span> Electron-electron Jastrow value</h3>
|
|
<div class="outline-text-3" id="text-6-2">
|
|
<p>
|
|
Calculate the single-electron move contribution to the \(J_{ee}\) Jastrow factor.
|
|
\[
|
|
\delta J_{ee} = \sum_i \sum_{j\lt i} \delta_{j,\text{num}} \left(\frac{b_1 \widetilde{r}_{ij}^{\text{new}}}{1+b_2 \widetilde{r}_{ij}^{\text{new}}} - \frac{b_1 \widetilde{r}_{ij}^{\text{old}}}{1+b_2 \widetilde{r}_{ij}^{\text{old}}} + \sum_{k=2}^{N_{\text{bord}}} b_k ({\widetilde{r}_{ij}^{\text{new}}}^k - {\widetilde{r}_{ij}^{\text{old}}}^k )\right),
|
|
\]
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org4c240d5" class="outline-4">
|
|
<h4 id="org4c240d5"><span class="section-number-4">6.2.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-6-2-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_jastrow_champ_single_ee</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">delta_ee</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_get_jastrow_champ_single_ee</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> delta_ee, size_max) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">import</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span> (qmckl_context) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>), <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_ee(size_max)</span>
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_jastrow_champ_single_ee</span>
|
|
<span style="color: #a020f0;">end interface</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org333e3fe" class="outline-4">
|
|
<h4 id="org333e3fe"><span class="section-number-4">6.2.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-6-2-2">
|
|
<table id="org607fa0a" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Index of single point</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>up_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of alpha electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>bord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of coefficients</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>b_vector</code></td>
|
|
<td class="org-left"><code>double[bord_num+1]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">List of coefficients</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>ee_distance_rescaled</code></td>
|
|
<td class="org-left"><code>double[walk_num][elec_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>ee_rescaled_single</code></td>
|
|
<td class="org-left"><code>double[walk_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron rescaled single distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>delta_ee</code></td>
|
|
<td class="org-left"><code>double[walk_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Single electron-electron Jastrow</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_single_ee_doc</span>(context, <span style="color: #a020f0;">&</span>
|
|
num_in, walk_num, elec_num, up_num, bord_num, b_vector, <span style="color: #a020f0;">&</span>
|
|
ee_distance_rescaled, ee_rescaled_single, spin_independent, delta_ee) <span style="color: #a020f0;">&</span>
|
|
<span style="color: #a020f0;">bind</span>(C) <span style="color: #a020f0;">result</span>(info)
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
|
|
<span style="color: #228b22;">integer</span> (qmckl_context), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> up_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> bord_num</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> b_vector(bord_num+1)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> ee_distance_rescaled(elec_num,elec_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> ee_rescaled_single(elec_num,walk_num)</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int32_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> spin_independent</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_ee(walk_num)</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, j, k, nw, num</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, xk, y, yk</span>
|
|
|
|
num = num_in + 1
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 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 <= 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_4
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (bord_num < 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_5
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">do</span> nw =1, walk_num
|
|
|
|
delta_ee(nw) = 0.0d0
|
|
<span style="color: #a020f0;">do</span> i=1,elec_num
|
|
!<span style="color: #b22222;">print *,i, ee_rescaled_single(i,nw)</span>
|
|
!<span style="color: #b22222;">print *, i, ee_distance_rescaled(i,num,nw)</span>
|
|
!<span style="color: #b22222;">print *, ' '</span>
|
|
<span style="color: #a020f0;">if</span> (i<span style="color: #a020f0;">.ne.</span>num) <span style="color: #a020f0;">then</span>
|
|
x = ee_distance_rescaled(i,num,nw)
|
|
y = ee_rescaled_single(i,nw)
|
|
<span style="color: #a020f0;">if</span> (spin_independent == 1) <span style="color: #a020f0;">then</span>
|
|
delta_ee(nw) = delta_ee(nw) - (b_vector(1) * x / (1.d0 + b_vector(2) * x)) <span style="color: #a020f0;">&</span>
|
|
+ (b_vector(1) * y / (1.d0 + b_vector(2) * y))
|
|
<span style="color: #a020f0;">else</span>
|
|
<span style="color: #a020f0;">if</span> ((i <= up_num <span style="color: #a020f0;">.and.</span> num <= up_num ) <span style="color: #a020f0;">.or.</span> (i > up_num <span style="color: #a020f0;">.and.</span> num > up_num)) <span style="color: #a020f0;">then</span>
|
|
delta_ee(nw) = delta_ee(nw) - (0.5d0 * b_vector(1) * x / (1.d0 + b_vector(2) * x)) <span style="color: #a020f0;">&</span>
|
|
+ (0.5d0 * b_vector(1) * y / (1.d0 + b_vector(2) * y))
|
|
<span style="color: #a020f0;">else</span>
|
|
delta_ee(nw) = delta_ee(nw) - (b_vector(1) * x / (1.d0 + b_vector(2) * x)) <span style="color: #a020f0;">&</span>
|
|
+ (b_vector(1) * y / (1.d0 + b_vector(2) * y))
|
|
<span style="color: #a020f0;">endif</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
xk = x
|
|
yk = y
|
|
<span style="color: #a020f0;">do</span> k=2,bord_num
|
|
xk = xk * x
|
|
yk = yk * y
|
|
delta_ee(nw) = delta_ee(nw) - (b_vector(k+1) * xk) + (b_vector(k+1) * yk)
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_single_ee_doc</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org1e40ea1" class="outline-3">
|
|
<h3 id="org1e40ea1"><span class="section-number-3">6.3.</span> Electron-electron rescaled distances derivatives</h3>
|
|
<div class="outline-text-3" id="text-6-3">
|
|
<p>
|
|
Calculate the derivative of the rescaled electron-electron distances.
|
|
\[
|
|
\partial_{i,m} \widetilde{r}_{ij} = \frac{r_{i,m} - r_{j,m}}{r_{ij}} e^{-\kappa r_{ij}} \quad \text{and} \quad \partial_{i,4} \widetilde{r}_{ij} = \left(\frac{2}{r_{ij}} - \kappa \right)e^{-\kappa r_{ij}}
|
|
\]
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-orged85a72" class="outline-4">
|
|
<h4 id="orged85a72"><span class="section-number-4">6.3.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-6-3-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_get_ee_rescaled_single_gl</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">distance_rescaled_gl</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgf4511b4" class="outline-4">
|
|
<h4 id="orgf4511b4"><span class="section-number-4">6.3.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-6-3-2">
|
|
<table id="orgc0e8a09" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Index of single electron</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>rescale_factor_ee</code></td>
|
|
<td class="org-left"><code>double</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Factor to rescale ee distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>single_ee_distance</code></td>
|
|
<td class="org-left"><code>double[elec_num][walk_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Single electron-electron distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_coord</code></td>
|
|
<td class="org-left"><code>double[3][walk_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron coordinates</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>coord</code></td>
|
|
<td class="org-left"><code>double[walk_num][3]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Single electron coordinates</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>ee_rescaled_single_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][elec_num][4]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Electron-electron rescaled single distance derivatives</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_ee_rescaled_single_gl_doc</span>(context, num_in, <span style="color: #a020f0;">&</span>
|
|
elec_num, rescale_factor_ee, walk_num, single_ee_distance, elec_coord, coord, ee_rescaled_single_gl) <span style="color: #a020f0;">&</span>
|
|
<span style="color: #a020f0;">bind</span>(C) <span style="color: #a020f0;">result</span>(info)
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
|
|
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> rescale_factor_ee</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> single_ee_distance(elec_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> elec_coord(elec_num,walk_num,3)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coord(3,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> ee_rescaled_single_gl(4,elec_num,walk_num)</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> nw, i, ii, num</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> rij_inv, elel_dist_gl(4, elec_num), kappa_l</span>
|
|
|
|
num = num_in + 1
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (elec_num <= 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_2
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_3
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
|
|
ee_rescaled_single_gl = 0.0d0
|
|
<span style="color: #a020f0;">do</span> nw = 1, walk_num
|
|
|
|
! <span style="color: #b22222;">prepare the actual een table</span>
|
|
<span style="color: #a020f0;">do</span> i = 1, elec_num
|
|
rij_inv = 1.0d0 / single_ee_distance(i, nw)
|
|
<span style="color: #a020f0;">do</span> ii = 1, 3
|
|
elel_dist_gl(ii, i) = (elec_coord(i,nw, ii) - coord(ii,nw)) * rij_inv
|
|
<span style="color: #a020f0;">end do</span>
|
|
elel_dist_gl(4, i) = 2.0d0 * rij_inv
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">do</span> i = 1, elec_num
|
|
kappa_l = -1 * rescale_factor_ee
|
|
ee_rescaled_single_gl(1, i, nw) = elel_dist_gl(1, i)
|
|
ee_rescaled_single_gl(2, i, nw) = elel_dist_gl(2, i)
|
|
ee_rescaled_single_gl(3, i, nw) = elel_dist_gl(3, i)
|
|
ee_rescaled_single_gl(4, i, nw) = elel_dist_gl(4, i)
|
|
|
|
ee_rescaled_single_gl(4, i, nw) = ee_rescaled_single_gl(4, i, nw) + kappa_l
|
|
|
|
ee_rescaled_single_gl(1, i, nw) = ee_rescaled_single_gl(1, i, nw) * dexp(kappa_l * single_ee_distance(i,nw))
|
|
ee_rescaled_single_gl(2, i, nw) = ee_rescaled_single_gl(2, i, nw) * dexp(kappa_l * single_ee_distance(i,nw))
|
|
ee_rescaled_single_gl(3, i, nw) = ee_rescaled_single_gl(3, i, nw) * dexp(kappa_l * single_ee_distance(i,nw))
|
|
ee_rescaled_single_gl(4, i, nw) = ee_rescaled_single_gl(4, i, nw) * dexp(kappa_l * single_ee_distance(i,nw))
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
ee_rescaled_single_gl(1, num, nw) = 0.0d0
|
|
ee_rescaled_single_gl(2, num, nw) = 0.0d0
|
|
ee_rescaled_single_gl(3, num, nw) = 0.0d0
|
|
ee_rescaled_single_gl(4, num, nw) = 0.0d0
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_ee_rescaled_single_gl_doc</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org0ce7313" class="outline-3">
|
|
<h3 id="org0ce7313"><span class="section-number-3">6.4.</span> Electron-electron Jastrow gradients and Laplacian</h3>
|
|
<div class="outline-text-3" id="text-6-4">
|
|
<p>
|
|
Calculates the gradient and Laplacian of the electron-electron Jastrow factor.
|
|
</p>
|
|
\begin{eqnarray*}
|
|
\partial_{i,m}\delta J_{ee} = & \sum_j \delta_{j,\text{num}} \left( \frac{b_1 \partial_{i,m}\widetilde{r}^{\text{new}}_{ij}}{(1+b_2 \widetilde{r}^{\text{new}}_{ij})^2} - \frac{b_1 \partial_{i,m}\widetilde{r}^{\text{old}}_{ij}}{(1+b_2 \widetilde{r}^{\text{old}}_{ij})^2} + \sum_{k=2}^{N_{\text{bord}}} b_k k \left({\widetilde{r}_{ij}^{\text{new}}}^{k-1} \partial_{i,m}\widetilde{r}^{\text{new}}_{ij} - {\widetilde{r}_{ij}^{\text{old}}}^{k-1} \partial_{i,m}\widetilde{r}^{\text{old}}_{ij} \right) \right)\\
|
|
\partial_{i,4}\delta J_{ee} = & \sum_j \delta_{j,\text{num}} \left( \frac{b_1}{(1+b_2 \widetilde{r}^{\text{new}}_{ij})^2} \left(\partial_{i,4}\widetilde{r}^{\text{new}}_{ij} - 2 b_2 \frac{\nabla\widetilde{r}^{\text{new}}_{ij} \cdot \nabla \widetilde{r}^{\text{new}}_{ij}}{1+b_2 \widetilde{r}^{\text{new}}_{ij}} \right) - \frac{b_1}{(1+b_2 \widetilde{r}^{\text{old}}_{ij})^2} \left(\partial_{i,4}\widetilde{r}^{\text{old}}_{ij} - 2 b_2 \frac{\nabla\widetilde{r}^{\text{old}}_{ij} \cdot \nabla \widetilde{r}^{\text{old}}_{ij}}{1+b_2 \widetilde{r}^{\text{old}}_{ij}} \right) \right.\\
|
|
& \left.+ \sum_{k=2}^{N_{\text{bord}}} b_k k \left({\widetilde{r}_{ij}^{\text{new}}}^{k-1}\partial_{i,4}\widetilde{r}_{ij}^{\text{new}} + (k-1)(\nabla\widetilde{r}_{ij}^{\text{new}} \cdot \nabla \widetilde{r}_{ij}^{\text{new}}) {\widetilde{r}_{ij}^{\text{new}}}^{k-2} - {\widetilde{r}_{ij}^{\text{old}}}^{k-1}\partial_{i,4}\widetilde{r}_{ij}^{\text{old}} - (k-1)(\nabla\widetilde{r}_{ij}^{\text{old}} \cdot \nabla \widetilde{r}_{ij}^{\text{old}}) {\widetilde{r}_{ij}^{\text{old}}}^{k-2} \right) \right)
|
|
\end{eqnarray*}
|
|
<p>
|
|
In the special case that \(i = \text{num}\), the gradient and Laplacian change to
|
|
</p>
|
|
\begin{eqnarray*}
|
|
\partial_{\text{num},m}\delta J_{ee} = & -\sum_i \sum_j \delta_{j,\text{num}} \left(\frac{b_1 \partial_{i,m}\widetilde{r}^{\text{new}}_{ij}}{(1+b_2 \widetilde{r}^{\text{new}}_{ij})^2} - \frac{b_1 \partial_{i,m}\widetilde{r}^{\text{old}}_{ij}}{(1+b_2 \widetilde{r}^{\text{old}}_{ij})^2} + \sum_{k=2}^{N_{\text{bord}}} b_k k \left({\widetilde{r}_{ij}^{\text{new}}}^{k-1} \partial_{i,m}\widetilde{r}^{\text{new}}_{ij} - {\widetilde{r}_{ij}^{\text{old}}}^{k-1} \partial_{i,m}\widetilde{r}^{\text{old}}_{ij} \right) \right) \\
|
|
\partial_{\text{num},4}\delta J_{ee} = & -\sum_i \sum_j \delta_{j,\text{num}} \left( \frac{b_1}{(1+b_2 \widetilde{r}^{\text{new}}_{ij})^2} \left(\partial_{i,4}\widetilde{r}^{\text{new}}_{ij} - 2 b_2 \frac{\nabla\widetilde{r}^{\text{new}}_{ij} \cdot \nabla \widetilde{r}^{\text{new}}_{ij}}{1+b_2 \widetilde{r}^{\text{new}}_{ij}} \right) - \frac{b_1}{(1+b_2 \widetilde{r}^{\text{old}}_{ij})^2} \left(\partial_{i,4}\widetilde{r}^{\text{old}}_{ij} - 2 b_2 \frac{\nabla\widetilde{r}^{\text{old}}_{ij} \cdot \nabla \widetilde{r}^{\text{old}}_{ij}}{1+b_2 \widetilde{r}^{\text{old}}_{ij}} \right)\right. \\
|
|
& \left. + \sum_{k=2}^{N_{\text{bord}}} b_k k \left({\widetilde{r}_{ij}^{\text{new}}}^{k-1}\partial_{i,4}\widetilde{r}_{ij}^{\text{new}} + (k-1)(\nabla\widetilde{r}_{ij}^{\text{new}} \cdot \nabla \widetilde{r}_{ij}^{\text{new}}) {\widetilde{r}_{ij}^{\text{new}}}^{k-2} - {\widetilde{r}_{ij}^{\text{old}}}^{k-1}\partial_{i,4}\widetilde{r}_{ij}^{\text{old}} - (k-1)(\nabla\widetilde{r}_{ij}^{\text{old}} \cdot \nabla \widetilde{r}_{ij}^{\text{old}}) {\widetilde{r}_{ij}^{\text{old}}}^{k-2} \right) \right)
|
|
\end{eqnarray*}
|
|
</div>
|
|
|
|
<div id="outline-container-org9538621" class="outline-4">
|
|
<h4 id="org9538621"><span class="section-number-4">6.4.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-6-4-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_jastrow_champ_single_ee_gl</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">delta_ee_gl</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_get_jastrow_champ_single_ee_gl</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> delta_ee_gl, size_max) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">import</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span> (qmckl_context) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>), <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_ee_gl(size_max)</span>
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_jastrow_champ_single_ee_gl</span>
|
|
<span style="color: #a020f0;">end interface</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgc134e8b" class="outline-4">
|
|
<h4 id="orgc134e8b"><span class="section-number-4">6.4.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-6-4-2">
|
|
<table id="org986be29" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Index of single electron</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>up_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of alpha electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>bord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of coefficients</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>b_vector</code></td>
|
|
<td class="org-left"><code>double[bord_num+1]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">List of coefficients</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>ee_distance_rescaled</code></td>
|
|
<td class="org-left"><code>double[walk_num][elec_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>ee_distance_rescaled_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][4][elec_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron rescaled distances derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>ee_rescaled_single</code></td>
|
|
<td class="org-left"><code>double[walk_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron rescaled single distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>ee_rescaled_single_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron rescaled single distances derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>spin_independent</code></td>
|
|
<td class="org-left"><code>int32_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">If 1, same parameters for parallel and antiparallel spins</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>delta_ee_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][elec_num][4]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Single electron-electron jastrow gradients and Laplacian</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_single_ee_gl_doc</span>( <span style="color: #a020f0;">&</span>
|
|
context, num_in, walk_num, elec_num, up_num, bord_num, <span style="color: #a020f0;">&</span>
|
|
b_vector, ee_distance_rescaled, ee_distance_rescaled_gl, <span style="color: #a020f0;">&</span>
|
|
ee_rescaled_single, ee_rescaled_single_gl, <span style="color: #a020f0;">&</span>
|
|
spin_independent, delta_ee_gl) <span style="color: #a020f0;">&</span>
|
|
<span style="color: #a020f0;">bind</span>(C) <span style="color: #a020f0;">result</span>(info)
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
|
|
<span style="color: #228b22;">integer</span> (qmckl_context), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> up_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> bord_num</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> b_vector(bord_num+1)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> ee_distance_rescaled(elec_num,elec_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> ee_distance_rescaled_gl(4,elec_num,elec_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> ee_rescaled_single(elec_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> ee_rescaled_single_gl(4,elec_num,walk_num)</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int32_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> spin_independent</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_ee_gl(4,elec_num,walk_num)</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, j, k, nw, ii, num</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, x1, kf, x_old, x1_old</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> denom, invdenom, invdenom2, f</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> denom_old, invdenom_old, invdenom2_old, f_old</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> grad_c2, grad_c2_old</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> dx(4), dx_old(4)</span>
|
|
|
|
num = num_in + 1
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 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 <= 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_4
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (bord_num < 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_5
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> ((spin_independent < 0)<span style="color: #a020f0;">.or.</span>(spin_independent > 1)) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_8
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">do</span> nw =1, walk_num
|
|
delta_ee_gl(:,:,nw) = 0.0d0
|
|
<span style="color: #a020f0;">do</span> i = 1, elec_num
|
|
<span style="color: #a020f0;">if</span> (i == num) <span style="color: #a020f0;">cycle</span>
|
|
|
|
x = ee_rescaled_single(i,nw)
|
|
x_old = ee_distance_rescaled(i,num,nw)
|
|
|
|
denom = 1.0d0 + b_vector(2) * x
|
|
invdenom = 1.0d0 / denom
|
|
invdenom2 = invdenom * invdenom
|
|
|
|
denom_old = 1.0d0 + b_vector(2) * x_old
|
|
invdenom_old = 1.0d0 / denom_old
|
|
invdenom2_old = invdenom_old * invdenom_old
|
|
|
|
dx(1) = ee_rescaled_single_gl(1, i, nw)
|
|
dx(2) = ee_rescaled_single_gl(2, i, nw)
|
|
dx(3) = ee_rescaled_single_gl(3, i, nw)
|
|
dx(4) = ee_rescaled_single_gl(4, i, nw)
|
|
|
|
dx_old(1) = ee_distance_rescaled_gl(1, i, num, nw)
|
|
dx_old(2) = ee_distance_rescaled_gl(2, i, num, nw)
|
|
dx_old(3) = ee_distance_rescaled_gl(3, i, num, nw)
|
|
dx_old(4) = ee_distance_rescaled_gl(4, i, num, nw)
|
|
|
|
grad_c2 = dx(1)*dx(1) + dx(2)*dx(2) + dx(3)*dx(3)
|
|
grad_c2_old = dx_old(1)*dx_old(1) + dx_old(2)*dx_old(2) + dx_old(3)*dx_old(3)
|
|
|
|
<span style="color: #a020f0;">if</span> (spin_independent == 1) <span style="color: #a020f0;">then</span>
|
|
f = b_vector(1) * invdenom2
|
|
f_old = b_vector(1) * invdenom2_old
|
|
<span style="color: #a020f0;">else</span>
|
|
<span style="color: #a020f0;">if</span>((i <= up_num <span style="color: #a020f0;">.and.</span> num <= up_num ) <span style="color: #a020f0;">.or.</span> (i > up_num <span style="color: #a020f0;">.and.</span> num > up_num)) <span style="color: #a020f0;">then</span>
|
|
f = 0.5d0 * b_vector(1) * invdenom2
|
|
f_old = 0.5d0 * b_vector(1) * invdenom2_old
|
|
<span style="color: #a020f0;">else</span>
|
|
f = b_vector(1) * invdenom2
|
|
f_old = b_vector(1) * invdenom2_old
|
|
<span style="color: #a020f0;">end if</span>
|
|
<span style="color: #a020f0;">end if</span>
|
|
|
|
delta_ee_gl(1,i,nw) = delta_ee_gl(1,i,nw) + f * dx(1) - f_old * dx_old(1)
|
|
delta_ee_gl(2,i,nw) = delta_ee_gl(2,i,nw) + f * dx(2) - f_old * dx_old(2)
|
|
delta_ee_gl(3,i,nw) = delta_ee_gl(3,i,nw) + f * dx(3) - f_old * dx_old(3)
|
|
delta_ee_gl(4,i,nw) = delta_ee_gl(4,i,nw) <span style="color: #a020f0;">&</span>
|
|
+ f * (dx(4) - 2.d0 * b_vector(2) * grad_c2 * invdenom) <span style="color: #a020f0;">&</span>
|
|
- f_old * (dx_old(4) - 2.d0 * b_vector(2) * grad_c2_old * invdenom_old)
|
|
|
|
delta_ee_gl(1,num,nw) = delta_ee_gl(1,num,nw) - f * dx(1) + f_old * dx_old(1)
|
|
delta_ee_gl(2,num,nw) = delta_ee_gl(2,num,nw) - f * dx(2) + f_old * dx_old(2)
|
|
delta_ee_gl(3,num,nw) = delta_ee_gl(3,num,nw) - f * dx(3) + f_old * dx_old(3)
|
|
delta_ee_gl(4,num,nw) = delta_ee_gl(4,num,nw) <span style="color: #a020f0;">&</span>
|
|
+ f * (dx(4) - 2.d0 * b_vector(2) * grad_c2 * invdenom) <span style="color: #a020f0;">&</span>
|
|
- f_old * (dx_old(4) - 2.d0 * b_vector(2) * grad_c2_old * invdenom_old)
|
|
|
|
|
|
kf = 2.d0
|
|
x1 = x
|
|
x1_old = x_old
|
|
x = 1.d0
|
|
x_old = 1.d0
|
|
<span style="color: #a020f0;">do</span> k=2, bord_num
|
|
f = b_vector(k+1) * kf * x
|
|
f_old = b_vector(k+1) * kf * x_old
|
|
delta_ee_gl(1,i,nw) = delta_ee_gl(1,i,nw) + f * x1 * dx(1) - f_old * x1_old * dx_old(1)
|
|
delta_ee_gl(2,i,nw) = delta_ee_gl(2,i,nw) + f * x1 * dx(2) - f_old * x1_old * dx_old(2)
|
|
delta_ee_gl(3,i,nw) = delta_ee_gl(3,i,nw) + f * x1 * dx(3) - f_old * x1_old * dx_old(3)
|
|
delta_ee_gl(4,i,nw) = delta_ee_gl(4,i,nw) <span style="color: #a020f0;">&</span>
|
|
+ f * (x1 * dx(4) + (kf-1.d0) * grad_c2) <span style="color: #a020f0;">&</span>
|
|
- f_old * (x1_old * dx_old(4) + (kf-1.d0) * grad_c2_old)
|
|
|
|
delta_ee_gl(1,num,nw) = delta_ee_gl(1,num,nw) - f * x1 * dx(1) + f_old * x1_old * dx_old(1)
|
|
delta_ee_gl(2,num,nw) = delta_ee_gl(2,num,nw) - f * x1 * dx(2) + f_old * x1_old * dx_old(2)
|
|
delta_ee_gl(3,num,nw) = delta_ee_gl(3,num,nw) - f * x1 * dx(3) + f_old * x1_old * dx_old(3)
|
|
delta_ee_gl(4,num,nw) = delta_ee_gl(4,num,nw) <span style="color: #a020f0;">&</span>
|
|
+ f * (x1 * dx(4) + (kf-1.d0) * grad_c2) <span style="color: #a020f0;">&</span>
|
|
- f_old * (x1_old * dx_old(4) + (kf-1.d0) * grad_c2_old)
|
|
x = x*x1
|
|
x_old = x_old*x1_old
|
|
kf = kf + 1.d0
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_single_ee_gl_doc</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgbf0e336" class="outline-2">
|
|
<h2 id="orgbf0e336"><span class="section-number-2">7.</span> Electron-nucleus Jastrow</h2>
|
|
<div class="outline-text-2" id="text-7">
|
|
<p>
|
|
Here we calculate the single-electron move contribution to the \(J_{en}\) Jastrow factor.
|
|
First, we need to compute the single-electron contributions to the rescaled distances.
|
|
The rescaled electron-electron distance for the 2-body term is defined as
|
|
\[
|
|
\widetilde{R}_{i\alpha} = \frac{1-e^{-\kappa R_{i\alpha}}}{\kappa}.
|
|
\]
|
|
For the electron-nucleus Jastrow, no intermediate terms have to be calculated, as we can immidiatly calculate
|
|
\[
|
|
\delta J_{en} = \sum_i \delta_{i,\text{num}} \left( \frac{a_1 \widetilde{R}_{i\alpha}^{\text{new}}}{1+a_2 \widetilde{R}_{i\alpha}^{\text{new}}} - \frac{a_1 \widetilde{R}_{i\alpha}^{\text{old}}}{1+a_2 \widetilde{R}_{i\alpha}^{\text{old}}} + \sum_{k=2}^{N_\text{aord}} a_k\left({\widetilde{R}_{i\alpha}^{\text{new}}}^k - {\widetilde{R}_{i\alpha}^{\text{old}}}^k \right)\right)
|
|
\]
|
|
where num is the electron that is being moved.
|
|
The gradient and Laplacian of the rescaled distances are given by
|
|
\[
|
|
\partial_{i,m} \widetilde{R}_{i\alpha} = \frac{r_{i,m} - R_{\alpha,m}}{R_{i\alpha}} e^{-\kappa R_{i\alpha}} \quad \text{and} \quad \partial_{i,4} \widetilde{R}_{i\alpha} = \left(\frac{2}{R_{i\alpha}} - \kappa \right)e^{-\kappa R_{i\alpha}}
|
|
\]
|
|
Then,
|
|
</p>
|
|
\begin{eqnarray*}
|
|
\partial_{i,m}\delta J_{en} = & \sum_\alpha \delta_{i,\text{num}} \left( \frac{a_1 \partial_{i,m}\widetilde{R}^{\text{new}}_{i\alpha}}{(1+a_2 \widetilde{R}^{\text{new}}_{i\alpha})^2} - \frac{a_1 \partial_{i,m}\widetilde{R}^{\text{old}}_{i\alpha}}{(1+a_2 \widetilde{R}^{\text{old}}_{i\alpha})^2} + \sum_{k=2}^{N_{\text{aord}}} a_k k \left({\widetilde{R}_{i\alpha}^{\text{new}}}^{k-1} \partial_{i,m}\widetilde{R}^{\text{new}}_{i\alpha} - {\widetilde{R}_{i\alpha}^{\text{old}}}^{k-1} \partial_{i,m}\widetilde{R}^{\text{old}}_{i\alpha} \right) \right)\\
|
|
\partial_{i,4}\delta J_{en} = & \sum_\alpha \delta_{i,\text{num}} \left( \frac{a_1}{(1+a_2 \widetilde{R}^{\text{new}}_{i\alpha})^2} \left(\partial_{i,4}\widetilde{R}^{\text{new}}_{i\alpha} - 2 a_2 \frac{\nabla\widetilde{R}^{\text{new}}_{i\alpha} \cdot \nabla \widetilde{R}^{\text{new}}_{i\alpha}}{1+a_2 \widetilde{R}^{\text{new}}_{i\alpha}} \right) - \frac{a_1}{(1+a_2 \widetilde{R}^{\text{old}}_{i\alpha})^2} \left(\partial_{i,4}\widetilde{R}^{\text{old}}_{i\alpha} - 2 a_2 \frac{\nabla\widetilde{R}^{\text{old}}_{i\alpha} \cdot \nabla \widetilde{R}^{\text{old}}_{i\alpha}}{1+b_2 \widetilde{R}^{\text{old}}_{i\alpha}} \right) \right.\\
|
|
& \left.+ \sum_{k=2}^{N_{\text{aord}}} a_k k \left({\widetilde{R}_{i\alpha}^{\text{new}}}^{k-1}\partial_{i,4}\widetilde{R}_{i\alpha}^{\text{new}} + (k-1)(\nabla\widetilde{R}_{i\alpha}^{\text{new}} \cdot \nabla \widetilde{R}_{i\alpha}^{\text{new}}) {\widetilde{R}_{i\alpha}^{\text{new}}}^{k-2} - {\widetilde{R}_{i\alpha}^{\text{old}}}^{k-1}\partial_{i,4}\widetilde{R}_{i\alpha}^{\text{old}} - (k-1)(\nabla\widetilde{R}_{i\alpha}^{\text{old}} \cdot \nabla \widetilde{R}_{i\alpha}^{\text{old}}) {\widetilde{R}_{i\alpha}^{\text{old}}}^{k-2} \right) \right)
|
|
\end{eqnarray*}
|
|
</div>
|
|
|
|
|
|
<div id="outline-container-orgbdc1f14" class="outline-3">
|
|
<h3 id="orgbdc1f14"><span class="section-number-3">7.1.</span> Electron-nucleus rescaled distance</h3>
|
|
<div class="outline-text-3" id="text-7-1">
|
|
<p>
|
|
Calculate the updated rescaled electron-nucleus distances
|
|
\[
|
|
\widetilde{R}_{i\alpha} = \frac{1-e^{-\kappa R_{i\alpha}}}{\kappa}.
|
|
\]
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org03340ae" class="outline-4">
|
|
<h4 id="org03340ae"><span class="section-number-4">7.1.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-7-1-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_en_rescaled_single</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">distance_rescaled</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgfc6a2ec" class="outline-4">
|
|
<h4 id="orgfc6a2ec"><span class="section-number-4">7.1.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-7-1-2">
|
|
<table id="orgd03093c" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of types of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_vector</code></td>
|
|
<td class="org-left"><code>int64_t[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of types of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>rescale_factor_en</code></td>
|
|
<td class="org-left"><code>double[type_nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">The factor for rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>single_en_distance</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Single electron-nucleus distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_rescaled_single</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Electron-nucleus rescaled distances</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_en_rescaled_single_doc</span>(context, <span style="color: #a020f0;">&</span>
|
|
nucl_num, type_nucl_num, type_nucl_vector, rescale_factor_en, <span style="color: #a020f0;">&</span>
|
|
walk_num, single_en_distance, en_rescaled_single) <span style="color: #a020f0;">&</span>
|
|
<span style="color: #a020f0;">bind</span>(C) <span style="color: #a020f0;">result</span>(info)
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span> (qmckl_context), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> nucl_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> type_nucl_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> type_nucl_vector(nucl_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> rescale_factor_en(type_nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> single_en_distance(nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> en_rescaled_single(nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, k</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> coord(3)</span>
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
|
|
<span style="color: #a020f0;">if</span> (nucl_num <= 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_2
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_4
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">do</span> i=1, nucl_num
|
|
<span style="color: #a020f0;">do</span> k=1,walk_num
|
|
en_rescaled_single(i,k) = (1.0d0 - dexp(-rescale_factor_en(type_nucl_vector(i)+1) * <span style="color: #a020f0;">&</span>
|
|
single_en_distance(i,k))) / rescale_factor_en(type_nucl_vector(i)+1)
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_en_rescaled_single_doc</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div id="outline-container-org36ed085" class="outline-3">
|
|
<h3 id="org36ed085"><span class="section-number-3">7.2.</span> Single electron-nucleus Jastrow value</h3>
|
|
<div class="outline-text-3" id="text-7-2">
|
|
<p>
|
|
Calculates \(\delta J_{en}\)
|
|
\[
|
|
\delta J_{en} = \sum_i \delta_{i,\text{num}} \left( \frac{a_1 \widetilde{R}_{i\alpha}^{\text{new}}}{1+a_2 \widetilde{R}_{i\alpha}^{\text{new}}} - \frac{a_1 \widetilde{R}_{i\alpha}^{\text{old}}}{1+a_2 \widetilde{R}_{i\alpha}^{\text{old}}} + \sum_{k=2}^{N_\text{aord}} a_k\left({\widetilde{R}_{i\alpha}^{\text{new}}}^k - {\widetilde{R}_{i\alpha}^{\text{old}}}^k \right)\right)
|
|
\]
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-orgf0f9820" class="outline-4">
|
|
<h4 id="orgf0f9820"><span class="section-number-4">7.2.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-7-2-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_jastrow_champ_single_en</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">delta_en</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_get_jastrow_champ_single_en</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> delta_en, size_max) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">import</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span> (qmckl_context) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>), <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_en(size_max)</span>
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_jastrow_champ_single_en</span>
|
|
<span style="color: #a020f0;">end interface</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org173d970" class="outline-4">
|
|
<h4 id="org173d970"><span class="section-number-4">7.2.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-7-2-2">
|
|
<table id="org17bb95a" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Index of single point</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of unique nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_vector</code></td>
|
|
<td class="org-left"><code>int64_t[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">IDs of unique nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>aord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of coefficients</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>a_vector</code></td>
|
|
<td class="org-left"><code>double[type_nucl_num][aord_num+1]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">List of coefficients</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_distance_rescaled</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left">~en<sub>rescaled</sub><sub>single</sub> ~</td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled single distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>delta_en</code></td>
|
|
<td class="org-left"><code>double[walk_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Single electron-nucleus jastrow</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_single_en_doc</span>( <span style="color: #a020f0;">&</span>
|
|
context, num_in, walk_num, elec_num, nucl_num, type_nucl_num, <span style="color: #a020f0;">&</span>
|
|
type_nucl_vector, aord_num, a_vector, <span style="color: #a020f0;">&</span>
|
|
en_distance_rescaled, en_rescaled_single, delta_en) <span style="color: #a020f0;">&</span>
|
|
<span style="color: #a020f0;">bind</span>(C) <span style="color: #a020f0;">result</span>(info)
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
|
|
<span style="color: #228b22;">integer</span> (qmckl_context), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> nucl_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> type_nucl_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> type_nucl_vector(nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> aord_num</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> a_vector(aord_num+1,type_nucl_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_distance_rescaled(elec_num,nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_rescaled_single(nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_en(walk_num)</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, p, nw, num</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, power_ser, y</span>
|
|
|
|
num = num_in + 1
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 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 <= 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 <= 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_4
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (type_nucl_num <= 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 < 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_7
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
|
|
<span style="color: #a020f0;">do</span> nw =1, walk_num
|
|
delta_en(nw) = 0.0d0
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
x = en_distance_rescaled(num, a, nw)
|
|
y = en_rescaled_single(a, nw)
|
|
|
|
delta_en(nw) = delta_en(nw) - a_vector(1, type_nucl_vector(a)+1) * x / (1.0d0 + a_vector(2, type_nucl_vector(a)+1) * x)
|
|
delta_en(nw) = delta_en(nw) + a_vector(1, type_nucl_vector(a)+1) * y / (1.0d0 + a_vector(2, type_nucl_vector(a)+1) * y)
|
|
|
|
<span style="color: #a020f0;">do</span> p = 2, aord_num
|
|
x = x * en_distance_rescaled(num, a, nw)
|
|
y = y * en_rescaled_single(a, nw)
|
|
delta_en(nw) = delta_en(nw) - a_vector(p + 1, type_nucl_vector(a)+1) * x + a_vector(p + 1, type_nucl_vector(a)+1) * y
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_single_en_doc</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div id="outline-container-org5138156" class="outline-3">
|
|
<h3 id="org5138156"><span class="section-number-3">7.3.</span> Electron-nucleus rescaled distances derivatives</h3>
|
|
<div class="outline-text-3" id="text-7-3">
|
|
<p>
|
|
Calculate the gradients and Laplacians of the rescaled electron-nucleus distances
|
|
\[
|
|
\partial_{i,m} \widetilde{R}_{i\alpha} = \frac{r_{i,m} - R_{\alpha,m}}{R_{i\alpha}} e^{-\kappa R_{i\alpha}} \quad \text{and} \quad \partial_{i,4} \widetilde{R}_{i\alpha} = \left(\frac{2}{R_{i\alpha}} - \kappa \right)e^{-\kappa R_{i\alpha}}
|
|
\]
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-orgb7b718d" class="outline-4">
|
|
<h4 id="orgb7b718d"><span class="section-number-4">7.3.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-7-3-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_get_en_rescaled_single_gl</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">distance_rescaled_gl</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">size_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org54a571c" class="outline-4">
|
|
<h4 id="org54a571c"><span class="section-number-4">7.3.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-7-3-2">
|
|
<table id="org6475bfb" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nucleus types</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_vector</code></td>
|
|
<td class="org-left"><code>int64_t[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Array of nucleus types</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>rescale_factor_en</code></td>
|
|
<td class="org-left"><code>double[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">The factors for rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>single_en_distance</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Single electorn distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>coord</code></td>
|
|
<td class="org-left"><code>double[walk_num][3]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Single electron coordinates</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_coord</code></td>
|
|
<td class="org-left"><code>double[3][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Nucleus coordinates</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_rescaled_single_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num][4]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Electron-nucleus rescaled single distance derivatives</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_en_rescaled_single_gl_doc_f</span><span style="color: #a0522d;">(context, nucl_num, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> type_nucl_num, type_nucl_vector, rescale_factor_en, walk_num, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> single_en_distance, coord, nucl_coord, en_rescaled_single_gl) </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> result(info)</span>
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> nucl_num</span>
|
|
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> type_nucl_num</span>
|
|
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> type_nucl_vector(nucl_num)</span>
|
|
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> rescale_factor_en(nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span>*8 , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> walk_num</span>
|
|
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> single_en_distance(nucl_num, walk_num)</span>
|
|
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coord(3,walk_num)</span>
|
|
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> nucl_coord(nucl_num,3)</span>
|
|
<span style="color: #228b22;">double precision</span> , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> en_rescaled_single_gl(4,nucl_num,walk_num)</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> nw, a, ii</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> ria_inv, elnuc_dist_gl(4, nucl_num), kappa_l</span>
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
|
|
<span style="color: #a020f0;">if</span> (nucl_num <= 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_2
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_4
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
|
|
en_rescaled_single_gl = 0.0d0
|
|
<span style="color: #a020f0;">do</span> nw = 1, walk_num
|
|
|
|
! <span style="color: #b22222;">prepare the actual een table</span>
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
ria_inv = 1.0d0 / single_en_distance(a, nw)
|
|
<span style="color: #a020f0;">do</span> ii = 1, 3
|
|
elnuc_dist_gl(ii, a) = (coord(ii,nw) - nucl_coord(a, ii)) * ria_inv
|
|
<span style="color: #a020f0;">end do</span>
|
|
elnuc_dist_gl(4, a) = 2.0d0 * ria_inv
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
kappa_l = -1 * rescale_factor_en(type_nucl_vector(a)+1)
|
|
en_rescaled_single_gl(1, a, nw) = elnuc_dist_gl(1, a)
|
|
en_rescaled_single_gl(2, a, nw) = elnuc_dist_gl(2, a)
|
|
en_rescaled_single_gl(3, a, nw) = elnuc_dist_gl(3, a)
|
|
en_rescaled_single_gl(4, a, nw) = elnuc_dist_gl(4, a)
|
|
|
|
en_rescaled_single_gl(4, a, nw) = en_rescaled_single_gl(4, a, nw) + kappa_l
|
|
|
|
en_rescaled_single_gl(1, a, nw) = en_rescaled_single_gl(1, a, nw) * dexp(kappa_l * single_en_distance(a,nw))
|
|
en_rescaled_single_gl(2, a, nw) = en_rescaled_single_gl(2, a, nw) * dexp(kappa_l * single_en_distance(a,nw))
|
|
en_rescaled_single_gl(3, a, nw) = en_rescaled_single_gl(3, a, nw) * dexp(kappa_l * single_en_distance(a,nw))
|
|
en_rescaled_single_gl(4, a, nw) = en_rescaled_single_gl(4, a, nw) * dexp(kappa_l * single_en_distance(a,nw))
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_en_rescaled_single_gl_doc_f</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div id="outline-container-org97e6ae7" class="outline-3">
|
|
<h3 id="org97e6ae7"><span class="section-number-3">7.4.</span> Electron-nucleus Jastrow gradients and Laplacian</h3>
|
|
<div class="outline-text-3" id="text-7-4">
|
|
<p>
|
|
Calculate the gradients and Laplacian of the \(\delta J_{en}\).
|
|
</p>
|
|
\begin{eqnarray*}
|
|
\partial_{i,m}\delta J_{en} = & \sum_\alpha \delta_{i,\text{num}} \left( \frac{a_1 \partial_{i,m}\widetilde{R}^{\text{new}}_{i\alpha}}{(1+a_2 \widetilde{R}^{\text{new}}_{i\alpha})^2} - \frac{a_1 \partial_{i,m}\widetilde{R}^{\text{old}}_{i\alpha}}{(1+a_2 \widetilde{R}^{\text{old}}_{i\alpha})^2} + \sum_{k=2}^{N_{\text{aord}}} a_k k \left({\widetilde{R}_{i\alpha}^{\text{new}}}^{k-1} \partial_{i,m}\widetilde{R}^{\text{new}}_{i\alpha} - {\widetilde{R}_{i\alpha}^{\text{old}}}^{k-1} \partial_{i,m}\widetilde{R}^{\text{old}}_{i\alpha} \right) \right)\\
|
|
\partial_{i,4}\delta J_{en} = & \sum_\alpha \delta_{i,\text{num}} \left( \frac{a_1}{(1+a_2 \widetilde{R}^{\text{new}}_{i\alpha})^2} \left(\partial_{i,4}\widetilde{R}^{\text{new}}_{i\alpha} - 2 a_2 \frac{\nabla\widetilde{R}^{\text{new}}_{i\alpha} \cdot \nabla \widetilde{R}^{\text{new}}_{i\alpha}}{1+a_2 \widetilde{R}^{\text{new}}_{i\alpha}} \right) - \frac{a_1}{(1+a_2 \widetilde{R}^{\text{old}}_{i\alpha})^2} \left(\partial_{i,4}\widetilde{R}^{\text{old}}_{i\alpha} - 2 a_2 \frac{\nabla\widetilde{R}^{\text{old}}_{i\alpha} \cdot \nabla \widetilde{R}^{\text{old}}_{i\alpha}}{1+b_2 \widetilde{R}^{\text{old}}_{i\alpha}} \right) \right.\\
|
|
& \left.+ \sum_{k=2}^{N_{\text{aord}}} a_k k \left({\widetilde{R}_{i\alpha}^{\text{new}}}^{k-1}\partial_{i,4}\widetilde{R}_{i\alpha}^{\text{new}} + (k-1)(\nabla\widetilde{R}_{i\alpha}^{\text{new}} \cdot \nabla \widetilde{R}_{i\alpha}^{\text{new}}) {\widetilde{R}_{i\alpha}^{\text{new}}}^{k-2} - {\widetilde{R}_{i\alpha}^{\text{old}}}^{k-1}\partial_{i,4}\widetilde{R}_{i\alpha}^{\text{old}} - (k-1)(\nabla\widetilde{R}_{i\alpha}^{\text{old}} \cdot \nabla \widetilde{R}_{i\alpha}^{\text{old}}) {\widetilde{R}_{i\alpha}^{\text{old}}}^{k-2} \right) \right)
|
|
\end{eqnarray*}
|
|
</div>
|
|
|
|
<div id="outline-container-orgb4a13cf" class="outline-4">
|
|
<h4 id="orgb4a13cf"><span class="section-number-4">7.4.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-7-4-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_jastrow_champ_single_en_gl</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">delta_en_gl</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_get_jastrow_champ_single_en_gl</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> delta_en_gl, size_max) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">import</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span> (qmckl_context) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>), <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_en_gl(size_max)</span>
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_jastrow_champ_single_en_gl</span>
|
|
<span style="color: #a020f0;">end interface</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orge222f69" class="outline-4">
|
|
<h4 id="orge222f69"><span class="section-number-4">7.4.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-7-4-2">
|
|
<table id="org8fff533" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Index of single electron</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of unique nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_vector</code></td>
|
|
<td class="org-left"><code>int64_t[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">IDs of unique nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>aord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of coefficients</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>a_vector</code></td>
|
|
<td class="org-left"><code>double[type_nucl_num][aord_num+1]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">List of coefficients</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_distance_rescaled</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_distance_rescaled_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num][elec_num][4]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distance derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_rescaled_single</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled single distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_rescaled_single_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num][4]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled single distance derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>delta_en_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][elec_num][4]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Single electron-nucleus Jastrow gradients and Laplacian</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_single_en_gl_doc</span>( <span style="color: #a020f0;">&</span>
|
|
context, num_in, walk_num, elec_num, nucl_num, type_nucl_num, <span style="color: #a020f0;">&</span>
|
|
type_nucl_vector, aord_num, a_vector, <span style="color: #a020f0;">&</span>
|
|
en_distance_rescaled, en_distance_rescaled_gl, en_rescaled_single, en_rescaled_single_gl, delta_en_gl) <span style="color: #a020f0;">&</span>
|
|
<span style="color: #a020f0;">bind</span>(C) <span style="color: #a020f0;">result</span>(info)
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
|
|
<span style="color: #228b22;">integer</span> (qmckl_context), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> nucl_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> type_nucl_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> type_nucl_vector(nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> aord_num</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> a_vector(aord_num+1,type_nucl_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_distance_rescaled(elec_num,nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_distance_rescaled_gl(4, elec_num,nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_rescaled_single(nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_rescaled_single_gl(4, nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> delta_en_gl(4,elec_num,walk_num)</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, k, nw, ii, num</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, x1, kf, x_old, x1_old</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> denom, invdenom, invdenom2, f</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> denom_old, invdenom_old, invdenom2_old, f_old</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> grad_c2, grad_c2_old</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> dx(4), dx_old(4)</span>
|
|
|
|
num = num_in + 1
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 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 <= 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 <= 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 < 0) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_ARG_8
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
|
|
<span style="color: #a020f0;">do</span> nw =1, walk_num
|
|
delta_en_gl(:,:,nw) = 0.0d0
|
|
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
|
|
x_old = en_distance_rescaled(num,a,nw)
|
|
x = en_rescaled_single(a,nw)
|
|
|
|
|
|
denom = 1.0d0 + a_vector(2, type_nucl_vector(a)+1) * x
|
|
invdenom = 1.0d0 / denom
|
|
invdenom2 = invdenom*invdenom
|
|
|
|
denom_old = 1.0d0 + a_vector(2, type_nucl_vector(a)+1) * x_old
|
|
invdenom_old = 1.0d0 / denom_old
|
|
invdenom2_old = invdenom_old*invdenom_old
|
|
|
|
dx(1) = en_rescaled_single_gl(1,a,nw)
|
|
dx(2) = en_rescaled_single_gl(2,a,nw)
|
|
dx(3) = en_rescaled_single_gl(3,a,nw)
|
|
dx(4) = en_rescaled_single_gl(4,a,nw)
|
|
|
|
dx_old(1) = en_distance_rescaled_gl(1,num,a,nw)
|
|
dx_old(2) = en_distance_rescaled_gl(2,num,a,nw)
|
|
dx_old(3) = en_distance_rescaled_gl(3,num,a,nw)
|
|
dx_old(4) = en_distance_rescaled_gl(4,num,a,nw)
|
|
|
|
f = a_vector(1, type_nucl_vector(a)+1) * invdenom2
|
|
grad_c2 = dx(1)*dx(1) + dx(2)*dx(2) + dx(3)*dx(3)
|
|
|
|
f_old = a_vector(1, type_nucl_vector(a)+1) * invdenom2_old
|
|
grad_c2_old = dx_old(1)*dx_old(1) + dx_old(2)*dx_old(2) + dx_old(3)*dx_old(3)
|
|
|
|
delta_en_gl(1,num,nw) = delta_en_gl(1,num,nw) + f * dx(1) - f_old * dx_old(1)
|
|
delta_en_gl(2,num,nw) = delta_en_gl(2,num,nw) + f * dx(2) - f_old * dx_old(2)
|
|
delta_en_gl(3,num,nw) = delta_en_gl(3,num,nw) + f * dx(3) - f_old * dx_old(3)
|
|
delta_en_gl(4,num,nw) = delta_en_gl(4,num,nw) <span style="color: #a020f0;">&</span>
|
|
+ f * (dx(4) - 2.d0 * a_vector(2, type_nucl_vector(a)+1) * grad_c2 * invdenom) <span style="color: #a020f0;">&</span>
|
|
- f_old * (dx_old(4) - 2.d0 * a_vector(2, type_nucl_vector(a)+1) * grad_c2_old * invdenom_old)
|
|
|
|
|
|
kf = 2.d0
|
|
x1 = x
|
|
x = 1.d0
|
|
x1_old = x_old
|
|
x_old = 1.d0
|
|
<span style="color: #a020f0;">do</span> k=2, aord_num
|
|
f = a_vector(k+1,type_nucl_vector(a)+1) * kf * x
|
|
f_old = a_vector(k+1,type_nucl_vector(a)+1) * kf * x_old
|
|
delta_en_gl(1,num,nw) = delta_en_gl(1,num,nw) + f * x1 * dx(1) - f_old * x1_old * dx_old(1)
|
|
delta_en_gl(2,num,nw) = delta_en_gl(2,num,nw) + f * x1 * dx(2) - f_old * x1_old * dx_old(2)
|
|
delta_en_gl(3,num,nw) = delta_en_gl(3,num,nw) + f * x1 * dx(3) - f_old * x1_old * dx_old(3)
|
|
delta_en_gl(4,num,nw) = delta_en_gl(4,num,nw) <span style="color: #a020f0;">&</span>
|
|
+ f * (x1 * dx(4) + (kf-1.d0) * grad_c2) <span style="color: #a020f0;">&</span>
|
|
- f_old * (x1_old * dx_old(4) + (kf-1.d0) * grad_c2_old)
|
|
x = x*x1
|
|
x_old = x_old*x1_old
|
|
kf = kf + 1.d0
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_jastrow_champ_single_en_gl_doc</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orge57cc8d" class="outline-2">
|
|
<h2 id="orge57cc8d"><span class="section-number-2">8.</span> Accept single electron move</h2>
|
|
<div class="outline-text-2" id="text-8">
|
|
<p>
|
|
This function 'accepts' a proposed single-electron move. It overrides (or adds to) the required arrays and matrices to bring the positions of the electron and the full Jastrow factor up to date.
|
|
For instances,
|
|
</p>
|
|
\begin{eqnarray}
|
|
J_{en} = & J_{en} + \delta J_{en}\\
|
|
J_{ee} = & J_{ee} + \delta J_{ee}\\
|
|
J_{een} = & J_{een} + \delta J_{een}\\
|
|
|
|
\partial_{i,m} J_{en} = & \partial_{i,m} J_{en} + \partial_{i,m} \delta J_{en}\\
|
|
\partial_{i,m} J_{ee} = & \partial_{i,m} J_{ee} + \partial_{i,m} \delta J_{ee}\\
|
|
\partial_{i,m} J_{een} = & \partial_{i,m} J_{een} + \partial_{i,m} \delta J_{een}\\
|
|
|
|
\end{eqnarray}
|
|
<p>
|
|
The function has similar functionaly for the intermediate products, such as \(P\), \(\widetilde{r}\), \(\widetilde{R}\), and the derivative of these.
|
|
Furthermore, it also updates the dates, such that immidiatly calling a Jastrow function after an accepted single-electron move will not trigger a re-calculation of the Jastrow factors.
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org7a55cff" class="outline-3">
|
|
<h3 id="org7a55cff"><span class="section-number-3">8.1.</span> Code</h3>
|
|
<div class="outline-text-3" id="text-8-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_jastrow_champ_single_accept</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_jastrow_champ_single_accept</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>)
|
|
{
|
|
|
|
<span style="color: #a020f0;">if</span> (qmckl_context_check(context) == QMCKL_NULL_CONTEXT) {
|
|
<span style="color: #a020f0;">return</span> QMCKL_NULL_CONTEXT;
|
|
}
|
|
|
|
<span style="color: #228b22;">qmckl_context_struct</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">ctx</span> = (<span style="color: #228b22;">qmckl_context_struct</span>*) context;
|
|
assert (ctx != <span style="color: #008b8b;">NULL</span>);
|
|
|
|
<span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #a0522d;">rc</span>;
|
|
|
|
rc = qmckl_provide_jastrow_champ_single_en_gl(context);
|
|
<span style="color: #a020f0;">if</span> (rc != QMCKL_SUCCESS) <span style="color: #a020f0;">return</span> rc;
|
|
|
|
rc = qmckl_provide_jastrow_champ_single_ee_gl(context);
|
|
<span style="color: #a020f0;">if</span> (rc != QMCKL_SUCCESS) <span style="color: #a020f0;">return</span> rc;
|
|
|
|
<span style="color: #a020f0;">if</span> (ctx->jastrow_champ.cord_num > 0) {
|
|
rc = qmckl_provide_jastrow_champ_single_een_gl(context);
|
|
<span style="color: #a020f0;">if</span> (rc != QMCKL_SUCCESS) <span style="color: #a020f0;">return</span> rc;
|
|
}
|
|
|
|
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">metric</span>[4] = {-1.0, -1.0, -1.0, 1.0};
|
|
|
|
<span style="color: #228b22;">int</span> <span style="color: #a0522d;">shift1</span>, <span style="color: #a0522d;">shift2</span>, <span style="color: #a0522d;">shift3</span>, <span style="color: #a0522d;">shift4</span>, <span style="color: #a0522d;">shift5</span>, <span style="color: #a0522d;">shift6</span>, <span style="color: #a0522d;">shift7</span>;
|
|
|
|
<span style="color: #228b22;">int</span> <span style="color: #a0522d;">shift8</span>, <span style="color: #a0522d;">shift9</span>, <span style="color: #a0522d;">shift10</span>, <span style="color: #a0522d;">shift11</span>, <span style="color: #a0522d;">shift12</span>, <span style="color: #a0522d;">shift13</span>, <span style="color: #a0522d;">shift14</span>;
|
|
|
|
shift2 = ctx->electron.num*ctx->electron.num;
|
|
shift5 = ctx->electron.num*4*ctx->electron.num;
|
|
shift6 = ctx->electron.num*4;
|
|
shift11 = ctx->nucleus.num*4*ctx->electron.num;
|
|
shift13 = ctx->nucleus.num*4;
|
|
shift14 = ctx->nucleus.num*ctx->electron.num;
|
|
|
|
|
|
<span style="color: #a020f0;">if</span> (ctx->jastrow_champ.cord_num > 0) {
|
|
|
|
shift1 = (ctx->jastrow_champ.cord_num+1)*ctx->electron.num*ctx->electron.num;
|
|
|
|
shift3 = (ctx->jastrow_champ.cord_num+1)*ctx->electron.num;
|
|
|
|
shift4 = (ctx->jastrow_champ.cord_num+1)*ctx->electron.num*4*ctx->electron.num;
|
|
|
|
shift7 = (ctx->jastrow_champ.cord_num+1)*ctx->electron.num*4;
|
|
|
|
shift8 = (ctx->jastrow_champ.cord_num+1)*ctx->nucleus.num*ctx->electron.num;
|
|
shift9 = (ctx->jastrow_champ.cord_num+1)*ctx->nucleus.num;
|
|
|
|
shift10 = (ctx->jastrow_champ.cord_num+1)*ctx->nucleus.num*4*ctx->electron.num;
|
|
|
|
shift12 = (ctx->jastrow_champ.cord_num+1)*ctx->nucleus.num*4;
|
|
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">nw</span> = 0; nw < ctx->electron.walker.num; nw++) {
|
|
ctx->jastrow_champ.factor_een[nw] = ctx->jastrow_champ.factor_een[nw] + ctx->single_point.delta_een[nw];
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">l</span> = 0; l <= ctx->jastrow_champ.cord_num; l++){
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i < ctx->electron.num; i++) {
|
|
ctx->jastrow_champ.een_rescaled_e[nw*shift1
|
|
+ l*shift2
|
|
+ i*ctx->electron.num
|
|
+ ctx->single_point.num] =
|
|
ctx->single_point.een_rescaled_single_e[nw*shift3
|
|
+ l*ctx->electron.num
|
|
+ i];
|
|
|
|
ctx->jastrow_champ.een_rescaled_e[nw*shift1
|
|
+ l*shift2
|
|
+ ctx->single_point.num*ctx->electron.num
|
|
+ i] =
|
|
ctx->single_point.een_rescaled_single_e[nw*shift3
|
|
+ l*ctx->electron.num
|
|
+ i];
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">k</span> = 0; k < 4; k++){
|
|
ctx->jastrow_champ.een_rescaled_e_gl[nw*shift4
|
|
+ l*shift5
|
|
+ i*shift6
|
|
+ k*ctx->electron.num
|
|
+ ctx->single_point.num] =
|
|
ctx->single_point.een_rescaled_single_e_gl[nw*shift7
|
|
+ l*shift6
|
|
+ i*4
|
|
+ k];
|
|
ctx->jastrow_champ.een_rescaled_e_gl[nw*shift4
|
|
+ l*shift5
|
|
+ ctx->single_point.num*shift6
|
|
+ k*ctx->electron.num
|
|
+ i] =
|
|
metric[k] * ctx->single_point.een_rescaled_single_e_gl[nw*shift7
|
|
+ l*shift6
|
|
+ i*4
|
|
+ k];
|
|
}
|
|
}
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">a</span> = 0; a < ctx->nucleus.num; a++){
|
|
ctx->jastrow_champ.een_rescaled_n[nw*shift8
|
|
+ l*shift14
|
|
+ a*ctx->electron.num
|
|
+ ctx->single_point.num] =
|
|
ctx->single_point.een_rescaled_single_n[nw*shift9
|
|
+ l*ctx->nucleus.num
|
|
+ a];
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">k</span> = 0; k < 4; k++){
|
|
ctx->jastrow_champ.een_rescaled_n_gl[nw*shift10
|
|
+ l*shift11
|
|
+ a*shift6
|
|
+ k*ctx->electron.num
|
|
+ ctx->single_point.num] =
|
|
ctx->single_point.een_rescaled_single_n_gl[nw*shift12
|
|
+ l*shift13
|
|
+ a*4
|
|
+ k];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i < ctx->electron.walker.num * 4 * ctx->electron.num; i++) {
|
|
ctx->jastrow_champ.factor_een_gl[i] = ctx->jastrow_champ.factor_een_gl[i] + ctx->single_point.delta_een_gl[i];
|
|
}
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i < (ctx->electron.walker.num*(ctx->jastrow_champ.cord_num+1)*ctx->nucleus.num*ctx->electron.num*ctx->jastrow_champ.cord_num); i++) {
|
|
ctx->jastrow_champ.tmp_c[i] = ctx->jastrow_champ.tmp_c[i] + ctx->single_point.delta_p[i];
|
|
}
|
|
|
|
/*
|
|
<span style="color: #b22222;"> for (int nw = 0; nw < ctx->electron.walker.num; nw++) {</span>
|
|
<span style="color: #b22222;"> for (int m = 0; m < ctx->jastrow_champ.cord_num; m++){</span>
|
|
<span style="color: #b22222;"> for (int l = 0; l <= ctx->jastrow_champ.cord_num; l++) {</span>
|
|
<span style="color: #b22222;"> for (int a = 0; a < ctx->nucleus.num; a++) {</span>
|
|
<span style="color: #b22222;"> for (int k = 0; k < 4; k++){</span>
|
|
<span style="color: #b22222;"> for (int i = 0; i < ctx->electron.num; i++) {</span>
|
|
<span style="color: #b22222;"> ctx->jastrow_champ.dtmp_c[nw*ctx->electron.num*4*ctx->nucleus.num*ctx->jastrow_champ.cord_num*(ctx->jastrow_champ.cord_num+1)</span>
|
|
<span style="color: #b22222;"> + m*ctx->electron.num*4*ctx->nucleus.num*(ctx->jastrow_champ.cord_num+1)</span>
|
|
<span style="color: #b22222;"> + l*ctx->electron.num*4*ctx->nucleus.num</span>
|
|
<span style="color: #b22222;"> + a*4*ctx->electron.num</span>
|
|
<span style="color: #b22222;"> + k*ctx->electron.num</span>
|
|
<span style="color: #b22222;"> + i] =</span>
|
|
<span style="color: #b22222;"> ctx->jastrow_champ.dtmp_c[nw*ctx->electron.num*4*ctx->nucleus.num*ctx->jastrow_champ.cord_num*(ctx->jastrow_champ.cord_num+1)</span>
|
|
<span style="color: #b22222;"> + m*ctx->electron.num*4*ctx->nucleus.num*(ctx->jastrow_champ.cord_num+1)</span>
|
|
<span style="color: #b22222;"> + l*ctx->electron.num*4*ctx->nucleus.num</span>
|
|
<span style="color: #b22222;"> + a*4*ctx->electron.num</span>
|
|
<span style="color: #b22222;"> + k*ctx->electron.num</span>
|
|
<span style="color: #b22222;"> + i] +</span>
|
|
<span style="color: #b22222;"> ctx->single_point.delta_p_gl[nw*ctx->electron.num*4*ctx->nucleus.num*ctx->jastrow_champ.cord_num*(ctx->jastrow_champ.cord_num+1)</span>
|
|
<span style="color: #b22222;"> + m*ctx->electron.num*4*ctx->nucleus.num*(ctx->jastrow_champ.cord_num+1)</span>
|
|
<span style="color: #b22222;"> + l*ctx->electron.num*4*ctx->nucleus.num</span>
|
|
<span style="color: #b22222;"> + k*ctx->electron.num*ctx->nucleus.num</span>
|
|
<span style="color: #b22222;"> + a*ctx->electron.num</span>
|
|
<span style="color: #b22222;"> + i];</span>
|
|
<span style="color: #b22222;"> }</span>
|
|
<span style="color: #b22222;"> }</span>
|
|
<span style="color: #b22222;"> }</span>
|
|
<span style="color: #b22222;"> }</span>
|
|
<span style="color: #b22222;"> }</span>
|
|
<span style="color: #b22222;"> }</span>
|
|
|
|
*/
|
|
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">nw</span> = 0; nw < ctx->electron.walker.num*(ctx->jastrow_champ.cord_num+1)*ctx->jastrow_champ.cord_num; nw++) {
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">a</span> = 0; a < ctx->nucleus.num; a++) {
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">k</span> = 0; k < 4; k++){
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i < ctx->electron.num; i++) {
|
|
ctx->jastrow_champ.dtmp_c[nw*shift11
|
|
+ a*shift6
|
|
+ k*ctx->electron.num
|
|
+ i] =
|
|
ctx->jastrow_champ.dtmp_c[nw*shift11
|
|
+ a*shift6
|
|
+ k*ctx->electron.num
|
|
+ i] +
|
|
ctx->single_point.delta_p_gl[nw*shift11
|
|
+ k*shift14
|
|
+ a*ctx->electron.num
|
|
+ i];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">nw</span> = 0; nw < ctx->electron.walker.num; nw++) {
|
|
ctx->jastrow_champ.factor_en[nw] = ctx->jastrow_champ.factor_en[nw] + ctx->single_point.delta_en[nw];
|
|
ctx->jastrow_champ.factor_ee[nw] = ctx->jastrow_champ.factor_ee[nw] + ctx->single_point.delta_ee[nw];
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">a</span> = 0; a < ctx->nucleus.num; a++) {
|
|
ctx->electron.en_distance[nw*shift14
|
|
+ ctx->single_point.num*ctx->nucleus.num
|
|
+ a] =
|
|
ctx->single_point.single_en_distance[nw*ctx->nucleus.num
|
|
+ a];
|
|
|
|
ctx->jastrow_champ.en_distance_rescaled[nw*shift14
|
|
+ a*ctx->electron.num
|
|
+ ctx->single_point.num] =
|
|
ctx->single_point.en_rescaled_single[nw*ctx->nucleus.num
|
|
+ a];
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">k</span> = 0; k < 4; k++){
|
|
ctx->jastrow_champ.en_distance_rescaled_gl[nw*shift11
|
|
+ a*shift6
|
|
+ ctx->single_point.num*4
|
|
+ k] =
|
|
ctx->single_point.en_rescaled_single_gl[nw*shift13
|
|
+ a*4
|
|
+ k];
|
|
}
|
|
}
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i < ctx->electron.num; i++) {
|
|
ctx->jastrow_champ.ee_distance_rescaled[nw*shift2
|
|
+ i*ctx->electron.num
|
|
+ ctx->single_point.num] =
|
|
ctx->single_point.ee_rescaled_single[nw*ctx->electron.num
|
|
+ i];
|
|
|
|
ctx->jastrow_champ.ee_distance_rescaled[nw*shift2
|
|
+ ctx->single_point.num*ctx->electron.num
|
|
+ i] =
|
|
ctx->single_point.ee_rescaled_single[nw*ctx->electron.num
|
|
+ i];
|
|
|
|
ctx->electron.ee_distance[nw*shift2
|
|
+ i*ctx->electron.num
|
|
+ ctx->single_point.num] =
|
|
ctx->single_point.single_ee_distance[nw*ctx->electron.num
|
|
+ i];
|
|
|
|
ctx->electron.ee_distance[nw*shift2
|
|
+ ctx->single_point.num*ctx->electron.num
|
|
+ i] =
|
|
ctx->single_point.single_ee_distance[nw*ctx->electron.num
|
|
+ i];
|
|
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">k</span> = 0; k < 4; k++){
|
|
ctx->jastrow_champ.ee_distance_rescaled_gl[nw*shift5
|
|
+ i*shift6
|
|
+ ctx->single_point.num*4
|
|
+ k] =
|
|
metric[k] * ctx->single_point.ee_rescaled_single_gl[nw*shift6
|
|
+ i*4
|
|
+ k];
|
|
ctx->jastrow_champ.ee_distance_rescaled_gl[nw*shift5
|
|
+ ctx->single_point.num*shift6
|
|
+ i*4
|
|
+ k] =
|
|
ctx->single_point.ee_rescaled_single_gl[nw*shift6
|
|
+ i*4
|
|
+ k];
|
|
}
|
|
}
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">k</span> = 0; k < 4; k++){
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i < ctx->electron.num; i++) {
|
|
|
|
ctx->jastrow_champ.factor_ee_gl[nw*shift6
|
|
+ k*ctx->electron.num
|
|
+ i] =
|
|
ctx->jastrow_champ.factor_ee_gl[nw*shift6
|
|
+ k*ctx->electron.num
|
|
+ i] +
|
|
ctx->single_point.delta_ee_gl[nw*shift6
|
|
+ i*4
|
|
+ k];
|
|
|
|
ctx->jastrow_champ.factor_en_gl[nw*shift6
|
|
+ k*ctx->electron.num
|
|
+ i] =
|
|
ctx->jastrow_champ.factor_en_gl[nw*shift6
|
|
+ k*ctx->electron.num
|
|
+ i] +
|
|
ctx->single_point.delta_en_gl[nw*shift6
|
|
+ i*4
|
|
+ k];
|
|
}
|
|
}
|
|
}
|
|
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">nw</span> = 0; nw < ctx->electron.walker.num; nw++) {
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">k</span> = 0; k < 3; k++) {
|
|
ctx->point.coord.data[k*ctx->electron.walker.num*ctx->electron.num + nw*ctx->electron.num + ctx->single_point.num] = ctx->single_point.coord.data[nw*3 + k];
|
|
}
|
|
}
|
|
|
|
rc = qmckl_context_touch(context);
|
|
<span style="color: #a020f0;">if</span> (rc != QMCKL_SUCCESS) <span style="color: #a020f0;">return</span> rc;
|
|
|
|
|
|
<span style="color: #a020f0;">if</span> (ctx->jastrow_champ.cord_num > 0){
|
|
ctx->jastrow_champ.dtmp_c_date = ctx->date;
|
|
ctx->jastrow_champ.een_rescaled_e_date = ctx->date;
|
|
ctx->jastrow_champ.een_rescaled_e_gl_date = ctx->date;
|
|
ctx->jastrow_champ.een_rescaled_n_date = ctx->date;
|
|
ctx->jastrow_champ.een_rescaled_n_gl_date = ctx->date;
|
|
ctx->jastrow_champ.factor_een_date = ctx->date;
|
|
ctx->jastrow_champ.factor_een_gl_date = ctx->date;
|
|
ctx->jastrow_champ.tmp_c_date = ctx->date;
|
|
|
|
}
|
|
ctx->jastrow_champ.ee_distance_rescaled_date = ctx->date;
|
|
ctx->jastrow_champ.ee_distance_rescaled_gl_date = ctx->date;
|
|
ctx->jastrow_champ.en_distance_rescaled_date = ctx->date;
|
|
ctx->jastrow_champ.en_distance_rescaled_gl_date = ctx->date;
|
|
ctx->jastrow_champ.factor_ee_date = ctx->date;
|
|
ctx->jastrow_champ.factor_ee_gl_date = ctx->date;
|
|
ctx->jastrow_champ.factor_en_date = ctx->date;
|
|
ctx->jastrow_champ.factor_en_gl_date = ctx->date;
|
|
|
|
ctx->electron.ee_distance_date = ctx->date;
|
|
ctx->electron.en_distance_date = ctx->date;
|
|
|
|
ctx->single_point.date = ctx->date;
|
|
|
|
<span style="color: #a020f0;">if</span> (ctx->jastrow_champ.cord_num > 0){
|
|
ctx->single_point.een_rescaled_single_e_date = ctx->single_point.date;
|
|
ctx->single_point.een_rescaled_single_n_date = ctx->single_point.date;
|
|
ctx->single_point.delta_een_date = ctx->single_point.date;
|
|
ctx->single_point.delta_p_date = ctx->single_point.date;
|
|
ctx->single_point.een_rescaled_single_e_gl_date = ctx->single_point.date;
|
|
ctx->single_point.een_rescaled_single_n_gl_date = ctx->single_point.date;
|
|
ctx->single_point.delta_p_gl_date = ctx->single_point.date;
|
|
ctx->single_point.delta_een_gl_date = ctx->single_point.date;
|
|
ctx->single_point.delta_p_g_date = ctx->single_point.date;
|
|
ctx->single_point.delta_een_g_date = ctx->single_point.date;
|
|
ctx->forces.forces_delta_p_date = ctx->single_point.date;
|
|
ctx->forces.forces_jastrow_single_een_date = ctx->single_point.date;
|
|
}
|
|
ctx->single_point.single_ee_distance_date = ctx->single_point.date;
|
|
ctx->single_point.single_en_distance_date = ctx->single_point.date;
|
|
ctx->single_point.ee_rescaled_single_date = ctx->single_point.date;
|
|
ctx->single_point.en_rescaled_single_date = ctx->single_point.date;
|
|
ctx->single_point.delta_en_date = ctx->single_point.date;
|
|
ctx->single_point.delta_ee_date = ctx->single_point.date;
|
|
ctx->single_point.ee_rescaled_single_gl_date = ctx->single_point.date;
|
|
ctx->single_point.en_rescaled_single_gl_date = ctx->single_point.date;
|
|
ctx->single_point.delta_en_gl_date = ctx->single_point.date;
|
|
ctx->single_point.delta_ee_gl_date = ctx->single_point.date;
|
|
ctx->forces.forces_jastrow_single_en_date = ctx->single_point.date;
|
|
|
|
|
|
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
|
|
}
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code) <span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_get_jastrow_champ_single_accept</span> (context) <span style="color: #a020f0;">bind</span>(C)
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">import</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span> (qmckl_context) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_jastrow_champ_single_accept</span>
|
|
<span style="color: #a020f0;">end interface</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="postamble" class="status">
|
|
<p class="author">Author: TREX CoE</p>
|
|
<p class="date">Created: 2025-04-29 Tue 08:44</p>
|
|
<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
|
|
</div>
|
|
</body>
|
|
</html>
|