mirror of
https://github.com/TREX-CoE/qmckl.git
synced 2025-05-01 12:54:46 +02:00
4702 lines
267 KiB
HTML
4702 lines
267 KiB
HTML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
|
<head>
|
|
<!-- 2025-04-29 Tue 08:44 -->
|
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title>Forces</title>
|
|
<meta name="author" content="TREX CoE" />
|
|
<meta name="generator" content="Org Mode" />
|
|
<style>
|
|
#content { max-width: 60em; margin: auto; }
|
|
.title { text-align: center;
|
|
margin-bottom: .2em; }
|
|
.subtitle { text-align: center;
|
|
font-size: medium;
|
|
font-weight: bold;
|
|
margin-top:0; }
|
|
.todo { font-family: monospace; color: red; }
|
|
.done { font-family: monospace; color: green; }
|
|
.priority { font-family: monospace; color: orange; }
|
|
.tag { background-color: #eee; font-family: monospace;
|
|
padding: 2px; font-size: 80%; font-weight: normal; }
|
|
.timestamp { color: #bebebe; }
|
|
.timestamp-kwd { color: #5f9ea0; }
|
|
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
|
|
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
|
|
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
|
|
.underline { text-decoration: underline; }
|
|
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
|
|
p.verse { margin-left: 3%; }
|
|
pre {
|
|
border: 1px solid #e6e6e6;
|
|
border-radius: 3px;
|
|
background-color: #f2f2f2;
|
|
padding: 8pt;
|
|
font-family: monospace;
|
|
overflow: auto;
|
|
margin: 1.2em;
|
|
}
|
|
pre.src {
|
|
position: relative;
|
|
overflow: auto;
|
|
}
|
|
pre.src:before {
|
|
display: none;
|
|
position: absolute;
|
|
top: -8px;
|
|
right: 12px;
|
|
padding: 3px;
|
|
color: #555;
|
|
background-color: #f2f2f299;
|
|
}
|
|
pre.src:hover:before { display: inline; margin-top: 14px;}
|
|
/* Languages per Org manual */
|
|
pre.src-asymptote:before { content: 'Asymptote'; }
|
|
pre.src-awk:before { content: 'Awk'; }
|
|
pre.src-authinfo::before { content: 'Authinfo'; }
|
|
pre.src-C:before { content: 'C'; }
|
|
/* pre.src-C++ doesn't work in CSS */
|
|
pre.src-clojure:before { content: 'Clojure'; }
|
|
pre.src-css:before { content: 'CSS'; }
|
|
pre.src-D:before { content: 'D'; }
|
|
pre.src-ditaa:before { content: 'ditaa'; }
|
|
pre.src-dot:before { content: 'Graphviz'; }
|
|
pre.src-calc:before { content: 'Emacs Calc'; }
|
|
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
|
|
pre.src-fortran:before { content: 'Fortran'; }
|
|
pre.src-gnuplot:before { content: 'gnuplot'; }
|
|
pre.src-haskell:before { content: 'Haskell'; }
|
|
pre.src-hledger:before { content: 'hledger'; }
|
|
pre.src-java:before { content: 'Java'; }
|
|
pre.src-js:before { content: 'Javascript'; }
|
|
pre.src-latex:before { content: 'LaTeX'; }
|
|
pre.src-ledger:before { content: 'Ledger'; }
|
|
pre.src-lisp:before { content: 'Lisp'; }
|
|
pre.src-lilypond:before { content: 'Lilypond'; }
|
|
pre.src-lua:before { content: 'Lua'; }
|
|
pre.src-matlab:before { content: 'MATLAB'; }
|
|
pre.src-mscgen:before { content: 'Mscgen'; }
|
|
pre.src-ocaml:before { content: 'Objective Caml'; }
|
|
pre.src-octave:before { content: 'Octave'; }
|
|
pre.src-org:before { content: 'Org mode'; }
|
|
pre.src-oz:before { content: 'OZ'; }
|
|
pre.src-plantuml:before { content: 'Plantuml'; }
|
|
pre.src-processing:before { content: 'Processing.js'; }
|
|
pre.src-python:before { content: 'Python'; }
|
|
pre.src-R:before { content: 'R'; }
|
|
pre.src-ruby:before { content: 'Ruby'; }
|
|
pre.src-sass:before { content: 'Sass'; }
|
|
pre.src-scheme:before { content: 'Scheme'; }
|
|
pre.src-screen:before { content: 'Gnu Screen'; }
|
|
pre.src-sed:before { content: 'Sed'; }
|
|
pre.src-sh:before { content: 'shell'; }
|
|
pre.src-sql:before { content: 'SQL'; }
|
|
pre.src-sqlite:before { content: 'SQLite'; }
|
|
/* additional languages in org.el's org-babel-load-languages alist */
|
|
pre.src-forth:before { content: 'Forth'; }
|
|
pre.src-io:before { content: 'IO'; }
|
|
pre.src-J:before { content: 'J'; }
|
|
pre.src-makefile:before { content: 'Makefile'; }
|
|
pre.src-maxima:before { content: 'Maxima'; }
|
|
pre.src-perl:before { content: 'Perl'; }
|
|
pre.src-picolisp:before { content: 'Pico Lisp'; }
|
|
pre.src-scala:before { content: 'Scala'; }
|
|
pre.src-shell:before { content: 'Shell Script'; }
|
|
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
|
|
/* additional language identifiers per "defun org-babel-execute"
|
|
in ob-*.el */
|
|
pre.src-cpp:before { content: 'C++'; }
|
|
pre.src-abc:before { content: 'ABC'; }
|
|
pre.src-coq:before { content: 'Coq'; }
|
|
pre.src-groovy:before { content: 'Groovy'; }
|
|
/* additional language identifiers from org-babel-shell-names in
|
|
ob-shell.el: ob-shell is the only babel language using a lambda to put
|
|
the execution function name together. */
|
|
pre.src-bash:before { content: 'bash'; }
|
|
pre.src-csh:before { content: 'csh'; }
|
|
pre.src-ash:before { content: 'ash'; }
|
|
pre.src-dash:before { content: 'dash'; }
|
|
pre.src-ksh:before { content: 'ksh'; }
|
|
pre.src-mksh:before { content: 'mksh'; }
|
|
pre.src-posh:before { content: 'posh'; }
|
|
/* Additional Emacs modes also supported by the LaTeX listings package */
|
|
pre.src-ada:before { content: 'Ada'; }
|
|
pre.src-asm:before { content: 'Assembler'; }
|
|
pre.src-caml:before { content: 'Caml'; }
|
|
pre.src-delphi:before { content: 'Delphi'; }
|
|
pre.src-html:before { content: 'HTML'; }
|
|
pre.src-idl:before { content: 'IDL'; }
|
|
pre.src-mercury:before { content: 'Mercury'; }
|
|
pre.src-metapost:before { content: 'MetaPost'; }
|
|
pre.src-modula-2:before { content: 'Modula-2'; }
|
|
pre.src-pascal:before { content: 'Pascal'; }
|
|
pre.src-ps:before { content: 'PostScript'; }
|
|
pre.src-prolog:before { content: 'Prolog'; }
|
|
pre.src-simula:before { content: 'Simula'; }
|
|
pre.src-tcl:before { content: 'tcl'; }
|
|
pre.src-tex:before { content: 'TeX'; }
|
|
pre.src-plain-tex:before { content: 'Plain TeX'; }
|
|
pre.src-verilog:before { content: 'Verilog'; }
|
|
pre.src-vhdl:before { content: 'VHDL'; }
|
|
pre.src-xml:before { content: 'XML'; }
|
|
pre.src-nxml:before { content: 'XML'; }
|
|
/* add a generic configuration mode; LaTeX export needs an additional
|
|
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
|
|
pre.src-conf:before { content: 'Configuration File'; }
|
|
|
|
table { border-collapse:collapse; }
|
|
caption.t-above { caption-side: top; }
|
|
caption.t-bottom { caption-side: bottom; }
|
|
td, th { vertical-align:top; }
|
|
th.org-right { text-align: center; }
|
|
th.org-left { text-align: center; }
|
|
th.org-center { text-align: center; }
|
|
td.org-right { text-align: right; }
|
|
td.org-left { text-align: left; }
|
|
td.org-center { text-align: center; }
|
|
dt { font-weight: bold; }
|
|
.footpara { display: inline; }
|
|
.footdef { margin-bottom: 1em; }
|
|
.figure { padding: 1em; }
|
|
.figure p { text-align: center; }
|
|
.equation-container {
|
|
display: table;
|
|
text-align: center;
|
|
width: 100%;
|
|
}
|
|
.equation {
|
|
vertical-align: middle;
|
|
}
|
|
.equation-label {
|
|
display: table-cell;
|
|
text-align: right;
|
|
vertical-align: middle;
|
|
}
|
|
.inlinetask {
|
|
padding: 10px;
|
|
border: 2px solid gray;
|
|
margin: 10px;
|
|
background: #ffffcc;
|
|
}
|
|
#org-div-home-and-up
|
|
{ text-align: right; font-size: 70%; white-space: nowrap; }
|
|
textarea { overflow-x: auto; }
|
|
.linenr { font-size: smaller }
|
|
.code-highlighted { background-color: #ffff00; }
|
|
.org-info-js_info-navigation { border-style: none; }
|
|
#org-info-js_console-label
|
|
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
|
|
.org-info-js_search-highlight
|
|
{ background-color: #ffff00; color: #000000; font-weight: bold; }
|
|
.org-svg { }
|
|
</style>
|
|
<link rel="stylesheet" title="Standard" href="qmckl.css" type="text/css" />
|
|
|
|
<script src="org-info.js">
|
|
// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&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">Forces</h1>
|
|
<div id="table-of-contents" role="doc-toc">
|
|
<h2>Table of Contents</h2>
|
|
<div id="text-table-of-contents" role="doc-toc">
|
|
<ul>
|
|
<li><a href="#org47f554b">1. Introduction</a></li>
|
|
<li><a href="#orge8b694c">2. Context</a>
|
|
<ul>
|
|
<li><a href="#org8919d2f">2.1. Data structure</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org4fd236e">3. Finite-difference function</a></li>
|
|
<li><a href="#org114f4f1">4. Forces of the Jastrow function</a>
|
|
<ul>
|
|
<li><a href="#org595b30f">4.1. Electron-nucleus Jastrow</a>
|
|
<ul>
|
|
<li><a href="#org7286fd0">4.1.1. Force of electron-nucleus Jastrow value</a>
|
|
<ul>
|
|
<li><a href="#orgadf9483">4.1.1.1. Get</a></li>
|
|
<li><a href="#org602b80d">4.1.1.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgd6519a5">4.1.2. Force of electron-nucleus Jastrow gradient</a>
|
|
<ul>
|
|
<li><a href="#orgb48fadf">4.1.2.1. Get</a></li>
|
|
<li><a href="#org2ac9492">4.1.2.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgb580725">4.1.3. Force of electron-nucleus Jastrow Laplacian</a>
|
|
<ul>
|
|
<li><a href="#org2401312">4.1.3.1. Get</a></li>
|
|
<li><a href="#org4f0a529">4.1.3.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgc322296">4.1.4. Force of single electron-nucleus Jastrow value</a>
|
|
<ul>
|
|
<li><a href="#org2f9a044">4.1.4.1. Get</a></li>
|
|
<li><a href="#orgf001a60">4.1.4.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgf5dd455">4.2. Electron-electron-nucleus Jastrow</a>
|
|
<ul>
|
|
<li><a href="#orgd3d751d">4.2.1. Force of P matrix</a>
|
|
<ul>
|
|
<li><a href="#orgc9b5792">4.2.1.1. Get</a></li>
|
|
<li><a href="#org70f0661">4.2.1.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org6c17e6c">4.2.2. Force of derivative of the \(P\) matrix</a>
|
|
<ul>
|
|
<li><a href="#orgb69d90c">4.2.2.1. Get</a></li>
|
|
<li><a href="#org7210b06">4.2.2.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgce67295">4.2.3. Force of electron-electron-nucleus Jastrow value</a>
|
|
<ul>
|
|
<li><a href="#org5c39e4f">4.2.3.1. Get</a></li>
|
|
<li><a href="#org605a445">4.2.3.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgb7f6d8e">4.2.4. Force of derivatives of electron-nucleus rescaled distance</a>
|
|
<ul>
|
|
<li><a href="#org6c8f54e">4.2.4.1. Get</a></li>
|
|
<li><a href="#org73699b6">4.2.4.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orga958ca2">4.2.5. Force of electron-electron-nucleus Jastrow gradient</a>
|
|
<ul>
|
|
<li><a href="#org4373291">4.2.5.1. Get</a></li>
|
|
<li><a href="#org198f18d">4.2.5.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgdcc714e">4.2.6. Force of electron-electron-nucleus Jastrow Laplacian</a>
|
|
<ul>
|
|
<li><a href="#orgbe80245">4.2.6.1. Get</a></li>
|
|
<li><a href="#org209f6f0">4.2.6.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org399976b">4.2.7. Force of \(\delta P\) matrix</a>
|
|
<ul>
|
|
<li><a href="#orgd450d68">4.2.7.1. Get</a></li>
|
|
<li><a href="#org2643f21">4.2.7.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgb37c61b">4.2.8. Force of single electron-electron-nucleus Jastrow value</a>
|
|
<ul>
|
|
<li><a href="#orgcd33219">4.2.8.1. Get</a></li>
|
|
<li><a href="#org41a04d7">4.2.8.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org8c04d8b">5. Forces of the orbitals</a>
|
|
<ul>
|
|
<li><a href="#org21630fb">5.1. Force of AO value</a>
|
|
<ul>
|
|
<li><a href="#org8280aab">5.1.1. Get</a></li>
|
|
<li><a href="#org224a093">5.1.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org0d71afb">5.2. Force of MO value</a>
|
|
<ul>
|
|
<li><a href="#orga011cc4">5.2.1. Get</a></li>
|
|
<li><a href="#org1ced40f">5.2.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#org68fe41e">5.3. Force of MO gradient</a>
|
|
<ul>
|
|
<li><a href="#orgfba1f64">5.3.1. Get</a></li>
|
|
<li><a href="#org380d151">5.3.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#orgae9357c">5.4. Force of MO Laplacian</a>
|
|
<ul>
|
|
<li><a href="#org1f3de9c">5.4.1. Get</a></li>
|
|
<li><a href="#org9fe509c">5.4.2. Compute</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org47f554b" class="outline-2">
|
|
<h2 id="org47f554b"><span class="section-number-2">1.</span> Introduction</h2>
|
|
<div class="outline-text-2" id="text-1">
|
|
<p>
|
|
To calculate interatomic forces, a derivative (with respect to nuclei) of the values, gradient and Laplacian of the Jastrow and the molecular orbitals (MO) is required.
|
|
Furthermore, for the nonlocal pseudopotential, also the forces of the values of the single-electron move Jastrows are required.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orge8b694c" class="outline-2">
|
|
<h2 id="orge8b694c"><span class="section-number-2">2.</span> Context</h2>
|
|
<div class="outline-text-2" id="text-2">
|
|
</div>
|
|
<div id="outline-container-org8919d2f" class="outline-3">
|
|
<h3 id="org8919d2f"><span class="section-number-3">2.1.</span> Data structure</h3>
|
|
<div class="outline-text-3" id="text-2-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #a020f0;">typedef</span> <span style="color: #a020f0;">struct</span> <span style="color: #228b22;">qmckl_forces_struct</span>{
|
|
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_jastrow_en</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_jastrow_en_date</span>;
|
|
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_jastrow_en_g</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_jastrow_en_g_date</span>;
|
|
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_jastrow_en_l</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_jastrow_en_l_date</span>;
|
|
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_tmp_c</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_tmp_c_date</span>;
|
|
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_dtmp_c</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_dtmp_c_date</span>;
|
|
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_een_n</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_een_n_date</span>;
|
|
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_jastrow_een</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_jastrow_een_date</span>;
|
|
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_jastrow_een_g</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_jastrow_een_g_date</span>;
|
|
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_jastrow_een_l</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_jastrow_een_l_date</span>;
|
|
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_ao_value</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_ao_value_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_ao_value_maxsize</span>;
|
|
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_mo_value</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_mo_value_date</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_mo_value_maxsize</span>;
|
|
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_mo_g</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_mo_g_date</span>;
|
|
<span style="color: #228b22;">double</span> * <span style="color: #a020f0;">restrict</span> <span style="color: #a0522d;">forces_mo_l</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_mo_l_date</span>;
|
|
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">forces_jastrow_single_en</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_jastrow_single_en_date</span>;
|
|
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">forces_jastrow_single_een</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_jastrow_single_een_date</span>;
|
|
<span style="color: #228b22;">double</span> * <span style="color: #a0522d;">forces_delta_p</span>;
|
|
<span style="color: #228b22;">uint64_t</span> <span style="color: #a0522d;">forces_delta_p_date</span>;
|
|
} <span style="color: #228b22;">qmckl_forces_struct</span>;
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org4fd236e" class="outline-2">
|
|
<h2 id="org4fd236e"><span class="section-number-2">3.</span> Finite-difference function</h2>
|
|
<div class="outline-text-2" id="text-3">
|
|
<p>
|
|
We introduce here a general function to compute the derivatives of any quantity with respect to nuclear coordinates.
|
|
using finite-differences.
|
|
</p>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-c">
|
|
<span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_finite_difference_deriv_n</span>(
|
|
<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span> <span style="color: #a0522d;">delta_x</span>,
|
|
<span style="color: #228b22;">function_callback</span> <span style="color: #a0522d;">get_function</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">derivative_output</span>,
|
|
<span style="color: #228b22;">int64_t</span> <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">size</span>)
|
|
{
|
|
// <span style="color: #b22222;">Finite difference coefficients for a 9-point stencil</span>
|
|
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">coef</span>[9] = { 1.0/280.0, -4.0/105.0, 1.0/5.0, -4.0/5.0, 0.0, 4.0/5.0, -1.0/5.0, 4.0/105.0, -1.0/280.0 };
|
|
|
|
<span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #a0522d;">rc</span>;
|
|
|
|
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span>;
|
|
rc = qmckl_get_electron_walk_num(context, &walk_num);
|
|
<span style="color: #a020f0;">if</span> (rc != QMCKL_SUCCESS) {
|
|
<span style="color: #a020f0;">return</span> rc;
|
|
}
|
|
|
|
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nucl_num</span>;
|
|
rc = qmckl_get_nucleus_num(context, &nucl_num);
|
|
<span style="color: #a020f0;">if</span> (rc != QMCKL_SUCCESS) {
|
|
<span style="color: #a020f0;">return</span> rc;
|
|
}
|
|
|
|
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">nucleus_coord</span> = (<span style="color: #228b22;">double</span>*) malloc(3 * nucl_num * <span style="color: #a020f0;">sizeof</span>(<span style="color: #228b22;">double</span>));
|
|
<span style="color: #a020f0;">if</span> (nucleus_coord == <span style="color: #008b8b;">NULL</span>) {
|
|
<span style="color: #a020f0;">return</span> QMCKL_ALLOCATION_FAILED;
|
|
}
|
|
rc = qmckl_get_nucleus_coord (context, <span style="color: #8b2252;">'N'</span>, nucleus_coord, 3*nucl_num);
|
|
|
|
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">temp_coord</span> = (<span style="color: #228b22;">double</span>*) malloc(3 * nucl_num * <span style="color: #a020f0;">sizeof</span>(<span style="color: #228b22;">double</span>));
|
|
<span style="color: #a020f0;">if</span> (temp_coord == <span style="color: #008b8b;">NULL</span>) {
|
|
free(nucleus_coord);
|
|
<span style="color: #a020f0;">return</span> QMCKL_ALLOCATION_FAILED;
|
|
}
|
|
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">function_values</span> = (<span style="color: #228b22;">double</span>*) malloc(walk_num*size * <span style="color: #a020f0;">sizeof</span>(<span style="color: #228b22;">double</span>));
|
|
<span style="color: #a020f0;">if</span> (function_values == <span style="color: #008b8b;">NULL</span>) {
|
|
free(nucleus_coord);
|
|
free(temp_coord);
|
|
<span style="color: #a020f0;">return</span> QMCKL_ALLOCATION_FAILED;
|
|
}
|
|
|
|
memset(derivative_output, 0, nucl_num*3*walk_num*size*<span style="color: #a020f0;">sizeof</span>(<span style="color: #228b22;">double</span>));
|
|
|
|
// <span style="color: #b22222;">Copy original coordinates</span>
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int</span> <span style="color: #a0522d;">i</span> = 0; i < 3 * nucl_num; i++) {
|
|
temp_coord[i] = nucleus_coord[i];
|
|
}
|
|
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">a</span> = 0; a < nucl_num; a++) {
|
|
<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;">m</span> = -4; m <= 4; m++) {
|
|
|
|
// <span style="color: #b22222;">Apply finite difference displacement</span>
|
|
temp_coord[k+a*3] = nucleus_coord[k+3*a] + (<span style="color: #228b22;">double</span>) <span style="color: #228b22;">m</span> * <span style="color: #a0522d;">delta_x</span>;
|
|
|
|
// <span style="color: #b22222;">Update coordinates in the context</span>
|
|
rc = qmckl_set_nucleus_coord(context, <span style="color: #8b2252;">'N'</span>, temp_coord, 3*nucl_num);
|
|
assert(rc == QMCKL_SUCCESS);
|
|
|
|
rc = qmckl_context_touch(context);
|
|
assert(rc == QMCKL_SUCCESS);
|
|
|
|
rc = qmckl_single_touch(context);
|
|
assert(rc == QMCKL_SUCCESS);
|
|
|
|
// <span style="color: #b22222;">Call the provided function</span>
|
|
rc = get_function(context, function_values, walk_num*size);
|
|
assert(rc == QMCKL_SUCCESS);
|
|
|
|
// <span style="color: #b22222;">Accumulate derivative using finite-difference coefficients</span>
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nw</span>=0 ; nw<walk_num ; nw++) {
|
|
<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">shift</span> = nucl_num*3*size*nw + size*(k + 3*a);
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">i</span> = 0; i < size; i++) {
|
|
derivative_output[i+shift] += coef[m + 4] * function_values[nw*size+i];
|
|
}
|
|
}
|
|
}
|
|
temp_coord[k+a*3] = nucleus_coord[k+3*a];
|
|
}
|
|
}
|
|
|
|
// <span style="color: #b22222;">Reset coordinates in the context</span>
|
|
rc = qmckl_set_nucleus_coord(context, <span style="color: #8b2252;">'N'</span>, temp_coord, 3*nucl_num);
|
|
assert(rc == QMCKL_SUCCESS);
|
|
|
|
rc = qmckl_context_touch(context);
|
|
assert(rc == QMCKL_SUCCESS);
|
|
|
|
// <span style="color: #b22222;">Normalize by the step size</span>
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">i</span> = 0; i < size*3*nucl_num*walk_num ; i++) {
|
|
derivative_output[i] /= delta_x;
|
|
}
|
|
|
|
free(nucleus_coord);
|
|
free(temp_coord);
|
|
free(function_values);
|
|
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
|
|
}
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org114f4f1" class="outline-2">
|
|
<h2 id="org114f4f1"><span class="section-number-2">4.</span> Forces of the Jastrow function</h2>
|
|
<div class="outline-text-2" id="text-4">
|
|
<p>
|
|
For the forces of the Jastrow function, there is only a contribution from the electron-nucleus and electron-electron-nucleus Jastrow, since the electron-electron Jastrow does not depend on nuclear coordinates.
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org595b30f" class="outline-3">
|
|
<h3 id="org595b30f"><span class="section-number-3">4.1.</span> Electron-nucleus Jastrow</h3>
|
|
<div class="outline-text-3" id="text-4-1">
|
|
</div>
|
|
<div id="outline-container-org7286fd0" class="outline-4">
|
|
<h4 id="org7286fd0"><span class="section-number-4">4.1.1.</span> Force of electron-nucleus Jastrow value</h4>
|
|
<div class="outline-text-4" id="text-4-1-1">
|
|
<p>
|
|
Calculates the force of the electron-nucleus Jastrow value.
|
|
The terms of the force of the electron-nucleus Jastrow value are identical to the gradient of this Jastrow, up to a minus sign.
|
|
\[
|
|
\partial_{\alpha,m} J_{en} = -\sum_i \left( \frac{a_1 \partial_{i,m} \widetilde{R}_{i\alpha}}{(1+a_2 \widetilde{R}_{i\alpha} )^2} + \sum_{k=2}^{N_\text{aord}} a_k k \widetilde{R}_{i\alpha}^{k-1} \partial_{i,m} \widetilde{R}_{i\alpha} \right)
|
|
\]
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-orgadf9483" class="outline-5">
|
|
<h5 id="orgadf9483"><span class="section-number-5">4.1.1.1.</span> Get</h5>
|
|
<div class="outline-text-5" id="text-4-1-1-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_forces_jastrow_en</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_jastrow_en</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_get_forces_jastrow_en</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> forces_jastrow_en, size_max) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">import</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span> (qmckl_context) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>), <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_jastrow_en(size_max)</span>
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_forces_jastrow_en</span>
|
|
<span style="color: #a020f0;">end interface</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org602b80d" class="outline-5">
|
|
<h5 id="org602b80d"><span class="section-number-5">4.1.1.2.</span> Compute</h5>
|
|
<div class="outline-text-5" id="text-4-1-1-2">
|
|
<table id="org2c6c58d" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of unique nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_vector</code></td>
|
|
<td class="org-left"><code>int64_t[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">IDs of unique nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>aord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of coefficients</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>a_vector</code></td>
|
|
<td class="org-left"><code>double[type_nucl_num][aord_num+1]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">List of coefficients</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_distance_rescaled</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_distance_rescaled_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num][elec_num][4]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus distance derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_jastrow_en</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num][3]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Electron-nucleus forces</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_en_doc</span>( <span style="color: #a020f0;">&</span>
|
|
context, 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, forces_jastrow_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;"> walk_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> nucl_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> type_nucl_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> type_nucl_vector(nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> aord_num</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> a_vector(aord_num+1,type_nucl_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_distance_rescaled(elec_num,nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_distance_rescaled_gl(4, elec_num,nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_jastrow_en(3,nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, k, nw, ii</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, x1, kf</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> denom, invdenom, invdenom2, f</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> dx(3)</span>
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 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> (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
|
|
forces_jastrow_en(:,:,nw) = 0.0d0
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
<span style="color: #a020f0;">do</span> i = 1, elec_num
|
|
|
|
x = en_distance_rescaled(i,a,nw)
|
|
<span style="color: #a020f0;">if</span>(<span style="color: #a020f0;">abs</span>(x) < 1.d-12) <span style="color: #a020f0;">continue</span>
|
|
|
|
denom = 1.0d0 + a_vector(2, type_nucl_vector(a)+1) * x
|
|
invdenom = 1.0d0 / denom
|
|
invdenom2 = invdenom*invdenom
|
|
|
|
dx(1) = -en_distance_rescaled_gl(1,i,a,nw)
|
|
dx(2) = -en_distance_rescaled_gl(2,i,a,nw)
|
|
dx(3) = -en_distance_rescaled_gl(3,i,a,nw)
|
|
|
|
f = a_vector(1, type_nucl_vector(a)+1) * invdenom2
|
|
|
|
forces_jastrow_en(1,a,nw) = forces_jastrow_en(1,a,nw) + f * dx(1)
|
|
forces_jastrow_en(2,a,nw) = forces_jastrow_en(2,a,nw) + f * dx(2)
|
|
forces_jastrow_en(3,a,nw) = forces_jastrow_en(3,a,nw) + f * dx(3)
|
|
|
|
|
|
kf = 2.d0
|
|
x1 = x
|
|
x = 1.d0
|
|
<span style="color: #a020f0;">do</span> k=2, aord_num
|
|
f = a_vector(k+1,type_nucl_vector(a)+1) * kf * x
|
|
forces_jastrow_en(1,a,nw) = forces_jastrow_en(1,a,nw) + f * x1 * dx(1)
|
|
forces_jastrow_en(2,a,nw) = forces_jastrow_en(2,a,nw) + f * x1 * dx(2)
|
|
forces_jastrow_en(3,a,nw) = forces_jastrow_en(3,a,nw) + f * x1 * dx(3)
|
|
x = x*x1
|
|
kf = kf + 1.d0
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_en_doc</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div id="outline-container-orgd6519a5" class="outline-4">
|
|
<h4 id="orgd6519a5"><span class="section-number-4">4.1.2.</span> Force of electron-nucleus Jastrow gradient</h4>
|
|
<div class="outline-text-4" id="text-4-1-2">
|
|
<p>
|
|
To avoid having to create new arrays for the Hessian of the rescaled distances, we compute parts of it manually in this routine.
|
|
</p>
|
|
\begin{eqnarray}
|
|
\partial_{\alpha,m} \partial_{i,n} J_{en} & = \frac{a_1 \partial_{\alpha,m} \partial_{i,n} \widetilde{R}_{i\alpha} }{(1+a_2 \widetilde{R}_{i\alpha})^2} - 2 \frac{a_1 a_2 \partial_{\alpha,m} \widetilde{R}_{i\alpha} \partial_{i,n} \widetilde{R}_{i\alpha}}{(1+a_2 \widetilde{R}_{i\alpha})^3} + \sum_{k=2}^{N_\text{aord}} a_k k \left((k-1) \widetilde{R}_{i\alpha}^{k-2} \partial_{\alpha,m} \widetilde{R}_{i\alpha} \partial_{i,n} \widetilde{R}_{i\alpha} + \widetilde{R}_{i\alpha}^{k-1} \partial_{\alpha,m}\partial_{i,n} \widetilde{R}_{i\alpha} \right) \\
|
|
& = -\frac{a_1 e^{-\kappa R_{i\alpha}}}{R_{i\alpha }(1+a_2 \widetilde{R}_{i\alpha})^2} + \frac{a_1 \partial_{i,m} \widetilde{R}_{i\alpha} \partial_{i,n} \widetilde{R}_{i\alpha} }{(1+a_2 \widetilde{R}_{i\alpha})^2}\left (\frac{e^{\kappa R_{i\alpha}}}{R_{i\alpha}} + \kappa e^{\kappa R_{i\alpha}} \right) + 2 \frac{a_1 a_2 \partial_{i,m} \widetilde{R}_{i\alpha} \partial_{i,n} \widetilde{R}_{i\alpha}}{(1+a_2 \widetilde{R}_{i\alpha})^3} \\
|
|
&- \sum_{k=2}^{N_\text{aord}} a_k k \left((k-1) \widetilde{R}_{i\alpha}^{k-2} \partial_{\alpha,m} \widetilde{R}_{i\alpha} \partial_{i,n} \widetilde{R}_{i\alpha} - \widetilde{R}_{i\alpha}^{k-1} \partial_{i,m}\widetilde{R}_{i\alpha}\partial_{i,n} \widetilde{R}_{i\alpha} e^{\kappa R_{i\alpha}} (\kappa + \frac{1}{R_{i\alpha}}) + \delta_{n,m} e^{-\kappa R_{i\alpha}}\frac{1}{R_{i\alpha}} \right)\\
|
|
\end{eqnarray}
|
|
</div>
|
|
|
|
<div id="outline-container-orgb48fadf" class="outline-5">
|
|
<h5 id="orgb48fadf"><span class="section-number-5">4.1.2.1.</span> Get</h5>
|
|
<div class="outline-text-5" id="text-4-1-2-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_forces_jastrow_en_g</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_jastrow_en_g</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_get_forces_jastrow_en_g</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> forces_jastrow_en_g, size_max) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">import</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span> (qmckl_context) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>), <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_jastrow_en_g(size_max)</span>
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_forces_jastrow_en_g</span>
|
|
<span style="color: #a020f0;">end interface</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org2ac9492" class="outline-5">
|
|
<h5 id="org2ac9492"><span class="section-number-5">4.1.2.2.</span> Compute</h5>
|
|
<div class="outline-text-5" id="text-4-1-2-2">
|
|
<table id="org6ddf5b3" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of unique nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_vector</code></td>
|
|
<td class="org-left"><code>int64_t[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">IDs of unique nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>aord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of coefficients</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>a_vector</code></td>
|
|
<td class="org-left"><code>double[type_nucl_num][aord_num+1]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">List of coefficients</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>rescale_factor_en</code></td>
|
|
<td class="org-left"><code>double[type_nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Rescale factor for electron-nucleus</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_distance</code></td>
|
|
<td class="org-left"><code>double[walk_num][elec_num][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_distance_rescaled</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_distance_rescaled_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num][elec_num][4]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus distance derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_jastrow_en_g</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num][3][elec_num][3]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Force of electron-nucleus gradient</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_en_g_doc</span>( <span style="color: #a020f0;">&</span>
|
|
context, walk_num, elec_num, nucl_num, type_nucl_num, <span style="color: #a020f0;">&</span>
|
|
type_nucl_vector, aord_num, a_vector, rescale_factor_en, en_distance, <span style="color: #a020f0;">&</span>
|
|
en_distance_rescaled, en_distance_rescaled_gl, forces_jastrow_en_g) <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;"> walk_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> nucl_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> type_nucl_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> type_nucl_vector(nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> aord_num</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> a_vector(aord_num+1,type_nucl_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> rescale_factor_en(type_nucl_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_distance(nucl_num,elec_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_distance_rescaled(elec_num,nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_distance_rescaled_gl(4, elec_num,nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_jastrow_en_g(3,elec_num,3,nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, k, nw, ii, m,l</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, x1, kf</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> denom, invdenom, invdenom2, f, f2, expk, invdist</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> dx(4)</span>
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 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> (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
|
|
forces_jastrow_en_g(:,:,:,:,nw) = 0.0d0
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
<span style="color: #a020f0;">do</span> i = 1, elec_num
|
|
expk = dexp(rescale_factor_en(type_nucl_vector(a)+1) * en_distance(a,i,nw))
|
|
invdist = 1.d0 / en_distance(a,i,nw)
|
|
x = en_distance_rescaled(i,a,nw)
|
|
<span style="color: #a020f0;">if</span>(<span style="color: #a020f0;">abs</span>(x) < 1.d-12) <span style="color: #a020f0;">continue</span>
|
|
denom = 1.0d0 + a_vector(2, type_nucl_vector(a)+1) * x
|
|
invdenom = 1.0d0 / denom
|
|
invdenom2 = invdenom*invdenom
|
|
f = a_vector(1, type_nucl_vector(a)+1) * invdenom2
|
|
|
|
<span style="color: #a020f0;">do</span> m = 1, 3
|
|
dx(m) = en_distance_rescaled_gl(m,i,a,nw)
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">do</span> m = 1, 3
|
|
<span style="color: #a020f0;">do</span> l = 1,3
|
|
<span style="color: #a020f0;">if</span> (m == l) <span style="color: #a020f0;">then</span>
|
|
forces_jastrow_en_g(m,i,l,a,nw) = forces_jastrow_en_g(m,i,l,a,nw) - f * invdist / expk
|
|
<span style="color: #a020f0;">end if</span>
|
|
|
|
forces_jastrow_en_g(m,i,l,a,nw) = forces_jastrow_en_g(m,i,l,a,nw) + <span style="color: #a020f0;">&</span>
|
|
f * dx(m) * dx(l) * expk * (invdist + rescale_factor_en(type_nucl_vector(a)+1))
|
|
forces_jastrow_en_g(m,i,l,a,nw) = forces_jastrow_en_g(m,i,l,a,nw) + 2.d0 * f * invdenom * <span style="color: #a020f0;">&</span>
|
|
a_vector(2, type_nucl_vector(a)+1) * dx(m) * dx(l)
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
kf = 2.d0
|
|
x1 = x
|
|
x = 1.d0
|
|
<span style="color: #a020f0;">do</span> k=2, aord_num
|
|
f = a_vector(k+1,type_nucl_vector(a)+1) * kf * x
|
|
f2 = a_vector(k+1,type_nucl_vector(a)+1) * kf * x * (kf-1.d0)
|
|
|
|
<span style="color: #a020f0;">do</span> m = 1, 3
|
|
<span style="color: #a020f0;">do</span> l = 1, 3
|
|
<span style="color: #a020f0;">if</span> (m == l) <span style="color: #a020f0;">then</span>
|
|
forces_jastrow_en_g(m,i,l,a,nw) = forces_jastrow_en_g(m,i,l,a,nw) - f * x1 * invdist / expk
|
|
<span style="color: #a020f0;">end if</span>
|
|
forces_jastrow_en_g(m,i,l,a,nw) = forces_jastrow_en_g(m,i,l,a,nw) - f2 * dx(m) * dx(l) <span style="color: #a020f0;">&</span>
|
|
+ f * x1 * dx(m) * dx(l) * rescale_factor_en(type_nucl_vector(a)+1) * expk <span style="color: #a020f0;">&</span>
|
|
+ f * x1 * dx(m) * dx(l) * invdist * expk
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
x = x*x1
|
|
kf = kf + 1.d0
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_en_g_doc</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgb580725" class="outline-4">
|
|
<h4 id="orgb580725"><span class="section-number-4">4.1.3.</span> Force of electron-nucleus Jastrow Laplacian</h4>
|
|
<div class="outline-text-4" id="text-4-1-3">
|
|
<p>
|
|
Calculates the force of the electron-nucleus Jastrow Laplacian.
|
|
To avoid having to calculate higher order derivatives of the rescaled distances elsewhere, the neccessery terms are calcuculated on the fly.
|
|
</p>
|
|
\begin{eqnarray}
|
|
\partial_{\alpha,m} \nabla^2 J_{en} =& \sum_i \left(\partial_{\alpha,m}\frac{a_1 \nabla^2 \widetilde{R}_{i\alpha}}{(1+a_2 \widetilde{R}_{i\alpha})^2} - \partial_{\alpha,m} \frac{2a_1a_2 (\nabla\widetilde{R}_{i\alpha}\cdot \nabla \widetilde{R}_{i\alpha})}{(1+a_2\widetilde{R}_{i\alpha})^3} + \partial_{\alpha,m} \sum_{k=2}^{N_\text{aord}} a_k k \left( \widetilde{R}_{i\alpha}^{k-1} \nabla^2\widetilde{R}_{i\alpha} + (k-1)\widetilde{R}_{i\alpha}^{k-2} (\nabla \widetilde{R}_{i\alpha}\cdot \nabla \widetilde{R}_{i\alpha} ) \right) \right)\\
|
|
=&\sum_i \left( \frac{a_1 \partial_{i,m} \widetilde{R}_{i\alpha}}{(1+a_2 \widetilde{R}_{i\alpha})^2}\left( \frac{2\kappa}{R_{i\alpha}} - \kappa^2 + \frac{2}{R^2_{i\alpha}}\right) + \frac{2a_1a_2\partial_{i,m}\widetilde{R}_{i\alpha}\nabla^2\widetilde{R}_{i\alpha}}{(1+a_2 \widetilde{R}_{i\alpha})^3} - \frac{4a_1a_2\kappa e^{-\kappa R_{i\alpha}}\partial_{i,m}\widetilde{R}_{i\alpha}}{(1+a_2 \widetilde{R}_{i\alpha})^3} - \frac{6 a_1 a_2^2 (\nabla \widetilde{R}_{i\alpha} \cdot \nabla \widetilde{R}_{i\alpha})\partial_{i,m}\widetilde{R}_{i\alpha}}{(1+a_2 \widetilde{R}_{i\alpha})^4} \right.\\
|
|
&\left.+ \sum_{k=2}^{N_\text{aord}} a_k k \left( -(k-1) \widetilde{R}_{i\alpha}^{k-2}\partial_{i,m}\widetilde{R}_{i\alpha} \nabla^2\widetilde{R}_{i\alpha} + \widetilde{R}_{i\alpha}^{k-1}\partial_{i,m}\widetilde{R}_{i\alpha}\left(\frac{2\kappa}{R_{i\alpha}} - \kappa^2 + \frac{2}{R_{i\alpha}^2} \right) - (k-1)(k-2)\widetilde{R}_{i\alpha}^{k-3}\partial_{i,m}\widetilde{R}_{i\alpha}(\nabla\widetilde{R}_{i\alpha} \cdot \nabla \widetilde{R}_{i\alpha}) + 2\kappa(k-1)\widetilde{R}_{i\alpha}^{k-2} e^{-\kappa R_{i\alpha}} \partial_{i,m}\widetilde{R}_{i\alpha} \right) \right)
|
|
\end{eqnarray}
|
|
</div>
|
|
|
|
<div id="outline-container-org2401312" class="outline-5">
|
|
<h5 id="org2401312"><span class="section-number-5">4.1.3.1.</span> Get</h5>
|
|
<div class="outline-text-5" id="text-4-1-3-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_forces_jastrow_en_l</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_jastrow_en_l</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_get_forces_jastrow_en_l</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> forces_jastrow_en_l, size_max) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">import</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span> (qmckl_context) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>), <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_jastrow_en_l(size_max)</span>
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_forces_jastrow_en_l</span>
|
|
<span style="color: #a020f0;">end interface</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org4f0a529" class="outline-5">
|
|
<h5 id="org4f0a529"><span class="section-number-5">4.1.3.2.</span> Compute</h5>
|
|
<div class="outline-text-5" id="text-4-1-3-2">
|
|
<table id="org23851cf" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of unique nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_vector</code></td>
|
|
<td class="org-left"><code>int64_t[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">IDs of unique nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>aord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of coefficients</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>a_vector</code></td>
|
|
<td class="org-left"><code>double[type_nucl_num][aord_num+1]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">List of coefficients</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>rescale_factor_en</code></td>
|
|
<td class="org-left"><code>double[type_nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Rescale factor for electron-nucleus</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_distance</code></td>
|
|
<td class="org-left"><code>double[walk_num][elec_num][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_distance_rescaled</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_distance_rescaled_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num][elec_num][4]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus distance derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_jastrow_en_l</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num][3]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Forces of electron-nucleus Laplacian</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_en_l_doc</span>( <span style="color: #a020f0;">&</span>
|
|
context, walk_num, elec_num, nucl_num, type_nucl_num, <span style="color: #a020f0;">&</span>
|
|
type_nucl_vector, aord_num, a_vector, rescale_factor_en, en_distance, <span style="color: #a020f0;">&</span>
|
|
en_distance_rescaled, en_distance_rescaled_gl, forces_jastrow_en_l) <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;"> walk_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> nucl_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> type_nucl_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> type_nucl_vector(nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> aord_num</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> a_vector(aord_num+1,type_nucl_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> rescale_factor_en(type_nucl_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_distance(nucl_num, elec_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_distance_rescaled(elec_num,nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_distance_rescaled_gl(4, elec_num,nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_jastrow_en_l(3,nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, k, nw, ii, m,l</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, x1, kf, grad_c2</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> denom, invdenom, invdenom2, f, f2, expk, invdist</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> dx(4)</span>
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 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> (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
|
|
forces_jastrow_en_l(:,:,nw) = 0.0d0
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
<span style="color: #a020f0;">do</span> i = 1, elec_num
|
|
expk = dexp(rescale_factor_en(type_nucl_vector(a)+1) * en_distance(a,i,nw))
|
|
invdist = 1.d0 / en_distance(a,i,nw)
|
|
x = en_distance_rescaled(i,a,nw)
|
|
<span style="color: #a020f0;">if</span>(<span style="color: #a020f0;">abs</span>(x) < 1.d-12) <span style="color: #a020f0;">continue</span>
|
|
denom = 1.0d0 + a_vector(2, type_nucl_vector(a)+1) * x
|
|
invdenom = 1.0d0 / denom
|
|
invdenom2 = invdenom*invdenom
|
|
f = a_vector(1, type_nucl_vector(a)+1) * invdenom2
|
|
|
|
<span style="color: #a020f0;">do</span> m = 1, 4
|
|
dx(m) = en_distance_rescaled_gl(m,i,a,nw)
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
grad_c2 = dx(1)*dx(1) + dx(2)*dx(2) + dx(3)*dx(3)
|
|
|
|
<span style="color: #a020f0;">do</span> m = 1, 3
|
|
forces_jastrow_en_l(m,a,nw) = forces_jastrow_en_l(m,a,nw) + f * dx(m) * <span style="color: #a020f0;">&</span>
|
|
(rescale_factor_en(type_nucl_vector(a)+1) <span style="color: #a020f0;">&</span>
|
|
* (2 *invdist - rescale_factor_en(type_nucl_vector(a)+1)) + 2*invdist*invdist)
|
|
forces_jastrow_en_l(m,a,nw) = forces_jastrow_en_l(m,a,nw) + 2.d0 * f <span style="color: #a020f0;">&</span>
|
|
* invdenom * a_vector(2, type_nucl_vector(a)+1) * dx(m) * dx(4)
|
|
forces_jastrow_en_l(m,a,nw) = forces_jastrow_en_l(m,a,nw) - 4.d0 * f <span style="color: #a020f0;">&</span>
|
|
* invdenom * a_vector(2, type_nucl_vector(a)+1) * rescale_factor_en(type_nucl_vector(a)+1) <span style="color: #a020f0;">&</span>
|
|
* dx(m)/expk
|
|
forces_jastrow_en_l(m,a,nw) = forces_jastrow_en_l(m,a,nw) - 6.d0 * f <span style="color: #a020f0;">&</span>
|
|
* invdenom * invdenom * a_vector(2, type_nucl_vector(a)+1) * a_vector(2, type_nucl_vector(a)+1) <span style="color: #a020f0;">&</span>
|
|
* grad_c2 * dx(m)
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
|
|
kf = 2.d0
|
|
x1 = x
|
|
x = 1.d0
|
|
<span style="color: #a020f0;">do</span> k=2, aord_num
|
|
f = a_vector(k+1,type_nucl_vector(a)+1) * kf * x
|
|
<span style="color: #a020f0;">do</span> m = 1, 3
|
|
forces_jastrow_en_l(m,a,nw) = forces_jastrow_en_l(m,a,nw) <span style="color: #a020f0;">&</span>
|
|
- f * dx(m) * dx(4) * (kf-1.d0) <span style="color: #a020f0;">&</span>
|
|
- f / x1 * (kf-1.d0) * (kf-2.d0) * dx(m) /expk /expk <span style="color: #a020f0;">&</span>
|
|
+ f * x1 * rescale_factor_en(type_nucl_vector(a)+1) * dx(m) * dx(4) * expk <span style="color: #a020f0;">&</span>
|
|
+ f * x1 * 2 * dx(m) * invdist * invdist <span style="color: #a020f0;">&</span>
|
|
+ 2 * f * (kf-1.d0) * dx(m) * rescale_factor_en(type_nucl_vector(a)+1) / expk
|
|
<span style="color: #a020f0;">end do</span>
|
|
x = x*x1
|
|
kf = kf + 1.d0
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_en_l_doc</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgc322296" class="outline-4">
|
|
<h4 id="orgc322296"><span class="section-number-4">4.1.4.</span> Force of single electron-nucleus Jastrow value</h4>
|
|
<div class="outline-text-4" id="text-4-1-4">
|
|
<p>
|
|
Calculate the force of the single-electron contribution ot the electron-nucleus Jastrow value.
|
|
\[
|
|
\delta\partial_{\alpha,m} J_{en} = -\left( \frac{a_1 \partial_{i,m} \widetilde{R}_{i\alpha}^{\text{new}}}{(1+a_2 \widetilde{R}_{i\alpha}^{\text{new}} )^2} + \sum_{k=2}^{N_\text{aord}} a_k k {\widetilde{R}_{i\alpha}^{\text{new}}}^{k-1} \partial_{i,m} \widetilde{R}_{i\alpha}^{\text{new}} \right) + \left( \frac{a_1 \partial_{i,m} \widetilde{R}_{i\alpha}^{\text{old}}}{(1+a_2 \widetilde{R}_{i\alpha}^{\text{old}} )^2} + \sum_{k=2}^{N_\text{aord}} a_k k {\widetilde{R}_{i\alpha}^{\text{old}}}^{k-1} \partial_{i,m} \widetilde{R}_{i\alpha}^{\text{old}} \right)
|
|
\]
|
|
</p>
|
|
|
|
<p>
|
|
The function <code>qmckl_set_single_point</code> has to be called before this function to set the new electron position.
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org2f9a044" class="outline-5">
|
|
<h5 id="org2f9a044"><span class="section-number-5">4.1.4.1.</span> Get</h5>
|
|
<div class="outline-text-5" id="text-4-1-4-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_forces_jastrow_single_en</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_jastrow_single_en</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgf001a60" class="outline-5">
|
|
<h5 id="orgf001a60"><span class="section-number-5">4.1.4.2.</span> Compute</h5>
|
|
<div class="outline-text-5" id="text-4-1-4-2">
|
|
<table id="orgc842e2c" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Index of single electron</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of unique nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_vector</code></td>
|
|
<td class="org-left"><code>int64_t[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">IDs of unique nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>aord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of coefficients</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>a_vector</code></td>
|
|
<td class="org-left"><code>double[type_nucl_num][aord_num+1]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">List of coefficients</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_distance_rescaled</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_distance_rescaled_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num][elec_num][4]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distance derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_rescaled_single</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled single distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_rescaled_single_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num][4]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled single distance derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_jastrow_single_en</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num][3]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Single electron-nucleus forces</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_single_en_doc</span>( <span style="color: #a020f0;">&</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, forces_jastrow_single_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_distance_rescaled_gl(4, elec_num,nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_rescaled_single(nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_rescaled_single_gl(4, nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_jastrow_single_en(3,nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, k, nw, ii, num</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, x1, kf, x_old, x1_old</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> denom, invdenom, invdenom2, f</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> denom_old, invdenom_old, invdenom2_old, f_old</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> dx(3), dx_old(3)</span>
|
|
|
|
num = num_in + 1
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 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
|
|
forces_jastrow_single_en(:,:,nw) = 0.0d0
|
|
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
|
|
x_old = en_distance_rescaled(num,a,nw)
|
|
x = en_rescaled_single(a,nw)
|
|
|
|
|
|
denom = 1.0d0 + a_vector(2, type_nucl_vector(a)+1) * x
|
|
invdenom = 1.0d0 / denom
|
|
invdenom2 = invdenom*invdenom
|
|
|
|
denom_old = 1.0d0 + a_vector(2, type_nucl_vector(a)+1) * x_old
|
|
invdenom_old = 1.0d0 / denom_old
|
|
invdenom2_old = invdenom_old*invdenom_old
|
|
|
|
dx(1) = -en_rescaled_single_gl(1,a,nw)
|
|
dx(2) = -en_rescaled_single_gl(2,a,nw)
|
|
dx(3) = -en_rescaled_single_gl(3,a,nw)
|
|
|
|
dx_old(1) = -en_distance_rescaled_gl(1,num,a,nw)
|
|
dx_old(2) = -en_distance_rescaled_gl(2,num,a,nw)
|
|
dx_old(3) = -en_distance_rescaled_gl(3,num,a,nw)
|
|
|
|
f = a_vector(1, type_nucl_vector(a)+1) * invdenom2
|
|
|
|
f_old = a_vector(1, type_nucl_vector(a)+1) * invdenom2_old
|
|
|
|
forces_jastrow_single_en(1,a,nw) = forces_jastrow_single_en(1,a,nw) + f * dx(1) - f_old * dx_old(1)
|
|
forces_jastrow_single_en(2,a,nw) = forces_jastrow_single_en(2,a,nw) + f * dx(2) - f_old * dx_old(2)
|
|
forces_jastrow_single_en(3,a,nw) = forces_jastrow_single_en(3,a,nw) + f * dx(3) - f_old * dx_old(3)
|
|
|
|
|
|
kf = 2.d0
|
|
x1 = x
|
|
x = 1.d0
|
|
x1_old = x_old
|
|
x_old = 1.d0
|
|
<span style="color: #a020f0;">do</span> k=2, aord_num
|
|
f = a_vector(k+1,type_nucl_vector(a)+1) * kf * x
|
|
f_old = a_vector(k+1,type_nucl_vector(a)+1) * kf * x_old
|
|
forces_jastrow_single_en(1,a,nw) = forces_jastrow_single_en(1,a,nw) + f * x1 * dx(1) - f_old * x1_old * dx_old(1)
|
|
forces_jastrow_single_en(2,a,nw) = forces_jastrow_single_en(2,a,nw) + f * x1 * dx(2) - f_old * x1_old * dx_old(2)
|
|
forces_jastrow_single_en(3,a,nw) = forces_jastrow_single_en(3,a,nw) + f * x1 * dx(3) - f_old * x1_old * dx_old(3)
|
|
x = x*x1
|
|
x_old = x_old*x1_old
|
|
kf = kf + 1.d0
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_single_en_doc</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div id="outline-container-orgf5dd455" class="outline-3">
|
|
<h3 id="orgf5dd455"><span class="section-number-3">4.2.</span> Electron-electron-nucleus Jastrow</h3>
|
|
<div class="outline-text-3" id="text-4-2">
|
|
</div>
|
|
<div id="outline-container-orgd3d751d" class="outline-4">
|
|
<h4 id="orgd3d751d"><span class="section-number-4">4.2.1.</span> Force of P matrix</h4>
|
|
<div class="outline-text-4" id="text-4-2-1">
|
|
<p>
|
|
Calculates the force of the P matrix. This is a required component to calculate the force on the 3-body Jastrow.
|
|
\[
|
|
\partial_{\alpha,m} P_{i,\alpha,k,l} = \sum_j \widetilde{r}_{i,j,k} \partial_{\alpha,m}\widetilde{R}_{j,\alpha,l} = -\sum_j \widetilde{r}_{i,j,k} \partial_{j,m}\widetilde{R}_{j,\alpha,l}
|
|
\]
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-orgc9b5792" class="outline-5">
|
|
<h5 id="orgc9b5792"><span class="section-number-5">4.2.1.1.</span> Get</h5>
|
|
<div class="outline-text-5" id="text-4-2-1-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_forces_tmp_c</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_tmp_c</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org70f0661" class="outline-5">
|
|
<h5 id="org70f0661"><span class="section-number-5">4.2.1.2.</span> Compute</h5>
|
|
<div class="outline-text-5" id="text-4-2-1-2">
|
|
<table id="orgc6e6f84" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>cord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">order of polynomials</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_e</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_tmp_c</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Force on the P matrix</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_forces_tmp_c</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> context, walk_num, elec_num, nucl_num, cord_num,</span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> een_rescaled_e, een_rescaled_n_gl, forces_tmp_c) </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;"> walk_num, elec_num, cord_num, nucl_num</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_e(elec_num, elec_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n_gl(elec_num, 4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_tmp_c(elec_num, 4, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> nw, i</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> l, m, k, a,j</span>
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) info = QMCKL_INVALID_ARG_2
|
|
<span style="color: #a020f0;">if</span> (elec_num <= 0) info = QMCKL_INVALID_ARG_3
|
|
<span style="color: #a020f0;">if</span> (nucl_num <= 0) info = QMCKL_INVALID_ARG_4
|
|
<span style="color: #a020f0;">if</span> (cord_num < 0) info = QMCKL_INVALID_ARG_5
|
|
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
|
|
|
|
<span style="color: #a020f0;">do</span> nw=1, walk_num
|
|
<span style="color: #a020f0;">do</span> i=0, cord_num-1
|
|
info = qmckl_dgemm(context,<span style="color: #8b2252;">'N'</span>,<span style="color: #8b2252;">'N'</span>,elec_num*1_8,<span style="color: #a020f0;">&</span>
|
|
nucl_num*(cord_num+1)*4_8, elec_num*1_8, -1.0d0, <span style="color: #a020f0;">&</span>
|
|
een_rescaled_e(1,1,i,nw),1_8*elec_num, <span style="color: #a020f0;">&</span>
|
|
een_rescaled_n_gl(1,1,1,0,nw),elec_num*1_8, <span style="color: #a020f0;">&</span>
|
|
0.0d0, <span style="color: #a020f0;">&</span>
|
|
forces_tmp_c(1,1,1,0,i,nw),1_8*elec_num)
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_tmp_c</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org6c17e6c" class="outline-4">
|
|
<h4 id="org6c17e6c"><span class="section-number-4">4.2.2.</span> Force of derivative of the \(P\) matrix</h4>
|
|
<div class="outline-text-4" id="text-4-2-2">
|
|
<p>
|
|
Calculates the force of the derivative of the \(P\) matrix.
|
|
\[
|
|
\partial_{\alpha,m} \partial_{i,n} P_{i,\alpha,k,l} = \sum_j \partial_{i,n} \widetilde{r}_{i,j,k} \partial_{\alpha,m}\widetilde{R}_{j,\alpha,l} = -\sum_j \partial_{i,n}\widetilde{r}_{i,j,k} \partial_{j,m}\widetilde{R}_{j,\alpha,l}
|
|
\]
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-orgb69d90c" class="outline-5">
|
|
<h5 id="orgb69d90c"><span class="section-number-5">4.2.2.1.</span> Get</h5>
|
|
<div class="outline-text-5" id="text-4-2-2-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_forces_dtmp_c</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_dtmp_c</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org7210b06" class="outline-5">
|
|
<h5 id="org7210b06"><span class="section-number-5">4.2.2.2.</span> Compute</h5>
|
|
<div class="outline-text-5" id="text-4-2-2-2">
|
|
<table id="orgf6b5b98" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>cord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">order of polynomials</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_e_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_dtmp_c</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][4][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Force of derivative of the P matrix</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_forces_dtmp_c_doc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> context, walk_num, elec_num, nucl_num, cord_num,</span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> een_rescaled_e_gl, een_rescaled_n_gl, forces_dtmp_c) </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;"> walk_num, elec_num, cord_num, nucl_num</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_e_gl(elec_num, 4, elec_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n_gl(elec_num, 4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_dtmp_c(elec_num, 4, nucl_num,4,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> nw, i, k</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> l, m, a,j, kk</span>
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) info = QMCKL_INVALID_ARG_2
|
|
<span style="color: #a020f0;">if</span> (elec_num <= 0) info = QMCKL_INVALID_ARG_3
|
|
<span style="color: #a020f0;">if</span> (nucl_num <= 0) info = QMCKL_INVALID_ARG_4
|
|
<span style="color: #a020f0;">if</span> (cord_num < 0) info = QMCKL_INVALID_ARG_5
|
|
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
|
|
|
|
<span style="color: #a020f0;">do</span> nw = 1, walk_num
|
|
<span style="color: #a020f0;">do</span> l = 0, cord_num-1
|
|
<span style="color: #a020f0;">do</span> m = 1, cord_num
|
|
<span style="color: #a020f0;">do</span> k = 1, 4
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
<span style="color: #a020f0;">do</span> kk = 1, 4
|
|
<span style="color: #a020f0;">do</span> i = 1, elec_num
|
|
forces_dtmp_c(i,kk,a,k,m,l,nw) = 0.d0
|
|
<span style="color: #a020f0;">do</span> j = 1, elec_num
|
|
forces_dtmp_c(i,kk,a,k,m,l,nw) = forces_dtmp_c(i,kk,a,k,m,l,nw) - <span style="color: #a020f0;">&</span>
|
|
een_rescaled_e_gl(i,kk,j,l,nw) * een_rescaled_n_gl(j,k,a,m,nw)
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_dtmp_c_doc</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_forces_dtmp_c_hpc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> context, walk_num, elec_num, nucl_num, cord_num,</span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> een_rescaled_e_gl, een_rescaled_n_gl, forces_dtmp_c) </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;"> walk_num, elec_num, cord_num, nucl_num</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_e_gl(elec_num, 4, elec_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n_gl(elec_num, 4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_dtmp_c(elec_num, 4, nucl_num,4,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> nw, i, k</span>
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> l, m, a,j, kk</span>
|
|
<span style="color: #228b22;">double precision</span>, <span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> tmp(:,:,:,:)</span>
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) info = QMCKL_INVALID_ARG_2
|
|
<span style="color: #a020f0;">if</span> (elec_num <= 0) info = QMCKL_INVALID_ARG_3
|
|
<span style="color: #a020f0;">if</span> (nucl_num <= 0) info = QMCKL_INVALID_ARG_4
|
|
<span style="color: #a020f0;">if</span> (cord_num < 0) info = QMCKL_INVALID_ARG_5
|
|
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
|
|
|
|
<span style="color: #a020f0;">allocate</span>(tmp(elec_num, 4, 4, nucl_num))
|
|
|
|
<span style="color: #a020f0;">do</span> nw = 1, walk_num
|
|
<span style="color: #a020f0;">do</span> l = 0, cord_num-1
|
|
<span style="color: #a020f0;">do</span> m = 1, cord_num
|
|
info = qmckl_dgemm(context,<span style="color: #8b2252;">'N'</span>,<span style="color: #8b2252;">'N'</span>, elec_num*4, 4*nucl_num, elec_num, -1.d0, <span style="color: #a020f0;">&</span>
|
|
een_rescaled_e_gl(1,1,1,l,nw), elec_num*4_8, <span style="color: #a020f0;">&</span>
|
|
een_rescaled_n_gl(1,1,1,m,nw), elec_num, 0.d0, <span style="color: #a020f0;">&</span>
|
|
tmp, elec_num*4_8)
|
|
<span style="color: #a020f0;">do</span> k = 1, 4
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
forces_dtmp_c(:,:,a,k,m,l,nw) = tmp(:,:,k,a)
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">deallocate</span>(tmp)
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_dtmp_c_hpc</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgce67295" class="outline-4">
|
|
<h4 id="orgce67295"><span class="section-number-4">4.2.3.</span> Force of electron-electron-nucleus Jastrow value</h4>
|
|
<div class="outline-text-4" id="text-4-2-3">
|
|
<p>
|
|
Calculates the force of the eleectron-electorn-nucleus Jastrow value.
|
|
\[
|
|
\partial_{\alpha,m}J_{een} = \sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}} c_{l,k,p,\alpha} \sum_{i=1}^{N_\text{elec}} \left(\widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{\alpha,m}P_{i\alpha,k,(p-k-l)/2} + \partial_{\alpha,m}\widetilde{R}_{i\alpha}^{(p-k+l)/2} P_{i\alpha,k,(p-k-l)/2}\right)
|
|
\]
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org5c39e4f" class="outline-5">
|
|
<h5 id="org5c39e4f"><span class="section-number-5">4.2.3.1.</span> Get</h5>
|
|
<div class="outline-text-5" id="text-4-2-3-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_forces_jastrow_een</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_jastrow_een</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_get_forces_jastrow_een</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> forces_jastrow_een, size_max) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">import</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span> (qmckl_context) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>), <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_jastrow_een(size_max)</span>
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_forces_jastrow_een</span>
|
|
<span style="color: #a020f0;">end interface</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org605a445" class="outline-5">
|
|
<h5 id="org605a445"><span class="section-number-5">4.2.3.2.</span> Compute</h5>
|
|
<div class="outline-text-5" id="text-4-2-3-2">
|
|
<table id="orgc5aa9e6" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>cord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">order of polynomials</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>dim_c_vector</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">dimension of full coefficient vector</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>c_vector_full</code></td>
|
|
<td class="org-left"><code>double[dim_c_vector][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">full coefficient vector</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>lkpm_combined_index</code></td>
|
|
<td class="org-left"><code>int64_t[4][dim_c_vector]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">combined indices</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>tmp_c</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">P matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_tmp_c</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Force of P matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_jastrow_een</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num][3]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Force of electron-electron-nucleus Jastrow value</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_forces_jastrow_een</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> context, 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;"> een_rescaled_n, een_rescaled_n_gl, tmp_c, forces_tmp_c,forces_jastrow_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;"> walk_num, elec_num, cord_num, nucl_num, dim_c_vector</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> lkpm_combined_index(dim_c_vector,4)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> c_vector_full(nucl_num, dim_c_vector)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n(elec_num, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n_gl(elec_num, 4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> tmp_c(elec_num, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> forces_tmp_c(elec_num,4, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_jastrow_een(3, nucl_num, walk_num)</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, p, m, n, nw, ii</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> accu, accu2, cn</span>
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) info = QMCKL_INVALID_ARG_2
|
|
<span style="color: #a020f0;">if</span> (elec_num <= 0) info = QMCKL_INVALID_ARG_3
|
|
<span style="color: #a020f0;">if</span> (nucl_num <= 0) info = QMCKL_INVALID_ARG_4
|
|
<span style="color: #a020f0;">if</span> (cord_num < 0) info = QMCKL_INVALID_ARG_5
|
|
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
|
|
|
|
forces_jastrow_een = 0.d0
|
|
|
|
<span style="color: #a020f0;">if</span> (cord_num == 0) <span style="color: #a020f0;">return</span>
|
|
|
|
<span style="color: #a020f0;">do</span> nw =1, walk_num
|
|
<span style="color: #a020f0;">do</span> n = 1, dim_c_vector
|
|
l = lkpm_combined_index(n, 1)
|
|
k = lkpm_combined_index(n, 2)
|
|
p = lkpm_combined_index(n, 3)
|
|
m = lkpm_combined_index(n, 4)
|
|
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
cn = c_vector_full(a, n)
|
|
<span style="color: #a020f0;">if</span>(cn == 0.d0) <span style="color: #a020f0;">cycle</span>
|
|
<span style="color: #a020f0;">do</span> j = 1, elec_num
|
|
<span style="color: #a020f0;">do</span> ii = 1, 3
|
|
accu = een_rescaled_n(j,a,m,nw) * forces_tmp_c(j,ii,a,m+l,k,nw) <span style="color: #a020f0;">&</span>
|
|
- een_rescaled_n_gl(j,ii,a,m,nw) * tmp_c(j,a,m+l,k,nw)
|
|
|
|
forces_jastrow_een(ii, a, nw) = forces_jastrow_een(ii, a, nw) + accu * cn
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_een</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgb7f6d8e" class="outline-4">
|
|
<h4 id="orgb7f6d8e"><span class="section-number-4">4.2.4.</span> Force of derivatives of electron-nucleus rescaled distance</h4>
|
|
<div class="outline-text-4" id="text-4-2-4">
|
|
<p>
|
|
Calculates the force of the derivatives of the electron-nucleus rescaled distance.
|
|
</p>
|
|
\begin{eqnarray}
|
|
\partial_{\alpha,m}\partial_{i,n} \widetilde{R}_{i\alpha} =& \partial_{\alpha,m} \left( -\frac{r_{i,n} - R_{\alpha,n}}{R_{i\alpha}} \kappa l e^{-\kappa l R_{i\alpha}}\right)\\
|
|
=& - \frac{(r_{i,n} - R_{\alpha,n})(r_{i,m} - R_{\alpha,m})}{R_{i\alpha}^3}l\kappa e^{-\kappa l R_{i\alpha}} - \frac{(r_{i,n} - R_{\alpha,n})(r_{i,m} - R_{\alpha,m})}{R_{i\alpha}^2} \kappa^2 l^2 e^{-\kappa l R_{i\alpha}} + \delta_{n,m} \frac{1}{r}\kappa l e^{-\kappa l R_{i\alpha}}\\
|
|
\partial_{\alpha,m}\nabla^2 \widetilde{R}_{i\alpha} =& \partial_{\alpha,m} \left( \kappa l \left( \kappa l - \frac{2}{R_{i\alpha}}\right) e^{-\kappa l R_{i\alpha}}\right)\\
|
|
=&-2\kappa l \frac{r_{i,m} - R_{\alpha,m}}{R_{i\alpha}^3}e^{-\kappa l R_{i\alpha}} + \kappa^2 l^2 \left(\kappa l - \frac{2}{R_{i\alpha}} \right) \frac{r_{i,m}-R_{\alpha,m}}{R_{i\alpha}} e^{-\kappa l R_{i\alpha}}
|
|
\end{eqnarray}
|
|
</div>
|
|
|
|
<div id="outline-container-org6c8f54e" class="outline-5">
|
|
<h5 id="org6c8f54e"><span class="section-number-5">4.2.4.1.</span> Get</h5>
|
|
<div class="outline-text-5" id="text-4-2-4-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_forces_een_rescaled_n_gl</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_een_n</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org73699b6" class="outline-5">
|
|
<h5 id="org73699b6"><span class="section-number-5">4.2.4.2.</span> Compute</h5>
|
|
<div class="outline-text-5" id="text-4-2-4-2">
|
|
<table id="org6d4ed3a" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of atoms</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of atom types</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>type_nucl_vector</code></td>
|
|
<td class="org-left"><code>int64_t[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Types of atoms</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>cord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Order of polynomials</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>rescale_factor_en</code></td>
|
|
<td class="org-left"><code>double[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Factor to rescale ee distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_distance</code></td>
|
|
<td class="org-left"><code>double[walk_num][elec_num][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distances derivativies</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_een_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][3][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Force of electron-nucleus rescaled distances derivatives</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_forces_een_rescaled_n_gl</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> context, walk_num, elec_num, nucl_num, type_nucl_num, type_nucl_vector, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> cord_num, rescale_factor_en, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> en_distance, een_rescaled_n, een_rescaled_n_gl,forces_een_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;"> walk_num, elec_num, nucl_num, type_nucl_num, cord_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> type_nucl_vector(nucl_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> rescale_factor_en(type_nucl_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_distance(nucl_num,elec_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n(elec_num,nucl_num,0:cord_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n_gl(elec_num,4,nucl_num,0:cord_num,walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_een_n(elec_num,4,nucl_num,3,0:cord_num,walk_num)</span>
|
|
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, ria_inv, kappa_l, temp</span>
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, k, l, nw, m, n</span>
|
|
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">then</span>
|
|
info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 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> (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;">forces_een_n = 0.0d0</span>
|
|
!<span style="color: #b22222;">do nw = 1, walk_num</span>
|
|
! <span style="color: #b22222;">do l = 0, cord_num</span>
|
|
! <span style="color: #b22222;">do a = 1, nucl_num</span>
|
|
! <span style="color: #b22222;">kappa_l = dble(l)*rescale_factor_en(type_nucl_vector(a)+1)</span>
|
|
! <span style="color: #b22222;">do i = 1, elec_num</span>
|
|
! <span style="color: #b22222;">ria_inv = 1.0d0 / en_distance(a,i,nw)</span>
|
|
! <span style="color: #b22222;">do n = 1, 3</span>
|
|
! <span style="color: #b22222;">do m = 1, 3</span>
|
|
! <span style="color: #b22222;">if (m == n) then</span>
|
|
! <span style="color: #b22222;">forces_een_n(i,m,a,n,l,nw) = forces_een_n(i,m,a,n,l,nw) + &</span>
|
|
! <span style="color: #b22222;">kappa_l*een_rescaled_n(i,a,l,nw) * ria_inv</span>
|
|
! <span style="color: #b22222;">end if</span>
|
|
! <span style="color: #b22222;">temp = een_rescaled_n_gl(i,m,a,l,nw) * een_rescaled_n_gl(i,n,a,l,nw) / een_rescaled_n(i,a,l,nw)</span>
|
|
! <span style="color: #b22222;">forces_een_n(i,m,a,n,l,nw) = forces_een_n(i,m,a,n,l,nw) - &</span>
|
|
! <span style="color: #b22222;">temp * ria_inv / kappa_l - temp</span>
|
|
! <span style="color: #b22222;">end do</span>
|
|
! <span style="color: #b22222;">forces_een_n(i,4,a,n,l,nw) = forces_een_n(i,4,a,n,l,nw) + &</span>
|
|
! <span style="color: #b22222;">(2.0d0 * ria_inv * ria_inv &</span>
|
|
! <span style="color: #b22222;">- een_rescaled_n_gl(i,4,a,l,nw)/een_rescaled_n(i,a,l,nw)) * &</span>
|
|
! <span style="color: #b22222;">een_rescaled_n_gl(i,n,a,l,nw)</span>
|
|
! <span style="color: #b22222;">end do</span>
|
|
! <span style="color: #b22222;">end do</span>
|
|
! <span style="color: #b22222;">end do</span>
|
|
! <span style="color: #b22222;">end do</span>
|
|
!<span style="color: #b22222;">end do</span>
|
|
|
|
|
|
forces_een_n = 0.0d0
|
|
<span style="color: #a020f0;">do</span> nw = 1, walk_num
|
|
<span style="color: #a020f0;">do</span> i = 1, elec_num
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
<span style="color: #a020f0;">do</span> l = 0, cord_num
|
|
kappa_l = <span style="color: #a020f0;">dble</span>(l)*rescale_factor_en(type_nucl_vector(a)+1)
|
|
<span style="color: #a020f0;">do</span> m = 1, 4
|
|
<span style="color: #a020f0;">do</span> n = 1, 3
|
|
<span style="color: #a020f0;">if</span> (l == 0) <span style="color: #a020f0;">then</span>
|
|
forces_een_n(i,m,a,n,l,nw) = 0.0d0
|
|
<span style="color: #a020f0;">else</span>
|
|
<span style="color: #a020f0;">if</span> (m == n) <span style="color: #a020f0;">then</span>
|
|
forces_een_n(i,m,a,n,l,nw) = forces_een_n(i,m,a,n,l,nw) + <span style="color: #a020f0;">&</span>
|
|
kappa_l*een_rescaled_n(i,a,l,nw)/en_distance(a,i,nw)
|
|
<span style="color: #a020f0;">end if</span>
|
|
<span style="color: #a020f0;">if</span> (m < 4) <span style="color: #a020f0;">then</span>
|
|
forces_een_n(i,m,a,n,l,nw) = forces_een_n(i,m,a,n,l,nw) - <span style="color: #a020f0;">&</span>
|
|
een_rescaled_n_gl(i,m,a,l,nw) * een_rescaled_n_gl(i,n,a,l,nw) / <span style="color: #a020f0;">&</span>
|
|
(kappa_l*een_rescaled_n(i,a,l,nw)*en_distance(a,i,nw)) - <span style="color: #a020f0;">&</span>
|
|
een_rescaled_n_gl(i,m,a,l,nw) * <span style="color: #a020f0;">&</span>
|
|
een_rescaled_n_gl(i,n,a,l,nw)/een_rescaled_n(i,a,l,nw)
|
|
<span style="color: #a020f0;">else</span>
|
|
forces_een_n(i,m,a,n,l,nw) = forces_een_n(i,m,a,n,l,nw) + <span style="color: #a020f0;">&</span>
|
|
2.0d0 * een_rescaled_n_gl(i,n,a,l,nw) / <span style="color: #a020f0;">&</span>
|
|
(en_distance(a,i,nw)*en_distance(a,i,nw)) - <span style="color: #a020f0;">&</span>
|
|
een_rescaled_n_gl(i,m,a,l,nw) * <span style="color: #a020f0;">&</span>
|
|
een_rescaled_n_gl(i,n,a,l,nw)/een_rescaled_n(i,a,l,nw)
|
|
<span style="color: #a020f0;">end if</span>
|
|
|
|
<span style="color: #a020f0;">end if</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_een_rescaled_n_gl</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orga958ca2" class="outline-4">
|
|
<h4 id="orga958ca2"><span class="section-number-4">4.2.5.</span> Force of electron-electron-nucleus Jastrow gradient</h4>
|
|
<div class="outline-text-4" id="text-4-2-5">
|
|
<p>
|
|
Calculates the force of the electron-electron-nucleus Jastrow gradient (and not the Laplacian).
|
|
</p>
|
|
\begin{eqnarray}
|
|
\partial_{\alpha,m} \partial_{i,n}J_{een} =& \partial_{\alpha,m} \sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}} c_{l,k,p,\alpha} \left(\partial_{i,n}\widetilde{R}_{i\alpha}^{(p-k+l)/2} P_{i\alpha,k,(p-k-l)/2} + \partial_{i,n}\widetilde{R}_{i\alpha}^{(p-k-l)/2} P_{i\alpha,k,(p-k+l)/2} + \widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{i,n} P_{i\alpha,k,(p-k-l)/2} + \widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{i,n} P_{i\alpha,k,(p-k+l)/2} \right)\\
|
|
=& \sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}} c_{l,k,p,\alpha} \left(\partial_{\alpha,m}\partial_{i,n}\widetilde{R}_{i\alpha}^{(p-k+l)/2} P_{i\alpha,k,(p-k-l)/2} + \partial_{\alpha,m}\partial_{i,n}\widetilde{R}_{i\alpha}^{(p-k-l)/2} P_{i\alpha,k,(p-k+l)/2} + \partial_{\alpha,m}\widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{i,n} P_{i\alpha,k,(p-k-l)/2} + \partial_{\alpha,m}\widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{i,n} P_{i\alpha,k,(p-k+l)/2} \right.\\
|
|
&+ \left.\partial_{i,n}\widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{\alpha,m}P_{i\alpha,k,(p-k-l)/2} + \partial_{i,n}\widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{\alpha,m}P_{i\alpha,k,(p-k+l)/2} + \widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{\alpha,m}\partial_{i,n} P_{i\alpha,k,(p-k-l)/2} + \widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{\alpha,m}\partial_{i,n} P_{i\alpha,k,(p-k+l)/2}\right)\\
|
|
=& \sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}} c_{l,k,p,\alpha} \left(\partial_{\alpha,m}\partial_{i,n}\widetilde{R}_{i\alpha}^{(p-k+l)/2} P_{i\alpha,k,(p-k-l)/2} + \partial_{\alpha,m}\partial_{i,n}\widetilde{R}_{i\alpha}^{(p-k-l)/2} P_{i\alpha,k,(p-k+l)/2} - \partial_{i,m}\widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{i,n} P_{i\alpha,k,(p-k-l)/2} - \partial_{i,m}\widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{i,n} P_{i\alpha,k,(p-k+l)/2} \right.\\
|
|
&+ \left.\partial_{i,n}\widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{\alpha,m}P_{i\alpha,k,(p-k-l)/2} + \partial_{i,n}\widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{\alpha,m}P_{i\alpha,k,(p-k+l)/2} + \widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{\alpha,m}\partial_{i,n} P_{i\alpha,k,(p-k-l)/2} + \widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{\alpha,m}\partial_{i,n} P_{i\alpha,k,(p-k+l)/2}\right)\\
|
|
\end{eqnarray}
|
|
</div>
|
|
|
|
<div id="outline-container-org4373291" class="outline-5">
|
|
<h5 id="org4373291"><span class="section-number-5">4.2.5.1.</span> Get</h5>
|
|
<div class="outline-text-5" id="text-4-2-5-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_forces_jastrow_een_g</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_jastrow_een_g</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_get_forces_jastrow_een_g</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> forces_jastrow_een_g, size_max) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">import</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span> (qmckl_context) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>), <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_jastrow_een_g(size_max)</span>
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_forces_jastrow_een_g</span>
|
|
<span style="color: #a020f0;">end interface</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org198f18d" class="outline-5">
|
|
<h5 id="org198f18d"><span class="section-number-5">4.2.5.2.</span> Compute</h5>
|
|
<div class="outline-text-5" id="text-4-2-5-2">
|
|
<table id="org3bb79df" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>cord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">order of polynomials</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>dim_c_vector</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">dimension of full coefficient vector</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>c_vector_full</code></td>
|
|
<td class="org-left"><code>double[dim_c_vector][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">full coefficient vector</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>lkpm_combined_index</code></td>
|
|
<td class="org-left"><code>int64_t[4][dim_c_vector]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">combined indices</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_distance</code></td>
|
|
<td class="org-left"><code>double[elec_num][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus distance</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>tmp_c</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">P matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>dtmp_c</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Derivative of P matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_tmp_c</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Force of P matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_dtmp_c</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][4][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Force of derivative of P matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_een_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][3][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Force of derivatives of electron-nucleus rescaled factor</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled factor</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Derivative of electron-nucleus rescaled factor</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_jastrow_een_g</code></td>
|
|
<td class="org-left"><code>double[walk_num][3][nucl_num][3][elec_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Force of the electron-electron-nucleus Jastrow gradient</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_forces_jastrow_een_g</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> context, walk_num, elec_num, nucl_num, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> cord_num, dim_c_vector, c_vector_full, lkpm_combined_index, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> en_distance, tmp_c, dtmp_c, forces_tmp_c, forces_dtmp_c, forces_een_n, een_rescaled_n, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> een_rescaled_n_gl, forces_jastrow_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;"> walk_num, elec_num, cord_num, nucl_num, dim_c_vector</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> lkpm_combined_index(dim_c_vector,4)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> c_vector_full(nucl_num, dim_c_vector)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_distance(nucl_num, elec_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> tmp_c(elec_num, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> dtmp_c(elec_num, 4, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> forces_tmp_c(elec_num, 4,nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> forces_dtmp_c(elec_num, 4, nucl_num,4,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> forces_een_n(elec_num, 4, nucl_num, 3, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n(elec_num, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n_gl(elec_num, 4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_jastrow_een_g(elec_num,3,nucl_num,3,walk_num)</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, m, n, nw, ii, jj</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> accu, accu2, cn</span>
|
|
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) info = QMCKL_INVALID_ARG_2
|
|
<span style="color: #a020f0;">if</span> (elec_num <= 0) info = QMCKL_INVALID_ARG_3
|
|
<span style="color: #a020f0;">if</span> (nucl_num <= 0) info = QMCKL_INVALID_ARG_4
|
|
<span style="color: #a020f0;">if</span> (cord_num < 0) info = QMCKL_INVALID_ARG_5
|
|
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
|
|
|
|
|
|
|
|
<span style="color: #a020f0;">if</span> (cord_num == 0) <span style="color: #a020f0;">return</span>
|
|
forces_jastrow_een_g = 0.0d0
|
|
<span style="color: #a020f0;">do</span> nw =1, walk_num
|
|
<span style="color: #a020f0;">do</span> n = 1, dim_c_vector
|
|
l = lkpm_combined_index(n, 1)
|
|
k = lkpm_combined_index(n, 2)
|
|
m = lkpm_combined_index(n, 4)
|
|
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
cn = c_vector_full(a, n)
|
|
<span style="color: #a020f0;">if</span>(cn == 0.d0) <span style="color: #a020f0;">cycle</span>
|
|
|
|
<span style="color: #a020f0;">do</span> ii = 1, 3
|
|
<span style="color: #a020f0;">do</span> i = 1, elec_num
|
|
<span style="color: #a020f0;">do</span> jj = 1, 3
|
|
forces_jastrow_een_g(i, ii, a, jj, nw) = forces_jastrow_een_g(i, ii, a, jj, nw) + (<span style="color: #a020f0;">&</span>
|
|
tmp_c(i,a, m, k,nw) * forces_een_n(i,ii,a,jj ,m+l,nw) <span style="color: #a020f0;">&</span>
|
|
+ forces_tmp_c(i,jj,a, m, k,nw) * een_rescaled_n_gl(i,ii,a,m+l,nw) <span style="color: #a020f0;">&</span>
|
|
+ tmp_c(i,a, m+l,k,nw) * forces_een_n(i,ii,a,jj, m, nw) <span style="color: #a020f0;">&</span>
|
|
+ forces_tmp_c(i,jj,a, m+l,k,nw) * een_rescaled_n_gl(i,ii,a,m, nw) <span style="color: #a020f0;">&</span>
|
|
- dtmp_c(i,ii,a, m, k,nw) * een_rescaled_n_gl(i,jj,a,m+l,nw) <span style="color: #a020f0;">&</span>
|
|
+ forces_dtmp_c(i,ii,a,jj,m, k,nw) * een_rescaled_n(i,a, m+l,nw) <span style="color: #a020f0;">&</span>
|
|
- dtmp_c(i,ii,a, m+l,k,nw) * een_rescaled_n_gl(i,jj,a,m, nw) <span style="color: #a020f0;">&</span>
|
|
+ forces_dtmp_c(i,ii,a,jj,m+l,k,nw) * een_rescaled_n(i,a, m, nw) <span style="color: #a020f0;">&</span>
|
|
) * cn
|
|
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_een_g</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgdcc714e" class="outline-4">
|
|
<h4 id="orgdcc714e"><span class="section-number-4">4.2.6.</span> Force of electron-electron-nucleus Jastrow Laplacian</h4>
|
|
<div class="outline-text-4" id="text-4-2-6">
|
|
<p>
|
|
Calculates the force of the electron-electron-nucleus Jastrow Laplacian.
|
|
</p>
|
|
\begin{eqnarray}
|
|
\partial_{\alpha,m} \nabla^2 J_{een} &=& \partial_{\alpha,m} \sum_{i=1}^{N_\text{elec}}\sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}} c_{l,k,p,\alpha} \left(\nabla^2\widetilde{R}_{i\alpha}^{(p-k+l)/2} P_{i\alpha,k,(p-k-l)/2} + \nabla^2\widetilde{R}_{i\alpha}^{(p-k-l)/2} P_{i\alpha,k,(p-k+l)/2} + \widetilde{R}_{i\alpha}^{(p-k+l)/2} \nabla^2 P_{i\alpha,k,(p-k-l)/2} + \widetilde{R}_{i\alpha}^{(p-k-l)/2} \nabla^2 P_{i\alpha,k,(p-k+l)/2} \right.\\
|
|
&&+ \left. 2 \nabla \widetilde{R}_{i\alpha}^{(p-k+l)/2} \cdot \nabla P_{i\alpha,k,(p-k-l)/2} + 2 \nabla \widetilde{R}_{i\alpha}^{(p-k-l)/2} \cdot \nabla P_{i\alpha,k,(p-k+l)/2} \right)\\
|
|
&=& \sum_{i=1}^{N_\text{elec}}\sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}} c_{l,k,p,\alpha} \left( \partial_{\alpha,m} \nabla^2\widetilde{R}_{i\alpha}^{(p-k+l)/2} P_{i\alpha,k,(p-k-l)/2} + \partial_{\alpha,m} \nabla^2\widetilde{R}_{i\alpha}^{(p-k-l)/2} P_{i\alpha,k,(p-k+l)/2} + \partial_{\alpha,m} \widetilde{R}_{i\alpha}^{(p-k+l)/2} \nabla^2 P_{i\alpha,k,(p-k-l)/2} + \partial_{\alpha,m} \widetilde{R}_{i\alpha}^{(p-k-l)/2} \nabla^2 P_{i\alpha,k,(p-k+l)/2} \right.\\
|
|
&&+\nabla^2\widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{\alpha,m} P_{i\alpha,k,(p-k-l)/2} + \nabla^2\widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{\alpha,m} P_{i\alpha,k,(p-k+l)/2} + \widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{\alpha,m} \nabla^2 P_{i\alpha,k,(p-k-l)/2} + \widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{\alpha,m} \nabla^2 P_{i\alpha,k,(p-k+l)/2} \\
|
|
&&+ \left. 2 \partial_{\alpha,m} \nabla \widetilde{R}_{i\alpha}^{(p-k+l)/2} \cdot \nabla P_{i\alpha,k,(p-k-l)/2} + 2 \partial_{\alpha,m} \nabla \widetilde{R}_{i\alpha}^{(p-k-l)/2} \cdot \nabla P_{i\alpha,k,(p-k+l)/2} + 2 \nabla \widetilde{R}_{i\alpha}^{(p-k+l)/2} \cdot \partial_{\alpha,m} \nabla P_{i\alpha,k,(p-k-l)/2} + 2 \nabla \widetilde{R}_{i\alpha}^{(p-k-l)/2} \cdot \partial_{\alpha,m} \nabla P_{i\alpha,k,(p-k+l)/2} \right)\\
|
|
&=& \sum_{i=1}^{N_\text{elec}}\sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}} c_{l,k,p,\alpha} \left( \partial_{\alpha,m} \nabla^2\widetilde{R}_{i\alpha}^{(p-k+l)/2} P_{i\alpha,k,(p-k-l)/2} + \partial_{\alpha,m} \nabla^2\widetilde{R}_{i\alpha}^{(p-k-l)/2} P_{i\alpha,k,(p-k+l)/2} - \partial_{i,m} \widetilde{R}_{i\alpha}^{(p-k+l)/2} \nabla^2 P_{i\alpha,k,(p-k-l)/2} - \partial_{i,m} \widetilde{R}_{i\alpha}^{(p-k-l)/2} \nabla^2 P_{i\alpha,k,(p-k+l)/2} \right.\\
|
|
&&+\nabla^2\widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{\alpha,m} P_{i\alpha,k,(p-k-l)/2} + \nabla^2\widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{\alpha,m} P_{i\alpha,k,(p-k+l)/2} + \widetilde{R}_{i\alpha}^{(p-k+l)/2} \partial_{\alpha,m} \nabla^2 P_{i\alpha,k,(p-k-l)/2} + \widetilde{R}_{i\alpha}^{(p-k-l)/2} \partial_{\alpha,m} \nabla^2 P_{i\alpha,k,(p-k+l)/2} \\
|
|
&&+ \left. 2 \partial_{\alpha,m} \nabla \widetilde{R}_{i\alpha}^{(p-k+l)/2} \cdot \nabla P_{i\alpha,k,(p-k-l)/2} + 2 \partial_{\alpha,m} \nabla \widetilde{R}_{i\alpha}^{(p-k-l)/2} \cdot \nabla P_{i\alpha,k,(p-k+l)/2} + 2 \nabla \widetilde{R}_{i\alpha}^{(p-k+l)/2} \cdot \partial_{\alpha,m} \nabla P_{i\alpha,k,(p-k-l)/2} + 2 \nabla \widetilde{R}_{i\alpha}^{(p-k-l)/2} \cdot \partial_{\alpha,m} \nabla P_{i\alpha,k,(p-k+l)/2} \right)
|
|
\end{eqnarray}
|
|
</div>
|
|
|
|
<div id="outline-container-orgbe80245" class="outline-5">
|
|
<h5 id="orgbe80245"><span class="section-number-5">4.2.6.1.</span> Get</h5>
|
|
<div class="outline-text-5" id="text-4-2-6-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_forces_jastrow_een_l</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_jastrow_een_l</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">interface</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_get_forces_jastrow_een_l</span><span style="color: #a0522d;"> (context, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> forces_jastrow_een_l, size_max) bind(C)</span>
|
|
<span style="color: #a020f0;">use</span>, <span style="color: #a020f0;">intrinsic</span> :: <span style="color: #0000ff;">iso_c_binding</span>
|
|
<span style="color: #a020f0;">import</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span> (qmckl_context) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> size_max</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>), <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_jastrow_een_l(size_max)</span>
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_get_forces_jastrow_een_l</span>
|
|
<span style="color: #a020f0;">end interface</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org209f6f0" class="outline-5">
|
|
<h5 id="org209f6f0"><span class="section-number-5">4.2.6.2.</span> Compute</h5>
|
|
<div class="outline-text-5" id="text-4-2-6-2">
|
|
<table id="org6f47ee7" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>cord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">order of polynomials</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>dim_c_vector</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">dimension of full coefficient vector</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>c_vector_full</code></td>
|
|
<td class="org-left"><code>double[dim_c_vector][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">full coefficient vector</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>lkpm_combined_index</code></td>
|
|
<td class="org-left"><code>int64_t[4][dim_c_vector]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">combined indices</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>en_distance</code></td>
|
|
<td class="org-left"><code>double[elec_num][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus distance</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>tmp_c</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">P matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>dtmp_c</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Derivative of P matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_tmp_c</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Force of P matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_dtmp_c</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][4][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Force of derivative of P matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_een_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][3][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Force of derivative of electron-nucleus rescaled factor</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled factor</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Derivative of electron-nucleus rescaled factor</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_jastrow_een_l</code></td>
|
|
<td class="org-left"><code>double[walk_num][3][nucl_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Force of electron-electron-nucleus Jastrow Laplacian</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_forces_jastrow_een_l</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> context, walk_num, elec_num, nucl_num, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> cord_num, dim_c_vector, c_vector_full, lkpm_combined_index, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> en_distance, tmp_c, dtmp_c, forces_tmp_c, forces_dtmp_c, forces_een_n, een_rescaled_n, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> een_rescaled_n_gl, forces_jastrow_een_l)</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;"> walk_num, elec_num, cord_num, nucl_num, dim_c_vector</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> lkpm_combined_index(dim_c_vector,4)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> c_vector_full(nucl_num, dim_c_vector)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> en_distance(nucl_num, elec_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> tmp_c(elec_num, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> dtmp_c(elec_num, 4, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> forces_tmp_c(elec_num, 4,nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> forces_dtmp_c(elec_num, 4, nucl_num,4,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> forces_een_n(elec_num, 4, nucl_num, 3, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n(elec_num, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n_gl(elec_num, 4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_jastrow_een_l(nucl_num,3,walk_num)</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, m, n, nw, ii, jj</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> accu, accu2, cn</span>
|
|
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 0) info = QMCKL_INVALID_ARG_2
|
|
<span style="color: #a020f0;">if</span> (elec_num <= 0) info = QMCKL_INVALID_ARG_3
|
|
<span style="color: #a020f0;">if</span> (nucl_num <= 0) info = QMCKL_INVALID_ARG_4
|
|
<span style="color: #a020f0;">if</span> (cord_num < 0) info = QMCKL_INVALID_ARG_5
|
|
<span style="color: #a020f0;">if</span> (info /= QMCKL_SUCCESS) <span style="color: #a020f0;">return</span>
|
|
|
|
|
|
|
|
<span style="color: #a020f0;">if</span> (cord_num == 0) <span style="color: #a020f0;">return</span>
|
|
forces_jastrow_een_l = 0.0d0
|
|
<span style="color: #a020f0;">do</span> nw =1, walk_num
|
|
<span style="color: #a020f0;">do</span> n = 1, dim_c_vector
|
|
l = lkpm_combined_index(n, 1)
|
|
k = lkpm_combined_index(n, 2)
|
|
m = lkpm_combined_index(n, 4)
|
|
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
cn = c_vector_full(a, n)
|
|
<span style="color: #a020f0;">if</span>(cn == 0.d0) <span style="color: #a020f0;">cycle</span>
|
|
|
|
<span style="color: #a020f0;">do</span> ii = 1, 3
|
|
<span style="color: #a020f0;">do</span> i = 1, elec_num
|
|
forces_jastrow_een_l(a, ii, nw) = forces_jastrow_een_l(a, ii, nw) + (<span style="color: #a020f0;">&</span>
|
|
tmp_c(i,a, m, k,nw) * forces_een_n(i,4,a,ii ,m+l,nw) <span style="color: #a020f0;">&</span>
|
|
+ forces_tmp_c(i,ii,a, m, k,nw) * een_rescaled_n_gl(i,4,a,m+l,nw) <span style="color: #a020f0;">&</span>
|
|
+ tmp_c(i,a, m+l,k,nw) * forces_een_n(i,4,a,ii, m, nw) <span style="color: #a020f0;">&</span>
|
|
+ forces_tmp_c(i,ii,a, m+l,k,nw) * een_rescaled_n_gl(i,4,a,m, nw) <span style="color: #a020f0;">&</span>
|
|
- dtmp_c(i,4,a, m, k,nw) * een_rescaled_n_gl(i,ii,a,m+l,nw) <span style="color: #a020f0;">&</span>
|
|
+ forces_dtmp_c(i,4,a,ii,m, k,nw) * een_rescaled_n(i,a, m+l,nw) <span style="color: #a020f0;">&</span>
|
|
- dtmp_c(i,4,a, m+l,k,nw) * een_rescaled_n_gl(i,ii,a,m, nw) <span style="color: #a020f0;">&</span>
|
|
+ forces_dtmp_c(i,4,a,ii,m+l,k,nw) * een_rescaled_n(i,a, m, nw) <span style="color: #a020f0;">&</span>
|
|
) * cn
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
cn = cn + cn
|
|
<span style="color: #a020f0;">do</span> ii = 1, 3
|
|
<span style="color: #a020f0;">do</span> i = 1, elec_num
|
|
<span style="color: #a020f0;">do</span> jj = 1, 3
|
|
forces_jastrow_een_l(a, ii, nw) = forces_jastrow_een_l(a, ii, nw) + (<span style="color: #a020f0;">&</span>
|
|
dtmp_c(i,jj,a,m, k,nw) * forces_een_n(i,jj,a,ii ,m+l,nw) + <span style="color: #a020f0;">&</span>
|
|
dtmp_c(i,jj,a,m+l, k,nw) * forces_een_n(i,jj,a,ii ,m,nw) + <span style="color: #a020f0;">&</span>
|
|
forces_dtmp_c(i,jj,a,ii,m, k,nw) * een_rescaled_n_gl(i,jj,a,m+l,nw) + <span style="color: #a020f0;">&</span>
|
|
forces_dtmp_c(i,jj,a,ii,m+l, k,nw) * een_rescaled_n_gl(i,jj,a,m,nw) <span style="color: #a020f0;">&</span>
|
|
) * cn
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_een_l</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org399976b" class="outline-4">
|
|
<h4 id="org399976b"><span class="section-number-4">4.2.7.</span> Force of \(\delta P\) matrix</h4>
|
|
<div class="outline-text-4" id="text-4-2-7">
|
|
<p>
|
|
Calculates the force of the \(\delta P\) matrix, required for force in a single-electron move. Here, the \(r^\text{new}\) and \(R^\text{new}\) are the new electron and nucleus positions of the electron that is being moved.
|
|
</p>
|
|
\begin{eqnarray*}
|
|
\partial_{\alpha,m}\delta P_{i,\alpha,k,l} &=& \partial_{\alpha,m} \left(\sum_{j=1}^{N_\text{elec}} \left( \delta \widetilde{r}_{ij}^k \widetilde{R}_{j\alpha}^l \delta_{i,\text{num}} \right)
|
|
+ \widetilde{r}_{i,\text{num}}^k \delta \widetilde{R}_{\text{num},\alpha}^l + \delta \widetilde{r}_{i,\text{num}}^k \left( \widetilde{R}_{\text{num},\alpha}^l
|
|
+ \delta \widetilde{R}_{\text{num},\alpha}^l \right)\right) \\
|
|
&=& \partial_{\alpha,m} \left(\sum_{j=1}^{N_\text{elec}} \left( \delta \widetilde{r}_{ij}^k \widetilde{R}_{j\alpha}^l \delta_{i,\text{num}} \right)
|
|
+ \widetilde{r}_{i,\text{num}}^k \widetilde{R}_{\text{num},\alpha}^l + {\widetilde{r}_{i,\text{num}}^{\text{new}}}^k {\widetilde{R}_{\text{num},\alpha}^{\text{new}}}^l \right) \\
|
|
&=& \left(\sum_{j=1}^{N_\text{elec}} \left( \delta \widetilde{r}_{ij}^k \partial_{\alpha,m} \widetilde{R}_{j\alpha}^l \delta_{i,\text{num}} \right)
|
|
+ \widetilde{r}_{i,\text{num}}^k \partial_{\alpha,m}\widetilde{R}_{\text{num},\alpha}^l + {\widetilde{r}_{i,\text{num}}^{\text{new}}}^k \partial_{\alpha,m}{\widetilde{R}_{\text{num},\alpha}^{\text{new}}}^l \right) \\
|
|
&=& \left(\sum_{j=1}^{N_\text{elec}} \left( -\delta \widetilde{r}_{ij}^k \partial_{i,m} \widetilde{R}_{j\alpha}^l \delta_{i,\text{num}} \right)
|
|
- \widetilde{r}_{i,\text{num}}^k \partial_{i,m}\widetilde{R}_{\text{num},\alpha}^l - {\widetilde{r}_{i,\text{num}}^{\text{new}}}^k \partial_{i,m}{\widetilde{R}_{\text{num},\alpha}^{\text{new}}}^l \right) \\
|
|
\end{eqnarray*}
|
|
|
|
<p>
|
|
The function <code>qmckl_set_single_point</code> has to be called before this function to set the new electron position.
|
|
</p>
|
|
</div>
|
|
<div id="outline-container-orgd450d68" class="outline-5">
|
|
<h5 id="orgd450d68"><span class="section-number-5">4.2.7.1.</span> Get</h5>
|
|
<div class="outline-text-5" id="text-4-2-7-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_forces_jastrow_delta_p</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_delta_p</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org2643f21" class="outline-5">
|
|
<h5 id="org2643f21"><span class="section-number-5">4.2.7.2.</span> Compute</h5>
|
|
<div class="outline-text-5" id="text-4-2-7-2">
|
|
<table id="org9f61e34" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Index of single electron</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>cord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">order of polynomials</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_e</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus single rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_e</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-electron single rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distances derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_n_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus single rescaled distances derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_delta_p</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][3][elec_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Force of \(\delta P\) matrix</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_forces_jastrow_delta_p_doc</span><span style="color: #a0522d;">( </span><span style="color: #a020f0;">&</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_single_n_gl, forces_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>(in) ::<span style="color: #a0522d;"> een_rescaled_n_gl(elec_num, 4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n_gl(4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_delta_p(elec_num,3,nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> tmp1, tmp2</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> delta_e(elec_num)</span>
|
|
|
|
|
|
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, p, m, n, nw, num</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> tmp, accu</span>
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> LDA, LDB, LDC</span>
|
|
|
|
num = num_in + 1_8
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 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>
|
|
forces_delta_p = 0.d0
|
|
<span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">endif</span>
|
|
|
|
|
|
<span style="color: #a020f0;">do</span> nw=1, walk_num
|
|
<span style="color: #a020f0;">do</span> m=0, cord_num-1
|
|
|
|
<span style="color: #a020f0;">do</span> j = 1, elec_num
|
|
delta_e(j) = een_rescaled_e(j,num,m,nw) - een_rescaled_single_e(j,m,nw)
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">do</span> l=1, cord_num
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
<span style="color: #a020f0;">do</span> k = 1, 3
|
|
tmp1 = een_rescaled_n_gl(num, k, a, l, nw)
|
|
tmp2 = een_rescaled_single_n_gl(k,a,l,nw)
|
|
accu = 0.d0
|
|
<span style="color: #a020f0;">do</span> j = 1, elec_num
|
|
forces_delta_p(j,k,a,l,m,nw) = een_rescaled_e(j,num,m,nw) * tmp1 - <span style="color: #a020f0;">&</span>
|
|
een_rescaled_single_e(j,m,nw) * tmp2
|
|
|
|
accu = accu + delta_e(j) * een_rescaled_n_gl(j,k,a,l,nw)
|
|
<span style="color: #a020f0;">end do</span>
|
|
forces_delta_p(num,k,a,l,m,nw) = forces_delta_p(num,k,a,l,m,nw) + accu
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_delta_p_doc</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_compute_forces_jastrow_delta_p_hpc</span> (<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">walk_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">elec_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nucl_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">cord_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_n</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_e</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_single_n</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_single_e</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_n_gl</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_single_n_gl</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_delta_p</span> )
|
|
{
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) <span style="color: #a020f0;">return</span> QMCKL_INVALID_CONTEXT;
|
|
<span style="color: #a020f0;">if</span> (num < 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_single_n_gl == <span style="color: #008b8b;">NULL</span>) <span style="color: #a020f0;">return</span> QMCKL_INVALID_ARG_12;
|
|
|
|
<span style="color: #a020f0;">if</span> (cord_num == 0) {
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">size_t</span> <span style="color: #a0522d;">dim</span> = elec_num*3*nucl_num*(cord_num+1)*cord_num;
|
|
<span style="color: #483d8b;"> #pragma</span> omp parallel <span style="color: #a020f0;">for</span>
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nw</span> = 0; nw < walk_num; ++nw) {
|
|
memset(&forces_delta_p[dim*nw],0,dim*<span style="color: #a020f0;">sizeof</span>(<span style="color: #228b22;">double</span>));
|
|
}
|
|
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
|
|
}
|
|
|
|
<span style="color: #483d8b;"> #pragma</span> omp parallel <span style="color: #a020f0;">for</span>
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nw</span> = 0; nw < walk_num; ++nw) {
|
|
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">m</span> = 0; m <= cord_num-1; ++m) {
|
|
|
|
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">delta_e</span>[elec_num];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_e_</span> = &een_rescaled_e[elec_num*(num+elec_num*(m+(cord_num+1)*nw))];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_single_e_</span> = &een_rescaled_single_e[elec_num*(m+(cord_num+1)*nw)];
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">j</span> = 0; j < elec_num; ++j) {
|
|
delta_e[j] = een_rescaled_e_[j] - een_rescaled_single_e_[j];
|
|
}
|
|
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">l</span> = 1; l <= cord_num; ++l) {
|
|
<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;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">k</span> = 0; k < 3; ++k) {
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">een_rescaled_n_gl_</span> = &een_rescaled_n_gl[elec_num*(k+4*(a+nucl_num*(l+(cord_num+1)*nw)))];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span> <span style="color: #a0522d;">tmp1</span> = een_rescaled_n_gl_[num];
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span> <span style="color: #a0522d;">tmp2</span> = een_rescaled_single_n_gl[k+4*(a+nucl_num*(l+(cord_num+1)*nw))];
|
|
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a0522d;">forces_delta_p_</span> = &forces_delta_p[elec_num*(k+3*(a+nucl_num*(l+(cord_num+1)*(m+cord_num*nw))))];
|
|
<span style="color: #228b22;">double</span> <span style="color: #a0522d;">accu</span> = 0.0;
|
|
<span style="color: #483d8b;"> #pragma</span> omp simd reduction(+:accu)
|
|
<span style="color: #a020f0;">for</span> (<span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">j</span> = 0; j < elec_num; ++j) {
|
|
forces_delta_p_[j] = een_rescaled_e_[j] * tmp1 - een_rescaled_single_e_[j] * tmp2;
|
|
accu += delta_e[j] * een_rescaled_n_gl_[j];
|
|
}
|
|
forces_delta_p_[num] += accu;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
<span style="color: #a020f0;">return</span> QMCKL_SUCCESS;
|
|
}
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgb37c61b" class="outline-4">
|
|
<h4 id="orgb37c61b"><span class="section-number-4">4.2.8.</span> Force of single electron-electron-nucleus Jastrow value</h4>
|
|
<div class="outline-text-4" id="text-4-2-8">
|
|
<p>
|
|
Computes the single-electron contribution to the electron-electron-nucleus Jastrow value force.
|
|
</p>
|
|
|
|
\begin{eqnarray*}
|
|
\partial_{\alpha,m} \delta J_{een} &=& \partial_{\alpha,m} \sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}} c_{l,k,p,\alpha} \left(
|
|
\sum_{i=1}^{N_\text{elec}} \left( \widetilde{R}_{i,\alpha,(p-k-l)/2} \delta P_{i,\alpha,k,(p-k+l)/2} \right)
|
|
+ \delta \widetilde{R}_{\text{num},\alpha,(p-k-l)/2} \left(P_{\text{num},\alpha,k,(p-k+l)/2} + \delta P_{\text{num},\alpha,k,(p-k+l)/2} \right)\right)\\
|
|
&=& \sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}} c_{l,k,p,\alpha} \left(
|
|
\sum_{i=1}^{N_\text{elec}} \left( \partial_{\alpha,m}\widetilde{R}_{i,\alpha,(p-k-l)/2} \delta P_{i,\alpha,k,(p-k+l)/2} + \widetilde{R}_{i,\alpha,(p-k-l)/2} \partial_{\alpha,m}\delta P_{i,\alpha,k,(p-k+l)/2} \right) \right.\\
|
|
&&\left. + \partial_{\alpha,m}\delta \widetilde{R}_{\text{num},\alpha,(p-k-l)/2} \left(P_{\text{num},\alpha,k,(p-k+l)/2} + \delta P_{\text{num},\alpha,k,(p-k+l)/2} \right)
|
|
+ \delta \widetilde{R}_{\text{num},\alpha,(p-k-l)/2} \left(\partial_{\alpha,m}P_{\text{num},\alpha,k,(p-k+l)/2} + \partial_{\alpha,m}\delta P_{\text{num},\alpha,k,(p-k+l)/2} \right)\right)\\
|
|
&=& \sum_{p=2}^{N_\text{nord}} \sum_{k=0}^{p-1} \sum_{l=0}^{p-k-2\delta_{k,0}} c_{l,k,p,\alpha} \left(
|
|
\sum_{i=1}^{N_\text{elec}} \left( -\partial_{i,m}\widetilde{R}_{i,\alpha,(p-k-l)/2} \delta P_{i,\alpha,k,(p-k+l)/2} + \widetilde{R}_{i,\alpha,(p-k-l)/2} \partial_{\alpha,m}\delta P_{i,\alpha,k,(p-k+l)/2} \right) \right.\\
|
|
&&\left. - \partial_{i,m}\delta \widetilde{R}_{\text{num},\alpha,(p-k-l)/2} \left(P_{\text{num},\alpha,k,(p-k+l)/2} + \delta P_{\text{num},\alpha,k,(p-k+l)/2} \right)
|
|
+ \delta \widetilde{R}_{\text{num},\alpha,(p-k-l)/2} \left(\partial_{\alpha,m}P_{\text{num},\alpha,k,(p-k+l)/2} + \partial_{\alpha,m}\delta P_{\text{num},\alpha,k,(p-k+l)/2} \right)\right)\\
|
|
\end{eqnarray*}
|
|
|
|
<p>
|
|
The function <code>qmckl_set_single_point</code> has to be called before this function to set the new electron position.
|
|
</p>
|
|
</div>
|
|
<div id="outline-container-orgcd33219" class="outline-5">
|
|
<h5 id="orgcd33219"><span class="section-number-5">4.2.8.1.</span> Get</h5>
|
|
<div class="outline-text-5" id="text-4-2-8-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_forces_jastrow_single_een</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_jastrow_single_een</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org41a04d7" class="outline-5">
|
|
<h5 id="org41a04d7"><span class="section-number-5">4.2.8.2.</span> Compute</h5>
|
|
<div class="outline-text-5" id="text-4-2-8-2">
|
|
<table id="orgf64af02" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Index of single electron</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>walk_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of walkers</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>elec_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of electrons</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>cord_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">order of polynomials</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>dim_c_vector</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">dimension of full coefficient vector</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>c_vector_full</code></td>
|
|
<td class="org-left"><code>double[dim_c_vector][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">full coefficient vector</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>lkpm_combined_index</code></td>
|
|
<td class="org-left"><code>int64_t[4][dim_c_vector]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">combined indices</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>delta_p</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">\(\delta P\) matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_delta_p</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][3][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Force of $δ P$matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>tmp_c</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">P matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_tmp_c</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num-1][0:cord_num][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Force of P matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_n</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus single rescaled distances</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_n_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4][elec_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus rescaled distances derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>een_rescaled_single_n_gl</code></td>
|
|
<td class="org-left"><code>double[walk_num][0:cord_num][nucl_num][4]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Electron-nucleus single rescaled distances derivatives</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_jastrow_single_een</code></td>
|
|
<td class="org-left"><code>double[walk_num][nucl_num][3]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Single electron–electron-nucleus Jastrow forces</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_single_een_doc</span>( <span style="color: #a020f0;">&</span>
|
|
context, num_in, walk_num, elec_num, nucl_num, cord_num, <span style="color: #a020f0;">&</span>
|
|
dim_c_vector, c_vector_full, lkpm_combined_index, <span style="color: #a020f0;">&</span>
|
|
delta_p, forces_delta_p, tmp_c, forces_tmp_c, <span style="color: #a020f0;">&</span>
|
|
een_rescaled_n, een_rescaled_single_n, een_rescaled_n_gl, een_rescaled_single_n_gl, forces_jastrow_single_een) <span style="color: #a020f0;">&</span>
|
|
<span style="color: #a020f0;">bind</span>(C) <span style="color: #a020f0;">result</span>(info)
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
|
|
<span style="color: #228b22;">integer</span> (qmckl_context), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> nucl_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> dim_c_vector</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> cord_num</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> lkpm_combined_index(dim_c_vector,4)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> c_vector_full(nucl_num, dim_c_vector)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> delta_p(elec_num, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> forces_delta_p(elec_num, 3, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> tmp_c(elec_num, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> forces_tmp_c(elec_num, 4, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n(elec_num, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n(nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n_gl(elec_num, 4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n_gl(4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_jastrow_single_een(3,nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
|
|
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> een_rescaled_delta_n(nucl_num, 0:cord_num), een_rescaled_delta_n_gl(3,nucl_num, 0:cord_num)</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, p, m, n, nw, num, kk</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> accu, accu2, cn</span>
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> LDA, LDB, LDC</span>
|
|
|
|
num = num_in + 1
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 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>
|
|
|
|
forces_jastrow_single_een = 0.0d0
|
|
|
|
<span style="color: #a020f0;">if</span> (cord_num == 0) <span style="color: #a020f0;">return</span>
|
|
|
|
<span style="color: #a020f0;">do</span> nw =1, walk_num
|
|
een_rescaled_delta_n(:,:) = een_rescaled_single_n(:,:,nw) - een_rescaled_n(num,:,:,nw)
|
|
<span style="color: #a020f0;">do</span> kk = 1,3
|
|
een_rescaled_delta_n_gl(kk,:,:) = een_rescaled_single_n_gl(kk,:,:,nw) - een_rescaled_n_gl(num,kk,:,:,nw)
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">do</span> n = 1, dim_c_vector
|
|
l = lkpm_combined_index(n, 1)
|
|
k = lkpm_combined_index(n, 2)
|
|
p = lkpm_combined_index(n, 3)
|
|
m = lkpm_combined_index(n, 4)
|
|
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
cn = c_vector_full(a, n)
|
|
<span style="color: #a020f0;">if</span>(cn == 0.d0) <span style="color: #a020f0;">cycle</span>
|
|
<span style="color: #a020f0;">do</span> kk = 1, 3
|
|
accu = 0.0d0
|
|
<span style="color: #a020f0;">do</span> j = 1, elec_num
|
|
accu = accu - een_rescaled_n_gl(j,kk,a,m,nw) * delta_p(j,a,m+l,k,nw) + <span style="color: #a020f0;">&</span>
|
|
een_rescaled_n(j,a,m,nw) * forces_delta_p(j,kk,a,m+l,k,nw)
|
|
<span style="color: #a020f0;">end do</span>
|
|
accu = accu - een_rescaled_delta_n_gl(kk,a,m) * (tmp_c(num,a,m+l,k,nw) + delta_p(num,a,m+l,k,nw)) + <span style="color: #a020f0;">&</span>
|
|
een_rescaled_delta_n(a,m) * (forces_tmp_c(num,kk,a,m+l,k,nw) + forces_delta_p(num,kk,a,m+l,k,nw))
|
|
forces_jastrow_single_een(kk,a,nw) = forces_jastrow_single_een(kk,a,nw) + accu * cn
|
|
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_single_een_doc</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_single_een_hpc</span>( <span style="color: #a020f0;">&</span>
|
|
context, num_in, walk_num, elec_num, nucl_num, cord_num, <span style="color: #a020f0;">&</span>
|
|
dim_c_vector, c_vector_full, lkpm_combined_index, <span style="color: #a020f0;">&</span>
|
|
delta_p, forces_delta_p, tmp_c, forces_tmp_c, <span style="color: #a020f0;">&</span>
|
|
een_rescaled_n, een_rescaled_single_n, een_rescaled_n_gl, een_rescaled_single_n_gl, forces_jastrow_single_een) <span style="color: #a020f0;">&</span>
|
|
<span style="color: #a020f0;">bind</span>(C) <span style="color: #a020f0;">result</span>(info)
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
|
|
<span style="color: #228b22;">integer</span> (qmckl_context), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> num_in</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> walk_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> elec_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> nucl_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> dim_c_vector</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> cord_num</span>
|
|
<span style="color: #228b22;">integer</span>(<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> lkpm_combined_index(dim_c_vector,4)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> c_vector_full(nucl_num, dim_c_vector)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> delta_p(elec_num, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> forces_delta_p(elec_num, 3, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> tmp_c(elec_num, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> forces_tmp_c(elec_num, 4, nucl_num,0:cord_num, 0:cord_num-1, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n(elec_num, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n(nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_n_gl(elec_num, 4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> een_rescaled_single_n_gl(4, nucl_num, 0:cord_num, walk_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_jastrow_single_een(3,nucl_num,walk_num)</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
|
|
|
|
<span style="color: #228b22;">double precision</span>, <span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> een_rescaled_delta_n(:, :), een_rescaled_delta_n_gl(:,:,:)</span>
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i, a, j, l, k, p, m, n, nw, num, kk</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> accu2, cn</span>
|
|
<span style="color: #228b22;">double precision</span>, <span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> accu(:,:), tmp(:)</span>
|
|
<span style="color: #228b22;">double precision</span>, <span style="color: #a020f0;">external</span> ::<span style="color: #a0522d;"> ddot</span>
|
|
<span style="color: #228b22;">integer</span> ::<span style="color: #a0522d;"> elec_num4</span>
|
|
|
|
|
|
num = num_in + 1
|
|
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">if</span> (context == QMCKL_NULL_CONTEXT) info = QMCKL_INVALID_CONTEXT
|
|
<span style="color: #a020f0;">if</span> (walk_num <= 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>
|
|
|
|
forces_jastrow_single_een = 0.0d0
|
|
|
|
<span style="color: #a020f0;">if</span> (cord_num == 0) <span style="color: #a020f0;">return</span>
|
|
|
|
<span style="color: #a020f0;">allocate</span>(een_rescaled_delta_n(nucl_num, 0:cord_num), een_rescaled_delta_n_gl(3,nucl_num, 0:cord_num), <span style="color: #a020f0;">&</span>
|
|
accu(3,nucl_num), tmp(nucl_num))
|
|
|
|
elec_num4 = <span style="color: #a020f0;">int</span>(elec_num,4)
|
|
<span style="color: #a020f0;">do</span> nw =1, walk_num
|
|
een_rescaled_delta_n(:,:) = een_rescaled_single_n(:,:,nw) - een_rescaled_n(num,:,:,nw)
|
|
een_rescaled_delta_n_gl(1:3,:,:) = een_rescaled_single_n_gl(1:3,:,:,nw) - een_rescaled_n_gl(num,1:3,:,:,nw)
|
|
<span style="color: #a020f0;">do</span> n = 1, dim_c_vector
|
|
l = lkpm_combined_index(n, 1)
|
|
k = lkpm_combined_index(n, 2)
|
|
p = lkpm_combined_index(n, 3)
|
|
m = lkpm_combined_index(n, 4)
|
|
|
|
<span style="color: #a020f0;">do</span> a = 1, nucl_num
|
|
cn = c_vector_full(a, n)
|
|
accu(1:3,a) = 0.0d0
|
|
<span style="color: #a020f0;">if</span>(cn == 0.d0) <span style="color: #a020f0;">cycle</span>
|
|
tmp(a) = tmp_c(num,a,m+l,k,nw) + delta_p(num,a,m+l,k,nw)
|
|
<span style="color: #a020f0;">call</span> <span style="color: #0000ff;">dgemv</span>(<span style="color: #8b2252;">'T'</span>, elec_num4, 3, -1.d0, een_rescaled_n_gl(1,1,a,m,nw), elec_num4, <span style="color: #a020f0;">&</span>
|
|
delta_p(1,a,m+l,k,nw), 1, 0.d0, accu(1,a), 1)
|
|
<span style="color: #a020f0;">call</span> <span style="color: #0000ff;">dgemv</span>(<span style="color: #8b2252;">'T'</span>, elec_num4, 3, 1.d0, forces_delta_p(1,1,a,m+l,k,nw), elec_num4, <span style="color: #a020f0;">&</span>
|
|
een_rescaled_n(1,a,m,nw), 1, 1.d0, accu(1,a), 1)
|
|
|
|
<span style="color: #a020f0;">enddo</span>
|
|
|
|
accu(1,:) = accu(1,:) - een_rescaled_delta_n_gl(1,:,m)*tmp(:)
|
|
accu(2,:) = accu(2,:) - een_rescaled_delta_n_gl(2,:,m)*tmp(:)
|
|
accu(3,:) = accu(3,:) - een_rescaled_delta_n_gl(3,:,m)*tmp(:)
|
|
|
|
accu(1,:) = accu(1,:) + een_rescaled_delta_n(:,m)*forces_tmp_c(num,1,:,m+l,k,nw)
|
|
accu(2,:) = accu(2,:) + een_rescaled_delta_n(:,m)*forces_tmp_c(num,2,:,m+l,k,nw)
|
|
accu(3,:) = accu(3,:) + een_rescaled_delta_n(:,m)*forces_tmp_c(num,3,:,m+l,k,nw)
|
|
|
|
accu(1,:) = accu(1,:) + een_rescaled_delta_n(:,m)*forces_delta_p(num,1,:,m+l,k,nw)
|
|
accu(2,:) = accu(2,:) + een_rescaled_delta_n(:,m)*forces_delta_p(num,2,:,m+l,k,nw)
|
|
accu(3,:) = accu(3,:) + een_rescaled_delta_n(:,m)*forces_delta_p(num,3,:,m+l,k,nw)
|
|
|
|
forces_jastrow_single_een(1,:,nw) = forces_jastrow_single_een(1,:,nw) + accu(1,:) * c_vector_full(:,n)
|
|
forces_jastrow_single_een(2,:,nw) = forces_jastrow_single_een(2,:,nw) + accu(2,:) * c_vector_full(:,n)
|
|
forces_jastrow_single_een(3,:,nw) = forces_jastrow_single_een(3,:,nw) + accu(3,:) * c_vector_full(:,n)
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_jastrow_single_een_hpc</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org8c04d8b" class="outline-2">
|
|
<h2 id="org8c04d8b"><span class="section-number-2">5.</span> Forces of the orbitals</h2>
|
|
<div class="outline-text-2" id="text-5">
|
|
</div>
|
|
<div id="outline-container-org21630fb" class="outline-3">
|
|
<h3 id="org21630fb"><span class="section-number-3">5.1.</span> Force of AO value</h3>
|
|
<div class="outline-text-3" id="text-5-1">
|
|
<p>
|
|
Computes the forces on the values of the atomic orbitals (AO). These are equal to the gradients of the AOs multiplied with a minus sign, and summed over different indices.
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org8280aab" class="outline-4">
|
|
<h4 id="org8280aab"><span class="section-number-4">5.1.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-5-1-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_forces_ao_value</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_ao_value</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org224a093" class="outline-4">
|
|
<h4 id="org224a093"><span class="section-number-4">5.1.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-5-1-2">
|
|
<table id="org26e512a" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>ao_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of AOs</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>shell_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of shells</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>point_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of points</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucleus_index</code></td>
|
|
<td class="org-left"><code>int64_t[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Index of the 1st shell of each nucleus</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucleus_shell_num</code></td>
|
|
<td class="org-left"><code>int64_t[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of shells per nucleus</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>shell_ang_mom</code></td>
|
|
<td class="org-left"><code>int32_t[shell_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Angular momentum of each shell</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>ao_factor</code></td>
|
|
<td class="org-left"><code>double[ao_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Normalization factor of the AOs</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>ao_vgl</code></td>
|
|
<td class="org-left"><code>double[point_num][5][shell_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Value, gradients and Laplacian of the shells</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_ao_value</code></td>
|
|
<td class="org-left"><code>double[nucl_num][point_num][3][ao_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Forces of the AOs</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #a020f0;">function</span> <span style="color: #0000ff;">qmckl_compute_forces_ao_value_doc</span>(context, <span style="color: #a020f0;">&</span>
|
|
ao_num, shell_num, point_num, nucl_num, <span style="color: #a020f0;">&</span>
|
|
nucleus_index, nucleus_shell_num, <span style="color: #a020f0;">&</span>
|
|
shell_ang_mom, ao_factor, ao_vgl, forces_ao_value) <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_constants</span>
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>, <span style="color: #a020f0;">only</span> : qmckl_ao_polynomial_vgl, qmckl_get_numprec_precision
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span> (qmckl_context), <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> ao_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> shell_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> point_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) , <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> nucl_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> nucleus_index(nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> nucleus_shell_num(nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int32_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> shell_ang_mom(shell_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> ao_factor(ao_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> ao_vgl(ao_num,5,point_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_ao_value(ao_num,3,point_num,nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_exit_code) ::<span style="color: #a0522d;"> info</span>
|
|
|
|
<span style="color: #228b22;">integer</span> ::<span style="color: #a0522d;"> l, il, k</span>
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> ipoint, inucl</span>
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> ishell_start, ishell_end, ishell</span>
|
|
<span style="color: #228b22;">integer</span> ::<span style="color: #a0522d;"> lstart(0:20)</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> x, y, z, r2</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> cutoff</span>
|
|
|
|
<span style="color: #228b22;">integer</span> , <span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> ao_index(:)</span>
|
|
<span style="color: #a020f0;">allocate</span>(ao_index(ao_num))
|
|
|
|
!<span style="color: #b22222;">forces_ao_value = 0.d0</span>
|
|
|
|
! <span style="color: #b22222;">Pre-computed data</span>
|
|
<span style="color: #a020f0;">do</span> l=0,20
|
|
lstart(l) = l*(l+1)*(l+2)/6 +1
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
k=1
|
|
<span style="color: #a020f0;">do</span> inucl=1,nucl_num
|
|
ishell_start = nucleus_index(inucl) + 1
|
|
ishell_end = nucleus_index(inucl) + nucleus_shell_num(inucl)
|
|
<span style="color: #a020f0;">do</span> ishell = ishell_start, ishell_end
|
|
l = shell_ang_mom(ishell)
|
|
ao_index(ishell) = k
|
|
k = k + lstart(l+1) - lstart(l)
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
info = QMCKL_SUCCESS
|
|
|
|
|
|
<span style="color: #a020f0;">do</span> ipoint = 1, point_num
|
|
<span style="color: #a020f0;">do</span> inucl=1,nucl_num
|
|
! <span style="color: #b22222;">Loop over shells</span>
|
|
ishell_start = nucleus_index(inucl) + 1
|
|
ishell_end = nucleus_index(inucl) + nucleus_shell_num(inucl)
|
|
<span style="color: #a020f0;">do</span> ishell = ishell_start, ishell_end
|
|
l = shell_ang_mom(ishell)
|
|
<span style="color: #a020f0;">do</span> k = ao_index(ishell), ao_index(ishell) + lstart(l+1)-lstart(l) -1
|
|
forces_ao_value(k,1,ipoint,inucl) = -ao_vgl(k,2,ipoint)
|
|
forces_ao_value(k,2,ipoint,inucl) = -ao_vgl(k,3,ipoint)
|
|
forces_ao_value(k,3,ipoint,inucl) = -ao_vgl(k,4,ipoint)
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">deallocate</span>(ao_index)
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_ao_value_doc</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org0d71afb" class="outline-3">
|
|
<h3 id="org0d71afb"><span class="section-number-3">5.2.</span> Force of MO value</h3>
|
|
<div class="outline-text-3" id="text-5-2">
|
|
<p>
|
|
Calculates the force on the molecular orbitals (MO) values. These are calculated by taking a linear combination of AOs.
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-orga011cc4" class="outline-4">
|
|
<h4 id="orga011cc4"><span class="section-number-4">5.2.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-5-2-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_forces_mo_value</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_mo_value</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_forces_mo_value_inplace</span> (<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_mo_value</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org1ced40f" class="outline-4">
|
|
<h4 id="org1ced40f"><span class="section-number-4">5.2.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-5-2-2">
|
|
<table id="orga6d89e2" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of AOs</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>ao_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of AOs</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>mo_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of MOs</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>point_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of points</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>shell_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of shells</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucleus_index</code></td>
|
|
<td class="org-left"><code>int64_t[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Index of the 1st shell of each nucleus</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucleus_shell_num</code></td>
|
|
<td class="org-left"><code>int64_t[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of shells per nucleus</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>shell_ang_mom</code></td>
|
|
<td class="org-left"><code>int32_t[shell_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Angular momentum of each shell</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>coefficient_t</code></td>
|
|
<td class="org-left"><code>double[mo_num][ao_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Transpose of the AO to MO transformation matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>ao_vgl</code></td>
|
|
<td class="org-left"><code>double[point_num][3][ao_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">AO values, gradient and Laplacian</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_mo_value</code></td>
|
|
<td class="org-left"><code>double[nucl_num][point_num][3][mo_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Forces of MOs</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span>(qmckl_exit_code)<span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_forces_mo_value_doc</span><span style="color: #a0522d;">(context, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> nucl_num,ao_num, mo_num, point_num, shell_num, nucleus_index, nucleus_shell_num, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> shell_ang_mom, coefficient_t, ao_vgl, forces_mo_value) </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;">nucl_num, ao_num, mo_num, point_num, shell_num</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> ao_vgl(ao_num,5,point_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coefficient_t(mo_num,ao_num)</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> nucleus_index(nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> nucleus_shell_num(nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int32_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> shell_ang_mom(shell_num)</span>
|
|
<span style="color: #228b22;">real</span>(<span style="color: #008b8b;">c_double</span>) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_mo_value(mo_num,3,point_num,nucl_num)</span>
|
|
|
|
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i,j,a, m, ishell_start, ishell_end, il, ishell</span>
|
|
<span style="color: #228b22;">integer</span> ::<span style="color: #a0522d;"> l, k</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> c1, c2, c3, coef</span>
|
|
|
|
<span style="color: #228b22;">integer</span>, <span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> ao_index(:)</span>
|
|
<span style="color: #228b22;">integer</span> ::<span style="color: #a0522d;"> lstart(0:20)</span>
|
|
|
|
<span style="color: #a020f0;">allocate</span>(ao_index(ao_num))
|
|
|
|
<span style="color: #a020f0;">do</span> l=0,20
|
|
lstart(l) = l*(l+1)*(l+2)/6 +1
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
k=1
|
|
<span style="color: #a020f0;">do</span> a=1,nucl_num
|
|
ishell_start = nucleus_index(a) + 1
|
|
ishell_end = nucleus_index(a) + nucleus_shell_num(a)
|
|
<span style="color: #a020f0;">do</span> ishell = ishell_start, ishell_end
|
|
l = shell_ang_mom(ishell)
|
|
ao_index(ishell) = k
|
|
k = k + lstart(l+1) - lstart(l)
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
|
|
info = QMCKL_SUCCESS
|
|
<span style="color: #a020f0;">do</span> a=1,nucl_num
|
|
ishell_start = nucleus_index(a) + 1
|
|
ishell_end = nucleus_index(a) + nucleus_shell_num(a)
|
|
<span style="color: #a020f0;">do</span> j=1,point_num
|
|
forces_mo_value(:,:,j,a) = 0.0d0
|
|
<span style="color: #a020f0;">do</span> ishell = ishell_start, ishell_end
|
|
l = shell_ang_mom(ishell)
|
|
<span style="color: #a020f0;">do</span> k=ao_index(ishell), ao_index(ishell) + lstart(l+1)-lstart(l)-1
|
|
c1 = ao_vgl(k,2,j)
|
|
c2 = ao_vgl(k,3,j)
|
|
c3 = ao_vgl(k,4,j)
|
|
<span style="color: #a020f0;">do</span> i=1,mo_num
|
|
coef = coefficient_t(i,k)
|
|
forces_mo_value(i,1,j,a) = forces_mo_value(i,1,j,a) - c1 * coef
|
|
forces_mo_value(i,2,j,a) = forces_mo_value(i,2,j,a) - c2 * coef
|
|
forces_mo_value(i,3,j,a) = forces_mo_value(i,3,j,a) - c3 * coef
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">deallocate</span>(ao_index)
|
|
|
|
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_mo_value_doc</span>
|
|
</pre>
|
|
</div>
|
|
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_forces_mo_value_doc</span> (
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nucl_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">ao_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">mo_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">point_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">shell_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">nucleus_index</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">nucleus_shell_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int32_t</span>* <span style="color: #a0522d;">shell_ang_mom</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">coefficient_t</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ao_vgl</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_mo_value</span> );
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org68fe41e" class="outline-3">
|
|
<h3 id="org68fe41e"><span class="section-number-3">5.3.</span> Force of MO gradient</h3>
|
|
<div class="outline-text-3" id="text-5-3">
|
|
<p>
|
|
Calculates the forces of the gradients of the MOs. These are calculated by taking a linear combination of the required components of the Hessian of the AOs.
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-orgfba1f64" class="outline-4">
|
|
<h4 id="orgfba1f64"><span class="section-number-4">5.3.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-5-3-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_forces_mo_g</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_mo_g</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
|
|
<span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_forces_mo_g_inplace</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_mo_g</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org380d151" class="outline-4">
|
|
<h4 id="org380d151"><span class="section-number-4">5.3.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-5-3-2">
|
|
<table id="orgb3f329e" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>ao_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of AOs</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>mo_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of MOs</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>point_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of points</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>shell_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of shells</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucleus_index</code></td>
|
|
<td class="org-left"><code>int64_t[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Index of the 1st shell of each nucleus</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucleus_shell_num</code></td>
|
|
<td class="org-left"><code>int64_t[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of shells per nucleus</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>shell_ang_mom</code></td>
|
|
<td class="org-left"><code>int32_t[shell_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Angular momentum of each shell</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>coefficient_t</code></td>
|
|
<td class="org-left"><code>double[mo_num][ao_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Transpose of the AO to MO transformation matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>ao_hessian</code></td>
|
|
<td class="org-left"><code>double[3][point_num][4][ao_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Hessian of AOs</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_mo_g</code></td>
|
|
<td class="org-left"><code>double[nucl_num][3][point_num][3][mo_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Forces on gradients of MOs</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_forces_mo_g_doc</span><span style="color: #a0522d;">(context, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> ao_num, mo_num, point_num, nucl_num, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> shell_num, nucleus_index, nucleus_shell_num, shell_ang_mom, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> coefficient_t, ao_hessian, forces_mo_g) </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> bind(C) result(info)</span>
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> nucl_num, ao_num, mo_num, point_num, shell_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> nucleus_index(nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> nucleus_shell_num(nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int32_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> shell_ang_mom(shell_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coefficient_t(mo_num,ao_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> ao_hessian(ao_num,4,point_num,3)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_mo_g(mo_num,3,point_num,3,nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i,j, m, n,a</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> c1</span>
|
|
|
|
<span style="color: #228b22;">double precision</span>, <span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> tmp(:,:,:,:)</span>
|
|
|
|
<span style="color: #a020f0;">allocate</span>(tmp(ao_num,3,point_num,3))
|
|
<span style="color: #a020f0;">do</span> a=1,nucl_num
|
|
! <span style="color: #b22222;">BROKEN</span>
|
|
tmp(:,1:3,:,:) = ao_hessian(:,1:3,:,:)
|
|
info = qmckl_dgemm(context, <span style="color: #8b2252;">'N'</span>, <span style="color: #8b2252;">'N'</span>, mo_num, 3*point_num*3, ao_num, <span style="color: #a020f0;">&</span>
|
|
-1.d0, coefficient_t, mo_num, <span style="color: #a020f0;">&</span>
|
|
tmp, ao_num, 0.d0, forces_mo_g(1,1,1,1,a), mo_num)
|
|
<span style="color: #a020f0;">if</span> (info /= 0) <span style="color: #a020f0;">return</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
|
|
<span style="color: #a020f0;">deallocate</span>(tmp)
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_mo_g_doc</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_forces_mo_g_hpc</span><span style="color: #a0522d;">(context, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> ao_num, mo_num, point_num, nucl_num, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> shell_num, nucleus_index, nucleus_shell_num, shell_ang_mom, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> coefficient_t, ao_hessian, forces_mo_g) </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> bind(C) result(info)</span>
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> nucl_num, ao_num, mo_num, point_num, shell_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> nucleus_index(nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> nucleus_shell_num(nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int32_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> shell_ang_mom(shell_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coefficient_t(mo_num,ao_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> ao_hessian(ao_num,4,point_num,3)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_mo_g(mo_num,3,point_num,3,nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i,j, m, n,a</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> c1</span>
|
|
|
|
<span style="color: #228b22;">integer</span> ::<span style="color: #a0522d;"> l, il, k, ao_ind</span>
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> ishell_start, ishell_end, ishell</span>
|
|
<span style="color: #228b22;">integer</span> ::<span style="color: #a0522d;"> lstart(0:20)</span>
|
|
|
|
<span style="color: #228b22;">integer</span> , <span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> ao_index(:)</span>
|
|
<span style="color: #a020f0;">allocate</span>(ao_index(ao_num))
|
|
|
|
<span style="color: #a020f0;">do</span> l=0,20
|
|
lstart(l) = l*(l+1)*(l+2)/6 +1
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
k=1
|
|
<span style="color: #a020f0;">do</span> a=1,nucl_num
|
|
ishell_start = nucleus_index(a) + 1
|
|
ishell_end = nucleus_index(a) + nucleus_shell_num(a)
|
|
<span style="color: #a020f0;">do</span> ishell = ishell_start, ishell_end
|
|
l = shell_ang_mom(ishell)
|
|
ao_index(ishell) = k
|
|
k = k + lstart(l+1) - lstart(l)
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
info = QMCKL_SUCCESS
|
|
|
|
|
|
<span style="color: #a020f0;">do</span> a=1,nucl_num
|
|
ishell_start = nucleus_index(a) + 1
|
|
ishell_end = nucleus_index(a) + nucleus_shell_num(a)
|
|
<span style="color: #a020f0;">do</span> n = 1, 3
|
|
<span style="color: #a020f0;">do</span> j=1,point_num
|
|
forces_mo_g(:,:,j,n,a) = 0.d0
|
|
<span style="color: #a020f0;">do</span> m = 1, 3
|
|
<span style="color: #a020f0;">do</span> ishell = ishell_start, ishell_end
|
|
l = shell_ang_mom(ishell)
|
|
il = lstart(l+1)-lstart(l)
|
|
ao_ind = ao_index(ishell)
|
|
<span style="color: #a020f0;">do</span> k = ao_ind, ao_ind + il - 1
|
|
c1 = ao_hessian(k, m, j, n)
|
|
<span style="color: #a020f0;">if</span> (c1 /= 0.d0) <span style="color: #a020f0;">then</span>
|
|
<span style="color: #a020f0;">do</span> i=1,mo_num
|
|
forces_mo_g(i, m, j, n, a) = forces_mo_g(i, m, j, n, a) - <span style="color: #a020f0;">&</span>
|
|
coefficient_t(i,k) * c1
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end if</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
<span style="color: #a020f0;">deallocate</span>(ao_index)
|
|
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_mo_g_hpc</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_forces_mo_g</span> (
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">ao_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">mo_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">point_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nucl_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">shell_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">nucleus_index</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">nucleus_shell_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int32_t</span>* <span style="color: #a0522d;">shell_ang_mom</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">coefficient_t</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ao_hessian</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_mo_g</span> );
|
|
|
|
<span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_forces_mo_g_doc</span> (
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">ao_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">mo_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">point_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nucl_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">shell_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">nucleus_index</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">nucleus_shell_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int32_t</span>* <span style="color: #a0522d;">shell_ang_mom</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">coefficient_t</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ao_hessian</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_mo_g</span> );
|
|
|
|
<span style="color: #228b22;">qmckl_exit_code</span> <span style="color: #0000ff;">qmckl_compute_forces_mo_g_hpc</span> (
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">ao_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">mo_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">point_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">nucl_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">shell_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">nucleus_index</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span>* <span style="color: #a0522d;">nucleus_shell_num</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int32_t</span>* <span style="color: #a0522d;">shell_ang_mom</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">coefficient_t</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">double</span>* <span style="color: #a0522d;">ao_hessian</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_mo_g</span> );
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-orgae9357c" class="outline-3">
|
|
<h3 id="orgae9357c"><span class="section-number-3">5.4.</span> Force of MO Laplacian</h3>
|
|
<div class="outline-text-3" id="text-5-4">
|
|
<p>
|
|
Computes the forces on the Laplacian of the MOs. They are calculated by taking a linear combination of the <code>ao_hessian[:,:,:,3,:]</code> components of the AO Hessian. These store the derivatives of the Laplacian of the AO.
|
|
</p>
|
|
</div>
|
|
|
|
<div id="outline-container-org1f3de9c" class="outline-4">
|
|
<h4 id="org1f3de9c"><span class="section-number-4">5.4.1.</span> Get</h4>
|
|
<div class="outline-text-4" id="text-5-4-1">
|
|
<div class="org-src-container">
|
|
<pre class="src src-c"><span style="color: #228b22;">qmckl_exit_code</span>
|
|
<span style="color: #0000ff;">qmckl_get_forces_mo_l</span>(<span style="color: #228b22;">qmckl_context</span> <span style="color: #a0522d;">context</span>,
|
|
<span style="color: #228b22;">double</span>* <span style="color: #a020f0;">const</span> <span style="color: #a0522d;">forces_mo_l</span>,
|
|
<span style="color: #a020f0;">const</span> <span style="color: #228b22;">int64_t</span> <span style="color: #a0522d;">size_max</span>);
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="outline-container-org9fe509c" class="outline-4">
|
|
<h4 id="org9fe509c"><span class="section-number-4">5.4.2.</span> Compute</h4>
|
|
<div class="outline-text-4" id="text-5-4-2">
|
|
<table id="org2607060" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
|
|
|
|
|
|
<colgroup>
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
|
|
<col class="org-left" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="org-left">Variable</th>
|
|
<th scope="col" class="org-left">Type</th>
|
|
<th scope="col" class="org-left">In/Out</th>
|
|
<th scope="col" class="org-left">Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="org-left"><code>context</code></td>
|
|
<td class="org-left"><code>qmckl_context</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Global state</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>ao_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of AOs</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>mo_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of MOs</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>point_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of points</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucl_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of nuclei</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>shell_num</code></td>
|
|
<td class="org-left"><code>int64_t</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of shells</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucleus_index</code></td>
|
|
<td class="org-left"><code>int64_t[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Index of the 1st shell of each nucleus</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>nucleus_shell_num</code></td>
|
|
<td class="org-left"><code>int64_t[nucl_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Number of shells per nucleus</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>shell_ang_mom</code></td>
|
|
<td class="org-left"><code>int32_t[shell_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Angular momentum of each shell</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>coefficient_t</code></td>
|
|
<td class="org-left"><code>double[mo_num][ao_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Transpose of the AO to MO transformation matrix</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>ao_hessian</code></td>
|
|
<td class="org-left"><code>double[3][point_num][4][ao_num]</code></td>
|
|
<td class="org-left">in</td>
|
|
<td class="org-left">Hessian of AOs</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="org-left"><code>forces_mo_l</code></td>
|
|
<td class="org-left"><code>double[nucl_num][3][point_num][mo_num]</code></td>
|
|
<td class="org-left">out</td>
|
|
<td class="org-left">Forces on MO Laplacian</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
|
|
<div class="org-src-container">
|
|
<pre class="src src-f90"><span style="color: #228b22;">integer</span><span style="color: #a0522d;"> </span><span style="color: #a020f0;">function</span><span style="color: #a0522d;"> </span><span style="color: #0000ff;">qmckl_compute_forces_mo_l_doc</span><span style="color: #a0522d;">(context, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> ao_num, mo_num, point_num, nucl_num, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> shell_num, nucleus_index, nucleus_shell_num, shell_ang_mom, </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> coefficient_t, ao_hessian, forces_mo_l) </span><span style="color: #a020f0;">&</span>
|
|
<span style="color: #a0522d;"> bind(C) result(info)</span>
|
|
<span style="color: #a020f0;">use</span> <span style="color: #0000ff;">qmckl</span>
|
|
<span style="color: #a020f0;">implicit</span> <span style="color: #228b22;">none</span>
|
|
<span style="color: #228b22;">integer</span>(qmckl_context), <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> context</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in), <span style="color: #a020f0;">value</span> ::<span style="color: #a0522d;"> nucl_num, ao_num, mo_num, point_num, shell_num</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> nucleus_index(nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int64_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> nucleus_shell_num(nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span> (<span style="color: #008b8b;">c_int32_t</span>) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> shell_ang_mom(shell_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> coefficient_t(mo_num,ao_num)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(in) ::<span style="color: #a0522d;"> ao_hessian(ao_num,4,point_num,3)</span>
|
|
<span style="color: #228b22;">real</span> (<span style="color: #008b8b;">c_double</span> ) , <span style="color: #a020f0;">intent</span>(out) ::<span style="color: #a0522d;"> forces_mo_l(mo_num,point_num,3,nucl_num)</span>
|
|
<span style="color: #228b22;">integer</span>*8 ::<span style="color: #a0522d;"> i,j, m, n,a, il, ishell, ishell_start, ishell_end</span>
|
|
<span style="color: #228b22;">integer</span> ::<span style="color: #a0522d;"> lstart(0:20)</span>
|
|
<span style="color: #228b22;">integer</span> ::<span style="color: #a0522d;"> l, k</span>
|
|
<span style="color: #228b22;">double precision</span> ::<span style="color: #a0522d;"> c1</span>
|
|
|
|
<span style="color: #228b22;">integer</span> , <span style="color: #a020f0;">allocatable</span> ::<span style="color: #a0522d;"> ao_index(:)</span>
|
|
<span style="color: #a020f0;">allocate</span>(ao_index(ao_num))
|
|
|
|
<span style="color: #a020f0;">do</span> l=0,20
|
|
lstart(l) = l*(l+1)*(l+2)/6 +1
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
k=1
|
|
<span style="color: #a020f0;">do</span> a=1,nucl_num
|
|
ishell_start = nucleus_index(a) + 1
|
|
ishell_end = nucleus_index(a) + nucleus_shell_num(a)
|
|
<span style="color: #a020f0;">do</span> ishell = ishell_start, ishell_end
|
|
l = shell_ang_mom(ishell)
|
|
ao_index(ishell) = k
|
|
k = k + lstart(l+1) - lstart(l)
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
forces_mo_l = 0.d0
|
|
info = QMCKL_SUCCESS
|
|
|
|
<span style="color: #a020f0;">do</span> a=1, nucl_num
|
|
ishell_start = nucleus_index(a) + 1
|
|
ishell_end = nucleus_index(a) + nucleus_shell_num(a)
|
|
<span style="color: #a020f0;">do</span> j=1,point_num
|
|
<span style="color: #a020f0;">do</span> n = 1, 3
|
|
<span style="color: #a020f0;">do</span> ishell = ishell_start, ishell_end
|
|
k = ao_index(ishell)
|
|
l = shell_ang_mom(ishell)
|
|
<span style="color: #a020f0;">do</span> il = lstart(l), lstart(l+1)-1
|
|
c1 = ao_hessian(k, 4, j, n)
|
|
<span style="color: #a020f0;">if</span> (c1 == 0.d0) <span style="color: #a020f0;">then</span>
|
|
k = k + 1
|
|
<span style="color: #a020f0;">cycle</span>
|
|
<span style="color: #a020f0;">end if</span>
|
|
<span style="color: #a020f0;">do</span> i=1,mo_num
|
|
forces_mo_l(i, j, n, a) = forces_mo_l(i, j, n, a) - coefficient_t(i,k) * c1
|
|
<span style="color: #a020f0;">end do</span>
|
|
k = k+1
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
<span style="color: #a020f0;">end do</span>
|
|
|
|
|
|
<span style="color: #a020f0;">deallocate</span>(ao_index)
|
|
|
|
!<span style="color: #b22222;">do a=1,nucl_num</span>
|
|
! <span style="color: #b22222;">do m = 1, 3</span>
|
|
! <span style="color: #b22222;">info = qmckl_dgemm(context,'N', 'N', mo_num, point_num, ao_num, &</span>
|
|
! <span style="color: #b22222;">-1.d0, coefficient_t, mo_num, &</span>
|
|
! <span style="color: #b22222;">ao_hessian(:, 4, :, m, a), ao_num, &</span>
|
|
! <span style="color: #b22222;">1.d0, forces_mo_l(:, :, m, a), mo_num)</span>
|
|
! <span style="color: #b22222;">end do</span>
|
|
!<span style="color: #b22222;">end do</span>
|
|
|
|
|
|
|
|
<span style="color: #a020f0;">end function</span> <span style="color: #0000ff;">qmckl_compute_forces_mo_l_doc</span>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="postamble" class="status">
|
|
<p class="author">Author: TREX CoE</p>
|
|
<p class="date">Created: 2025-04-29 Tue 08:44</p>
|
|
<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
|
|
</div>
|
|
</body>
|
|
</html>
|