From 8c4d835a21854168fc2f67889e7b0975621e0bfd Mon Sep 17 00:00:00 2001 From: Adam Fekete Date: Fri, 8 Jul 2022 15:55:43 +0200 Subject: [PATCH 01/13] restructure repo + cleanup --- .dockerignore | 395 +++++++++++++++++- .gitlab-ci/update_metainfo_gui_develop.sh | 50 --- .gitlab-ci/update_tag_app_develop.sh | 42 -- .gitlab-ci/update_tag_develop.sh | 44 -- .gitlab-ci/update_tag_production.sh | 46 -- .gitlab-ci/update_tag_staging.sh | 42 -- {files => configs}/AIT_bg_title.jpg | Bin {files => configs}/GAP_VERSION | 0 {files => configs}/GIT_VERSION | 0 {files => configs}/Makefile.inc | 0 {files => configs}/Titillium/OFL.txt | 0 .../Titillium/TitilliumWeb-Black.ttf | Bin .../Titillium/TitilliumWeb-Bold.ttf | Bin .../Titillium/TitilliumWeb-BoldItalic.ttf | Bin .../Titillium/TitilliumWeb-ExtraLight.ttf | Bin .../TitilliumWeb-ExtraLightItalic.ttf | Bin .../Titillium/TitilliumWeb-Italic.ttf | Bin .../Titillium/TitilliumWeb-Light.ttf | Bin .../Titillium/TitilliumWeb-LightItalic.ttf | Bin .../Titillium/TitilliumWeb-Regular.ttf | Bin .../Titillium/TitilliumWeb-SemiBold.ttf | Bin .../Titillium/TitilliumWeb-SemiBoldItalic.ttf | Bin {files => configs}/custom.css | 0 {files => configs}/logo.png | Bin .../generate_headers.py | 0 .../generate_tutorials_json.py | 0 tutorials.json => tools/tutorials.json | 0 27 files changed, 390 insertions(+), 229 deletions(-) delete mode 100755 .gitlab-ci/update_metainfo_gui_develop.sh delete mode 100755 .gitlab-ci/update_tag_app_develop.sh delete mode 100755 .gitlab-ci/update_tag_develop.sh delete mode 100755 .gitlab-ci/update_tag_production.sh delete mode 100755 .gitlab-ci/update_tag_staging.sh rename {files => configs}/AIT_bg_title.jpg (100%) rename {files => configs}/GAP_VERSION (100%) rename {files => configs}/GIT_VERSION (100%) rename {files => configs}/Makefile.inc (100%) rename {files => configs}/Titillium/OFL.txt (100%) rename {files => configs}/Titillium/TitilliumWeb-Black.ttf (100%) rename {files => configs}/Titillium/TitilliumWeb-Bold.ttf (100%) rename {files => configs}/Titillium/TitilliumWeb-BoldItalic.ttf (100%) rename {files => configs}/Titillium/TitilliumWeb-ExtraLight.ttf (100%) rename {files => configs}/Titillium/TitilliumWeb-ExtraLightItalic.ttf (100%) rename {files => configs}/Titillium/TitilliumWeb-Italic.ttf (100%) rename {files => configs}/Titillium/TitilliumWeb-Light.ttf (100%) rename {files => configs}/Titillium/TitilliumWeb-LightItalic.ttf (100%) rename {files => configs}/Titillium/TitilliumWeb-Regular.ttf (100%) rename {files => configs}/Titillium/TitilliumWeb-SemiBold.ttf (100%) rename {files => configs}/Titillium/TitilliumWeb-SemiBoldItalic.ttf (100%) rename {files => configs}/custom.css (100%) rename {files => configs}/logo.png (100%) rename generate_headers.py => tools/generate_headers.py (100%) rename generate_tutorials_json.py => tools/generate_tutorials_json.py (100%) rename tutorials.json => tools/tutorials.json (100%) diff --git a/.dockerignore b/.dockerignore index 1c57b86f..557b68b0 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,6 +1,391 @@ -**/.git -**/.gitignore -**/.gitmodules -**/.dockerignore -.gitlab-ci \ No newline at end of file +# https://github.com/github/gitignore/blob/main/Python.gitignore + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +.idea/ + + +# https://github.com/github/gitignore/blob/main/Node.gitignore + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + + +# https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore/ + +.vscode/* +!.vscode/settings.json +# !.vscode/tasks.json +# !.vscode/launch.json +# !.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + + +# https://github.com/github/gitignore/blob/main/Global/macOS.gitignore + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + + +# https://github.com/github/gitignore/blob/main/Global/Windows.gitignore + +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + + +# https://github.com/github/gitignore/blob/main/Global/Linux.gitignore + +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + + diff --git a/.gitlab-ci/update_metainfo_gui_develop.sh b/.gitlab-ci/update_metainfo_gui_develop.sh deleted file mode 100755 index 331a9567..00000000 --- a/.gitlab-ci/update_metainfo_gui_develop.sh +++ /dev/null @@ -1,50 +0,0 @@ -# !/bin/bash - -# Based on: https://docs.gitlab.com/ee/ci/ssh_keys/README.html - -# Install ssh-agent if not already installed, it is required by Docker. -# (change apt-get to yum if you use an RPM-based image) -# - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' -# Run ssh-agent (inside the build environment) -eval $(ssh-agent -s) - -# Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store -# We're using tr to fix line endings which makes ed25519 keys work -# without extra base64 encoding. -# https://gitlab.com/gitlab-examples/ssh-private-key/issues/1#note_48526556 -echo "$SSH_PRIVATE_KEY_APP" | tr -d '\r' | ssh-add - - -# Create the SSH directory and give it the right permissions -mkdir -p ~/.ssh -chmod 700 ~/.ssh - -# Use ssh-keyscan to scan the keys of your private server. -ssh-keyscan gitlab.mpcdf.mpg.de >> ~/.ssh/known_hosts -chmod 644 ~/.ssh/known_hosts - -# Set the user name and email. -git config --global user.name $GITLAB_USER_NAME -git config --global user.email $GITLAB_USER_EMAIL - - -# Clone the private repositories -git clone -b develop --recurse git@gitlab.mpcdf.mpg.de:nomad-lab/analytics.git /tmp/analytics -git clone -b develop git@gitlab.mpcdf.mpg.de:nomad-lab/aitoolkit-gui.git /tmp/aitoolkit-gui - -# Create new metainfo based on develop version -cd /tmp/analytics -python generate_tutorials_json.py > toolkitMetadata.json - -# Copy new metainfo if files are different -cd /tmp -if ! cmp analytics/toolkitMetadata.json aitoolkit-gui/src/toolkitMetadata.json~ >/dev/null 2>&1 -then - echo 'Update GUI with new metadata' - cp analytics/toolkitMetadata.json aitoolkit-gui/src/toolkitMetadata.json - cd /tmp/aitoolkit-gui - git add src/toolkitMetadata.json - git commit -m "CI: Update metainfo in the GUI" - git push -fi - -rm -rf /tmp diff --git a/.gitlab-ci/update_tag_app_develop.sh b/.gitlab-ci/update_tag_app_develop.sh deleted file mode 100755 index 4202e2cd..00000000 --- a/.gitlab-ci/update_tag_app_develop.sh +++ /dev/null @@ -1,42 +0,0 @@ -# !/bin/bash - -# Based on: https://docs.gitlab.com/ee/ci/ssh_keys/README.html - -# Install ssh-agent if not already installed, it is required by Docker. -# (change apt-get to yum if you use an RPM-based image) -# - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' -# Run ssh-agent (inside the build environment) -eval $(ssh-agent -s) - -# Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store -# We're using tr to fix line endings which makes ed25519 keys work -# without extra base64 encoding. -# https://gitlab.com/gitlab-examples/ssh-private-key/issues/1#note_48526556 -echo "$SSH_PRIVATE_KEY_APP" | tr -d '\r' | ssh-add - - -# Create the SSH directory and give it the right permissions -mkdir -p ~/.ssh -chmod 700 ~/.ssh - -# Use ssh-keyscan to scan the keys of your private server. -ssh-keyscan gitlab.mpcdf.mpg.de >> ~/.ssh/known_hosts -chmod 644 ~/.ssh/known_hosts - -# Set the user name and email. -git config --global user.name $GITLAB_USER_NAME -git config --global user.email $GITLAB_USER_EMAIL - - -# Clone the private repository -git clone git@gitlab.mpcdf.mpg.de:nomad-lab/aitoolkit-develop.git /tmp/aitoolkit-develop -cd /tmp/aitoolkit-develop - -# Update the tag of the docker image -sed -i "s/aitoolkit-develop:develop.*/aitoolkit-develop:develop$CI_COMMIT_SHORT_SHA/1" docker-compose.yml - -# Finally, commit and push the changes -git add docker-compose.yml -git commit -m "CI: Update the Analytics image ($CI_COMMIT_SHORT_SHA)" -git push - -rm -rf /tmp/aitoolkit-app diff --git a/.gitlab-ci/update_tag_develop.sh b/.gitlab-ci/update_tag_develop.sh deleted file mode 100755 index 55e60f96..00000000 --- a/.gitlab-ci/update_tag_develop.sh +++ /dev/null @@ -1,44 +0,0 @@ -# !/bin/bash - -# Based on: https://docs.gitlab.com/ee/ci/ssh_keys/README.html - -# Install ssh-agent if not already installed, it is required by Docker. -# (change apt-get to yum if you use an RPM-based image) -# - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' -# Run ssh-agent (inside the build environment) -eval $(ssh-agent -s) - -# Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store -# We're using tr to fix line endings which makes ed25519 keys work -# without extra base64 encoding. -# https://gitlab.com/gitlab-examples/ssh-private-key/issues/1#note_48526556 -echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - - -# Create the SSH directory and give it the right permissions -mkdir -p ~/.ssh -chmod 700 ~/.ssh - -# Use ssh-keyscan to scan the keys of your private server. -ssh-keyscan gitlab.mpcdf.mpg.de >> ~/.ssh/known_hosts -chmod 644 ~/.ssh/known_hosts - -# Set the user name and email. -git config --global user.name $GITLAB_USER_NAME -git config --global user.email $GITLAB_USER_EMAIL -echo $GITLAB_USER_NAME -echo $GITLAB_USER_EMAIL - - -# Clone the private repository -git clone git@gitlab.mpcdf.mpg.de:nomad-lab/analytics-deployment.git /tmp/analytics-deployment -cd /tmp/analytics-deployment - -# Update the tag of the docker image -sed -i "s/^ tag\:.*/ tag\: develop$CI_COMMIT_SHORT_SHA/g" deployments/hub/develop.yaml - -# Finally, commit and push the changes -git add deployments/hub/develop.yaml -git commit -m "CI: Update the hub image for develop ($CI_PIPELINE_URL)" -git push - -rm -rf /tmp/analytics-deployment diff --git a/.gitlab-ci/update_tag_production.sh b/.gitlab-ci/update_tag_production.sh deleted file mode 100755 index d2c208cc..00000000 --- a/.gitlab-ci/update_tag_production.sh +++ /dev/null @@ -1,46 +0,0 @@ - # !/bin/bash - -# Based on: https://docs.gitlab.com/ee/ci/ssh_keys/README.html - -# Install ssh-agent if not already installed, it is required by Docker. -# (change apt-get to yum if you use an RPM-based image) -# - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' -# Run ssh-agent (inside the build environment) -eval $(ssh-agent -s) - -# Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store -# We're using tr to fix line endings which makes ed25519 keys work -# without extra base64 encoding. -# https://gitlab.com/gitlab-examples/ssh-private-key/issues/1#note_48526556 -echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - - -# Create the SSH directory and give it the right permissions -mkdir -p ~/.ssh -chmod 700 ~/.ssh - -# Use ssh-keyscan to scan the keys of your private server. -ssh-keyscan gitlab.mpcdf.mpg.de >> ~/.ssh/known_hosts -chmod 644 ~/.ssh/known_hosts - -# Set the user name and email. -git config --global user.name $GITLAB_USER_NAME -git config --global user.email $GITLAB_USER_EMAIL - - -# Clone the private repository -git clone git@gitlab.mpcdf.mpg.de:nomad-lab/analytics-deployment.git /tmp/analytics-deployment - -cd /tmp/analytics-deployment - -# Update the tag of the docker image - -sed -i "s/^ tag\:.*/ tag\: production$CI_COMMIT_SHORT_SHA/g" deployments/hub/config.yaml -sed -i "s/^ tag\:.*/ tag\: production$CI_COMMIT_SHORT_SHA/g" deployments/hub/public.yaml - -# Finally, commit and push the changes -git add deployments/hub/config.yaml -git add deployments/hub/public.yaml -git commit -m "CI: Update the hub image for production ($CI_PIPELINE_URL)" -git push - -rm -rf /tmp/analytics-deployment diff --git a/.gitlab-ci/update_tag_staging.sh b/.gitlab-ci/update_tag_staging.sh deleted file mode 100755 index c6909bf3..00000000 --- a/.gitlab-ci/update_tag_staging.sh +++ /dev/null @@ -1,42 +0,0 @@ -# !/bin/bash - -# Based on: https://docs.gitlab.com/ee/ci/ssh_keys/README.html - -# Install ssh-agent if not already installed, it is required by Docker. -# (change apt-get to yum if you use an RPM-based image) -# - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' -# Run ssh-agent (inside the build environment) -eval $(ssh-agent -s) - -# Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store -# We're using tr to fix line endings which makes ed25519 keys work -# without extra base64 encoding. -# https://gitlab.com/gitlab-examples/ssh-private-key/issues/1#note_48526556 -echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - - -# Create the SSH directory and give it the right permissions -mkdir -p ~/.ssh -chmod 700 ~/.ssh - -# Use ssh-keyscan to scan the keys of your private server. -ssh-keyscan gitlab.mpcdf.mpg.de >> ~/.ssh/known_hosts -chmod 644 ~/.ssh/known_hosts - -# Set the user name and email. -git config --global user.name $GITLAB_USER_NAME -git config --global user.email $GITLAB_USER_EMAIL - - -# Clone the private repository -git clone git@gitlab.mpcdf.mpg.de:nomad-lab/analytics-deployment.git /tmp/analytics-deployment -cd /tmp/analytics-deployment - -# Update the tag of the docker image -sed -i "s/^ tag\:.*/ tag\: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME$CI_COMMIT_SHORT_SHA/g" deployments/hub/staging.yaml - -# Finally, commit and push the changes -git add deployments/hub/staging.yaml -git commit -m "CI: Update the hub image for staging ($CI_PIPELINE_URL)" -git push - -rm -rf /tmp/analytics-deployment diff --git a/files/AIT_bg_title.jpg b/configs/AIT_bg_title.jpg similarity index 100% rename from files/AIT_bg_title.jpg rename to configs/AIT_bg_title.jpg diff --git a/files/GAP_VERSION b/configs/GAP_VERSION similarity index 100% rename from files/GAP_VERSION rename to configs/GAP_VERSION diff --git a/files/GIT_VERSION b/configs/GIT_VERSION similarity index 100% rename from files/GIT_VERSION rename to configs/GIT_VERSION diff --git a/files/Makefile.inc b/configs/Makefile.inc similarity index 100% rename from files/Makefile.inc rename to configs/Makefile.inc diff --git a/files/Titillium/OFL.txt b/configs/Titillium/OFL.txt similarity index 100% rename from files/Titillium/OFL.txt rename to configs/Titillium/OFL.txt diff --git a/files/Titillium/TitilliumWeb-Black.ttf b/configs/Titillium/TitilliumWeb-Black.ttf similarity index 100% rename from files/Titillium/TitilliumWeb-Black.ttf rename to configs/Titillium/TitilliumWeb-Black.ttf diff --git a/files/Titillium/TitilliumWeb-Bold.ttf b/configs/Titillium/TitilliumWeb-Bold.ttf similarity index 100% rename from files/Titillium/TitilliumWeb-Bold.ttf rename to configs/Titillium/TitilliumWeb-Bold.ttf diff --git a/files/Titillium/TitilliumWeb-BoldItalic.ttf b/configs/Titillium/TitilliumWeb-BoldItalic.ttf similarity index 100% rename from files/Titillium/TitilliumWeb-BoldItalic.ttf rename to configs/Titillium/TitilliumWeb-BoldItalic.ttf diff --git a/files/Titillium/TitilliumWeb-ExtraLight.ttf b/configs/Titillium/TitilliumWeb-ExtraLight.ttf similarity index 100% rename from files/Titillium/TitilliumWeb-ExtraLight.ttf rename to configs/Titillium/TitilliumWeb-ExtraLight.ttf diff --git a/files/Titillium/TitilliumWeb-ExtraLightItalic.ttf b/configs/Titillium/TitilliumWeb-ExtraLightItalic.ttf similarity index 100% rename from files/Titillium/TitilliumWeb-ExtraLightItalic.ttf rename to configs/Titillium/TitilliumWeb-ExtraLightItalic.ttf diff --git a/files/Titillium/TitilliumWeb-Italic.ttf b/configs/Titillium/TitilliumWeb-Italic.ttf similarity index 100% rename from files/Titillium/TitilliumWeb-Italic.ttf rename to configs/Titillium/TitilliumWeb-Italic.ttf diff --git a/files/Titillium/TitilliumWeb-Light.ttf b/configs/Titillium/TitilliumWeb-Light.ttf similarity index 100% rename from files/Titillium/TitilliumWeb-Light.ttf rename to configs/Titillium/TitilliumWeb-Light.ttf diff --git a/files/Titillium/TitilliumWeb-LightItalic.ttf b/configs/Titillium/TitilliumWeb-LightItalic.ttf similarity index 100% rename from files/Titillium/TitilliumWeb-LightItalic.ttf rename to configs/Titillium/TitilliumWeb-LightItalic.ttf diff --git a/files/Titillium/TitilliumWeb-Regular.ttf b/configs/Titillium/TitilliumWeb-Regular.ttf similarity index 100% rename from files/Titillium/TitilliumWeb-Regular.ttf rename to configs/Titillium/TitilliumWeb-Regular.ttf diff --git a/files/Titillium/TitilliumWeb-SemiBold.ttf b/configs/Titillium/TitilliumWeb-SemiBold.ttf similarity index 100% rename from files/Titillium/TitilliumWeb-SemiBold.ttf rename to configs/Titillium/TitilliumWeb-SemiBold.ttf diff --git a/files/Titillium/TitilliumWeb-SemiBoldItalic.ttf b/configs/Titillium/TitilliumWeb-SemiBoldItalic.ttf similarity index 100% rename from files/Titillium/TitilliumWeb-SemiBoldItalic.ttf rename to configs/Titillium/TitilliumWeb-SemiBoldItalic.ttf diff --git a/files/custom.css b/configs/custom.css similarity index 100% rename from files/custom.css rename to configs/custom.css diff --git a/files/logo.png b/configs/logo.png similarity index 100% rename from files/logo.png rename to configs/logo.png diff --git a/generate_headers.py b/tools/generate_headers.py similarity index 100% rename from generate_headers.py rename to tools/generate_headers.py diff --git a/generate_tutorials_json.py b/tools/generate_tutorials_json.py similarity index 100% rename from generate_tutorials_json.py rename to tools/generate_tutorials_json.py diff --git a/tutorials.json b/tools/tutorials.json similarity index 100% rename from tutorials.json rename to tools/tutorials.json -- GitLab From e00eef92e34ac267b8c8edb6bd3140d87c8687cd Mon Sep 17 00:00:00 2001 From: Adam Fekete Date: Fri, 8 Jul 2022 16:07:41 +0200 Subject: [PATCH 02/13] moved from analytics-deployments --- deployments/README.md | 4 ++ deployments/hub/develop.yaml | 78 +++++++++++++++++++++++++++ deployments/hub/production.yaml | 94 +++++++++++++++++++++++++++++++++ deployments/hub/public.yaml | 56 ++++++++++++++++++++ deployments/hub/staging.yaml | 79 +++++++++++++++++++++++++++ 5 files changed, 311 insertions(+) create mode 100644 deployments/README.md create mode 100644 deployments/hub/develop.yaml create mode 100644 deployments/hub/production.yaml create mode 100644 deployments/hub/public.yaml create mode 100644 deployments/hub/staging.yaml diff --git a/deployments/README.md b/deployments/README.md new file mode 100644 index 00000000..32db5db5 --- /dev/null +++ b/deployments/README.md @@ -0,0 +1,4 @@ +# Nomad jupyterhub deployment + +This is a step-by-step tutorial to create a new jupyerhub deployment. + diff --git a/deployments/hub/develop.yaml b/deployments/hub/develop.yaml new file mode 100644 index 00000000..009ab334 --- /dev/null +++ b/deployments/hub/develop.yaml @@ -0,0 +1,78 @@ +proxy: + # secretToken: '' + # service: + # type: NodePort + # nodePorts: + # http: 31006 + # https: + # enabled: false + chp: + nodeSelector: + "nomad.analytics/type": prod + +hub: + # baseUrl: /dev/analytics/develop/ + nodeSelector: + "nomad.analytics/type": prod + db: + type: sqlite-memory + extraEnv: + OAUTH2_AUTHORIZE_URL: https://nomad-lab.eu/fairdi/keycloak/auth/realms/fairdi_nomad_prod/protocol/openid-connect/auth + OAUTH2_TOKEN_URL: https://nomad-lab.eu/fairdi/keycloak/auth/realms/fairdi_nomad_prod/protocol/openid-connect/token + OAUTH_CALLBACK_URL: https://nomad-lab.eu/prod/analytics/hub/hub/oauth_callback + extraConfig: + myAuthConfig: | + c.Authenticator.auto_login = True + +auth: + type: custom + custom: + className: oauthenticator.generic.GenericOAuthenticator + config: + login_service: keycloak + client_id: 'analytics-hub' + # client_secret: '' + token_url: https://nomad-lab.eu/fairdi/keycloak/auth/realms/fairdi_nomad_prod/protocol/openid-connect/token + userdata_url: https://nomad-lab.eu/fairdi/keycloak/auth/realms/fairdi_nomad_prod/protocol/openid-connect/userinfo + userdata_method: GET + userdata_params: {'state': 'state'} + username_key: preferred_username + admin: + users: + - lghiringhelli + - mscheidgen + - lsbailo + - afekete + +singleuser: + cpu: + limit: 2 + guarantee: 0.2 + memory: + limit: 10G + guarantee: 1G + nodeSelector: + "nomad.analytics/type": prod-worker + image: + name: gitlab-registry.mpcdf.mpg.de/nomad-lab/analytics + # tag: '' + storage: + type: none + +prePuller: + hook: + enabled: enable + +scheduling: + userScheduler: + enabled: false + podPriority: + enabled: false + userPlaceholder: + enabled: false + replicas: 0 + userPods: + nodeAffinity: + matchNodePurpose: prefer + + diff --git a/deployments/hub/production.yaml b/deployments/hub/production.yaml new file mode 100644 index 00000000..eb2534c4 --- /dev/null +++ b/deployments/hub/production.yaml @@ -0,0 +1,94 @@ +proxy: + # secretToken: '' + # service: + # type: NodePort + # nodePorts: + # http: 31001 + # https: + # enabled: false + chp: + nodeSelector: + "nomad.analytics/type": prod + +hub: + baseUrl: /prod/analytics/hub/ + nodeSelector: + "nomad.analytics/type": prod + db: + type: sqlite-pvc + pvc: + storageClassName: manual-hub-user-db + extraEnv: + OAUTH2_AUTHORIZE_URL: https://nomad-lab.eu/fairdi/keycloak/auth/realms/fairdi_nomad_prod/protocol/openid-connect/auth + OAUTH2_TOKEN_URL: https://nomad-lab.eu/fairdi/keycloak/auth/realms/fairdi_nomad_prod/protocol/openid-connect/token + OAUTH_CALLBACK_URL: https://nomad-lab.eu/prod/analytics/hub/hub/oauth_callback + extraConfig: + myAuthConfig: | + c.Authenticator.auto_login = True + +auth: + type: custom + custom: + className: oauthenticator.generic.GenericOAuthenticator + config: + login_service: keycloak + client_id: 'analytics-hub' + # client_secret: '' + token_url: https://nomad-lab.eu/fairdi/keycloak/auth/realms/fairdi_nomad_prod/protocol/openid-connect/token + userdata_url: https://nomad-lab.eu/fairdi/keycloak/auth/realms/fairdi_nomad_prod/protocol/openid-connect/userinfo + userdata_method: GET + userdata_params: {'state': 'state'} + username_key: preferred_username + admin: + users: + - lghiringhelli + - mscheidgen + - lsbailo + - afekete + +singleuser: + cpu: + limit: 8 + guarantee: 0.2 + memory: + limit: 10G + guarantee: 1G + nodeSelector: + "nomad.analytics/type": prod-worker + image: + name: gitlab-registry.mpcdf.mpg.de/nomad-lab/analytics + tag: production + initContainers: + - name: fix-permissions + image: busybox + imagePullPolicy: IfNotPresent + securityContext: + runAsUser: 0 + command: [ '/bin/sh', '-c', 'chown 1000:100 /home/jovyan'] + volumeMounts: + - mountPath: /home/jovyan + name: home + subPath: '{username}' + storage: + type: static + homeMountPath: /home/jovyan/work + static: + pvcName: analytics-user-data + subPath: '{username}' + +prePuller: + hook: + enabled: enable + +scheduling: + userScheduler: + enabled: false + podPriority: + enabled: false + userPlaceholder: + enabled: false + replicas: 0 + userPods: + nodeAffinity: + matchNodePurpose: prefer + diff --git a/deployments/hub/public.yaml b/deployments/hub/public.yaml new file mode 100644 index 00000000..f39830c8 --- /dev/null +++ b/deployments/hub/public.yaml @@ -0,0 +1,56 @@ +proxy: + # secretToken: '' + # service: + # type: NodePort + # nodePorts: + # http: 31003 + # https: + # enabled: false + chp: + nodeSelector: + "nomad.analytics/type": prod + +hub: + baseUrl: /prod/analytics/public/ + nodeSelector: + "nomad.analytics/type": prod + db: + type: sqlite-pvc + pvc: + storageClassName: manual-public-user-db + +auth: + type: tmp + admin: + access: false + +singleuser: + cpu: + limit: 2 + guarantee: 0.2 + memory: + limit: 10G + guarantee: 1G + nodeSelector: + "nomad.analytics/type": prod-worker + image: + name: gitlab-registry.mpcdf.mpg.de/nomad-lab/analytics + tag: production + storage: + type: none + +prePuller: + hook: + enabled: enable + +scheduling: + userScheduler: + enabled: false + podPriority: + enabled: false + userPlaceholder: + enabled: false + replicas: 0 + userPods: + nodeAffinity: + matchNodePurpose: prefer diff --git a/deployments/hub/staging.yaml b/deployments/hub/staging.yaml new file mode 100644 index 00000000..9fb70211 --- /dev/null +++ b/deployments/hub/staging.yaml @@ -0,0 +1,79 @@ +proxy: + # secretToken: '' + # service: + # type: NodePort + # nodePorts: + # http: 31005 + # https: + # enabled: false + chp: + nodeSelector: + "nomad.analytics/type": prod + +hub: + baseUrl: /dev/analytics/staging/ + nodeSelector: + "nomad.analytics/type": prod + db: + type: sqlite-pvc + pvc: + storageClassName: manual-hub-user-db + extraEnv: + OAUTH2_AUTHORIZE_URL: https://nomad-lab.eu/fairdi/keycloak/auth/realms/fairdi_nomad_prod/protocol/openid-connect/auth + OAUTH2_TOKEN_URL: https://nomad-lab.eu/fairdi/keycloak/auth/realms/fairdi_nomad_prod/protocol/openid-connect/token + OAUTH_CALLBACK_URL: https://nomad-lab.eu/prod/analytics/hub/hub/oauth_callback + extraConfig: + myAuthConfig: | + c.Authenticator.auto_login = True + +auth: + type: custom + custom: + className: oauthenticator.generic.GenericOAuthenticator + config: + login_service: keycloak + client_id: 'analytics-hub' + # client_secret: '' + token_url: https://nomad-lab.eu/fairdi/keycloak/auth/realms/fairdi_nomad_prod/protocol/openid-connect/token + userdata_url: https://nomad-lab.eu/fairdi/keycloak/auth/realms/fairdi_nomad_prod/protocol/openid-connect/userinfo + userdata_method: GET + userdata_params: {'state': 'state'} + username_key: preferred_username + admin: + users: + - lghiringhelli + - mscheidgen + - lsbailo + - afekete + +singleuser: + cpu: + limit: 8 + guarantee: 0.2 + memory: + limit: 10G + guarantee: 1G + nodeSelector: + "nomad.analytics/type": prod-worker + image: + name: gitlab-registry.mpcdf.mpg.de/nomad-lab/analytics + tag: staging + storage: + type: none + +prePuller: + hook: + enabled: enable + +scheduling: + userScheduler: + enabled: false + podPriority: + enabled: false + userPlaceholder: + enabled: false + replicas: 0 + userPods: + nodeAffinity: + matchNodePurpose: prefer + -- GitLab From ac43795c963bf9b859b75c17112a0e47741bf734 Mon Sep 17 00:00:00 2001 From: Adam Fekete Date: Fri, 8 Jul 2022 16:41:12 +0200 Subject: [PATCH 03/13] cleanup --- .gitlab-ci.yml | 171 ++++++++++-------- .../hub/{develop.yaml => dev-values.yaml} | 0 2 files changed, 93 insertions(+), 78 deletions(-) rename deployments/hub/{develop.yaml => dev-values.yaml} (100%) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e9d6879b..9e5dc867 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,111 +1,126 @@ -# default installed image for docker executor is: python:3.6 -# using an image that can do git, docker, docker-compose -# https://docs.gitlab.com/ee/ci/docker/using_docker_build.html -image: docker:dind +image: gitlab-registry.mpcdf.mpg.de/nomad-lab/nomad-fair/ci-runner -variables: - GIT_SUBMODULE_STRATEGY: recursive - APP_REGISTRY: gitlab-registry.mpcdf.mpg.de/nomad-lab/aitoolkit-app - DEVELOP_REGISTRY: gitlab-registry.mpcdf.mpg.de/nomad-lab/aitoolkit-develop +# variables: +# DEV_IMAGE: ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_SLUG} +# STAGING_IMAGE: ${CI_REGISTRY_IMAGE}:staging stages: - build - deploy - + - release build to develop: stage: build + variables: + GIT_SUBMODULE_STRATEGY: recursive + GIT_SUBMODULE_UPDATE_FLAGS: --jobs 4 before_script: - echo "Building the single user notebook image" - echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER $CI_REGISTRY --password-stdin - - docker info - script: + # - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN gitlab-registry.mpcdf.mpg.de + # - docker info # Using cache to speed up the build process - - docker pull ${CI_REGISTRY_IMAGE}:develop || true - - docker build --cache-from ${CI_REGISTRY_IMAGE}:develop --tag ${CI_REGISTRY_IMAGE}:develop${CI_COMMIT_SHORT_SHA} --tag ${CI_REGISTRY_IMAGE}:develop --tag ${DEVELOP_REGISTRY}:develop${CI_COMMIT_SHORT_SHA} --tag ${DEVELOP_REGISTRY}:develop . - - docker push ${CI_REGISTRY_IMAGE}:develop${CI_COMMIT_SHORT_SHA} - - docker push ${CI_REGISTRY_IMAGE}:develop - - docker login -u ai_toolkit -p ${AI_TOOLKIT_TOKEN} ${DEVELOP_REGISTRY} - - docker push ${DEVELOP_REGISTRY}:develop${CI_COMMIT_SHORT_SHA} - - docker push ${DEVELOP_REGISTRY}:develop - - rules: - # Execute jobs when a new commit is pushed to develop branch - - if: $CI_COMMIT_BRANCH == "develop" - - -build to staging: - stage: build - before_script: - - echo "Building the single user notebook image" - - echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER $CI_REGISTRY --password-stdin - - docker info + # - docker pull ${STAGING_IMAGE} || true script: - # Using cache to speed up the build process --cache-from ${CI_REGISTRY_IMAGE}:${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME} - - docker pull ${CI_REGISTRY_IMAGE}:${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME} || true - - docker build --tag ${CI_REGISTRY_IMAGE}:${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}${CI_COMMIT_SHORT_SHA} --tag ${CI_REGISTRY_IMAGE}:${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME} . - - docker push ${CI_REGISTRY_IMAGE}:${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}${CI_COMMIT_SHORT_SHA} - - docker push ${CI_REGISTRY_IMAGE}:${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME} + # Using cache to speed up the build process --cache-from ${CI_REGISTRY_IMAGE}:${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME} + - docker build -t ${DEV_IMAGE} . + - docker push ${DEV_IMAGE} rules: # Execute jobs when a new commit is pushed to master branch - - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" - + - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" -build to production: +build to staging: stage: build + variables: + GIT_SUBMODULE_STRATEGY: recursive + GIT_SUBMODULE_UPDATE_FLAGS: --jobs 4 before_script: - echo "Building the single user notebook image" - echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER $CI_REGISTRY --password-stdin - - docker info script: - # Using cache to speed up the build process - - docker pull ${CI_REGISTRY_IMAGE}:latest || true - - docker build --cache-from ${CI_REGISTRY_IMAGE}:latest --build-arg CACHEBUST=$(date +%s) --tag ${CI_REGISTRY_IMAGE}:production${CI_COMMIT_SHORT_SHA} --tag ${CI_REGISTRY_IMAGE}:latest . - - docker push ${CI_REGISTRY_IMAGE}:production${CI_COMMIT_SHORT_SHA} - - docker push ${CI_REGISTRY_IMAGE}:latest + - docker build -t ${STAGING_IMAGE} . + - docker push ${STAGING_IMAGE} rules: - # Execute jobs when a new commit is pushed to master branch - - if: $CI_COMMIT_BRANCH == 'master' + # Execute jobs when a new commit is pushed to develop branch + - if: $CI_COMMIT_BRANCH == "develop" + +# build to production: +# stage: build +# variables: +# GIT_SUBMODULE_STRATEGY: recursive +# GIT_SUBMODULE_UPDATE_FLAGS: --jobs 4 +# before_script: +# - echo "Building the single user notebook image" +# - echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER $CI_REGISTRY --password-stdin +# script: +# - docker build -t ${STAGING_IMAGE} . +# - docker push ${STAGING_IMAGE} +# rules: +# # Execute jobs when a new commit is pushed to master branch +# - if: $CI_COMMIT_BRANCH == 'master' deploy to develop: - image: python:3.6 stage: deploy - variables: - GIT_SUBMODULE_STRATEGY: none - script: - - ./.gitlab-ci/update_tag_develop.sh - - ./.gitlab-ci/update_tag_app_develop.sh - - ./.gitlab-ci/update_metainfo_gui_develop.sh environment: - name: develop - url: https://analytics-toolkit.nomad-coe.eu/develop + name: dev/$CI_COMMIT_REF_NAME + deployment_tier: development + url: https://analytics-toolkit.nomad-coe.eu/dev/${CI_ENVIRONMENT_SLUG} + auto_stop_in: 7 days + on_stop: stop deploy dev + before_script: + - mkdir ~/.kube/ + - echo ${CI_K8S_CONFIG} | base64 -d > ~/.kube/config + - helm repo add jupyterhub https://jupyterhub.github.io/helm-chart + - helm repo update + - helm version + script: + - helm upgrade ${CI_ENVIRONMENT_SLUG} jupyterhub/jupyterhub + --install + --namespace analytitcs + --values deployments/dev-values.yaml + --set hub.baseUrl=/dev/${CI_ENVIRONMENT_SLUG} + --set fullnameOverride=${CI_ENVIRONMENT_SLUG}-dev + --set singleuser.podNameTemplate="${CI_ENVIRONMENT_SLUG}-dev-{username}" + --set hub.config.GenericOAuthenticator.oauth_callback_url=https://analytics-toolkit.nomad-coe.eu/dev/${CI_ENVIRONMENT_SLUG}/hub/oauth_callback + --set singleuser.image.name=${CI_REGISTRY_IMAGE} + --set singleuser.image.tag=${CI_COMMIT_REF_SLUG} + --set roll=true + --wait rules: # Execute jobs when a new commit is pushed to develop branch - - if: $CI_COMMIT_BRANCH == "develop" + - if: $CI_COMMIT_BRANCH == "develop" -deploy to staging: - image: python:3.6 +stop deploy dev: stage: deploy - variables: - GIT_SUBMODULE_STRATEGY: none - script: - - ./.gitlab-ci/update_tag_staging.sh environment: - name: staging - url: https://nomad-lab.eu/dev/analytics/staging - rules: - # Execute jobs when a new commit is pushed to master branch - - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" + name: dev/$CI_COMMIT_REF_NAME + action: stop + before_script: + - mkdir ~/.kube/ + - echo ${CI_K8S_CONFIG} | base64 -d > ~/.kube/config + script: + - helm uninstall ${CI_ENVIRONMENT_SLUG} --namespace analytics + when: manual + needs: ["build"] +# deploy to staging: +# stage: deploy +# environment: +# name: staging +# url: https://nomad-lab.eu/dev/analytics/staging +# script: +# - ./.gitlab-ci/update_tag_staging.sh +# rules: +# # Execute jobs when a new commit is pushed to master branch +# - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" -deploy to production: - image: python:3.6 - stage: deploy - script: - - ./.gitlab-ci/update_tag_production.sh - environment: - name: production - url: https://nomad-lab.eu/prod/analytics/hub - rules: - # Execute jobs when a new commit is pushed to master branch - - if: $CI_COMMIT_BRANCH == 'master' +# deploy to production: +# stage: deploy +# environment: +# name: production +# url: https://nomad-lab.eu/prod/analytics/hub +# script: +# - ./.gitlab-ci/update_tag_production.sh +# rules: +# # Execute jobs when a new commit is pushed to master branch +# - if: $CI_COMMIT_BRANCH == 'develop' diff --git a/deployments/hub/develop.yaml b/deployments/hub/dev-values.yaml similarity index 100% rename from deployments/hub/develop.yaml rename to deployments/hub/dev-values.yaml -- GitLab From a9283f1a41daefc52c7f1bd2f90474e3c1ed6056 Mon Sep 17 00:00:00 2001 From: Adam Fekete Date: Fri, 8 Jul 2022 16:47:47 +0200 Subject: [PATCH 04/13] cleanup --- .dockerignore | 2 +- .gitlab-ci.yml | 13 +++++++++---- deployments/README.md | 4 ---- deployments/{hub => }/dev-values.yaml | 0 .../{hub/public.yaml => prod-public-values.yaml} | 0 .../{hub/production.yaml => prod-values.yaml} | 0 .../{hub/staging.yaml => staging-values.yaml} | 0 7 files changed, 10 insertions(+), 9 deletions(-) delete mode 100644 deployments/README.md rename deployments/{hub => }/dev-values.yaml (100%) rename deployments/{hub/public.yaml => prod-public-values.yaml} (100%) rename deployments/{hub/production.yaml => prod-values.yaml} (100%) rename deployments/{hub/staging.yaml => staging-values.yaml} (100%) diff --git a/.dockerignore b/.dockerignore index 557b68b0..2f1d8f9b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -388,4 +388,4 @@ $RECYCLE.BIN/ # .nfs files are created when an open file is removed but is still being accessed .nfs* - +deployments diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9e5dc867..716e8758 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -67,16 +67,21 @@ deploy to develop: url: https://analytics-toolkit.nomad-coe.eu/dev/${CI_ENVIRONMENT_SLUG} auto_stop_in: 7 days on_stop: stop deploy dev + variables: + NAMESPACE: analytics-develop before_script: - mkdir ~/.kube/ - - echo ${CI_K8S_CONFIG} | base64 -d > ~/.kube/config + - echo ${CI_KUBE_CONFIG} | base64 -d > ~/.kube/config - helm repo add jupyterhub https://jupyterhub.github.io/helm-chart - helm repo update - helm version script: - helm upgrade ${CI_ENVIRONMENT_SLUG} jupyterhub/jupyterhub --install - --namespace analytitcs + --namespace ${NAMESPACE} + --version=1.2.0 + --timeout=40m0s + --cleanup-on-fail --values deployments/dev-values.yaml --set hub.baseUrl=/dev/${CI_ENVIRONMENT_SLUG} --set fullnameOverride=${CI_ENVIRONMENT_SLUG}-dev @@ -87,8 +92,8 @@ deploy to develop: --set roll=true --wait rules: - # Execute jobs when a new commit is pushed to develop branch - - if: $CI_COMMIT_BRANCH == "develop" + # Execute jobs when a new commit is pushed to master branch + - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" stop deploy dev: stage: deploy diff --git a/deployments/README.md b/deployments/README.md deleted file mode 100644 index 32db5db5..00000000 --- a/deployments/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Nomad jupyterhub deployment - -This is a step-by-step tutorial to create a new jupyerhub deployment. - diff --git a/deployments/hub/dev-values.yaml b/deployments/dev-values.yaml similarity index 100% rename from deployments/hub/dev-values.yaml rename to deployments/dev-values.yaml diff --git a/deployments/hub/public.yaml b/deployments/prod-public-values.yaml similarity index 100% rename from deployments/hub/public.yaml rename to deployments/prod-public-values.yaml diff --git a/deployments/hub/production.yaml b/deployments/prod-values.yaml similarity index 100% rename from deployments/hub/production.yaml rename to deployments/prod-values.yaml diff --git a/deployments/hub/staging.yaml b/deployments/staging-values.yaml similarity index 100% rename from deployments/hub/staging.yaml rename to deployments/staging-values.yaml -- GitLab From a21d668996dc59094b21cae03ac4a260c0a4938b Mon Sep 17 00:00:00 2001 From: Adam Fekete Date: Sat, 9 Jul 2022 01:58:26 +0200 Subject: [PATCH 05/13] cleanup --- 3rdparty/gap/.gitignore | 1 - 3rdparty/gap/LICENSE.md | 96 - 3rdparty/gap/Makefile | 112 - 3rdparty/gap/clustering.f95 | 928 - 3rdparty/gap/descriptors.f95 | 15880 -- 3rdparty/gap/descriptors_wrapper.f95 | 577 - 3rdparty/gap/doc/Makefile | 20 - 3rdparty/gap/doc/conf.py | 343 - 3rdparty/gap/doc/gap_fit.rst | 42 - 3rdparty/gap/doc/gap_fitting_tutorial.ipynb | 956 - 3rdparty/gap/doc/index.rst | 45 - 3rdparty/gap/doc/modcontents.py | 118 - .../gap/doc/quippy-descriptor-tutorial.ipynb | 1935 - 3rdparty/gap/doc/tutorials.rst | 10 - 3rdparty/gap/error.inc | 131 - 3rdparty/gap/gap_fit.f95 | 88 - 3rdparty/gap/gap_fit_module.f95 | 1878 - 3rdparty/gap/gapversion | 66 - 3rdparty/gap/gp_fit.f95 | 662 - 3rdparty/gap/gp_predict.f95 | 5066 - 3rdparty/gap/make_permutations_v2.f95 | 733 - 3rdparty/gap/teach_sparse | 5 - 3rdparty/quip/.gitignore | 18 - 3rdparty/quip/.travis.yml | 143 - 3rdparty/quip/Makefile | 294 - 3rdparty/quip/Makefile.config | 452 - 3rdparty/quip/Makefile.fox | 31 - 3rdparty/quip/Makefile.rules | 197 - 3rdparty/quip/README.md | 278 - 3rdparty/quip/arch/Makefile.Kaiju | 66 - 3rdparty/quip/arch/Makefile.altix | 51 - 3rdparty/quip/arch/Makefile.altix-mpi | 37 - 3rdparty/quip/arch/Makefile.bgq_gfortran | 47 - 3rdparty/quip/arch/Makefile.bgq_gfortran_fen | 53 - 3rdparty/quip/arch/Makefile.cray_xt3 | 46 - 3rdparty/quip/arch/Makefile.cray_xt3-mpi | 44 - .../quip/arch/Makefile.darwin_x86_32_gfortran | 68 - .../quip/arch/Makefile.darwin_x86_64_gfortran | 68 - .../Makefile.darwin_x86_64_gfortran_openmp | 45 - .../Makefile.darwin_x86_64_gfortran_openmpi | 42 - .../arch/Makefile.darwin_x86_64_ifort_icc | 27 - .../quip/arch/Makefile.linux_x86_32_gfortran | 59 - .../quip/arch/Makefile.linux_x86_64_gfortran | 66 - .../Makefile.linux_x86_64_gfortran_CrayXC30 | 44 - ...akefile.linux_x86_64_gfortran_CrayXC30_mpi | 46 - ...Makefile.linux_x86_64_gfortran_CrayXE6_mpi | 35 - .../Makefile.linux_x86_64_gfortran_openmp | 45 - .../Makefile.linux_x86_64_gfortran_openmpi | 46 - .../quip/arch/Makefile.linux_x86_64_ifort_gcc | 70 - .../Makefile.linux_x86_64_ifort_gcc_openmp | 41 - .../Makefile.linux_x86_64_ifort_gcc_openmpi | 46 - .../quip/arch/Makefile.linux_x86_64_ifort_icc | 64 - .../arch/Makefile.linux_x86_64_ifort_icc_mpi | 43 - .../Makefile.linux_x86_64_ifort_icc_openmp | 46 - .../Makefile.linux_x86_64_ifort_icc_serial | 64 - 3rdparty/quip/bin/checkcode | 59 - 3rdparty/quip/bin/checkuse.py | 62 - 3rdparty/quip/bin/coverage_report.py | 42 - 3rdparty/quip/bin/f90doc.py | 2497 - 3rdparty/quip/bin/find_sizeof_fortran_t | 61 - 3rdparty/quip/bin/fix_headers | 266 - 3rdparty/quip/bin/fix_sym_links | 23 - 3rdparty/quip/bin/gitversion | 15 - 3rdparty/quip/bin/ipynb2rst.py | 17 - 3rdparty/quip/bin/makedep.py | 89 - 3rdparty/quip/bin/mkdtd.pl | 179 - 3rdparty/quip/bin/module_name | 84 - 3rdparty/quip/bin/protect_mod | 63 - 3rdparty/quip/bin/unprotect_mod | 81 - 3rdparty/quip/bin/update-authors | 29 - 3rdparty/quip/bin/validate.py | 41 - 3rdparty/quip/doc/Makefile | 20 - .../quip/doc/Tutorials/Introduction.ipynb | 819 - .../quip/doc/Tutorials/NRL_TB_to_xml/README | 20 - 3rdparty/quip/doc/Tutorials/TS_params.xml | 21 - .../Tutorials/adaptive-qmmm-references.rst | 103 - .../doc/Tutorials/adaptive-qmmm-solutions.rst | 29 - .../doc/Tutorials/adaptive-qmmm-step0.rst | 131 - .../doc/Tutorials/adaptive-qmmm-step1.rst | 572 - .../doc/Tutorials/adaptive-qmmm-step2.rst | 744 - .../doc/Tutorials/adaptive-qmmm-step3.rst | 624 - .../doc/Tutorials/adaptive-qmmm-theory.rst | 544 - 3rdparty/quip/doc/Tutorials/adaptive-qmmm.rst | 26 - 3rdparty/quip/doc/Tutorials/adglass.rst | 619 - 3rdparty/quip/doc/Tutorials/alphaquartz.png | Bin 76372 -> 0 bytes 3rdparty/quip/doc/Tutorials/alphaquartz2.png | Bin 46871 -> 0 bytes .../doc/Tutorials/atomistic-vs-continuum.png | Bin 74313 -> 0 bytes .../quip/doc/Tutorials/benzene_frames.xyz | 26000 --- .../brittle-vs-ductile-microscale.png | Bin 1115106 -> 0 bytes .../quip/doc/Tutorials/brittle-vs-ductile.png | Bin 1054072 -> 0 bytes 3rdparty/quip/doc/Tutorials/buffer-region.png | Bin 61324 -> 0 bytes 3rdparty/quip/doc/Tutorials/cij.dat | 6 - .../classical-crack-coordination.png | Bin 321949 -> 0 bytes .../classical-crack-sigma-yy-average.png | Bin 541796 -> 0 bytes .../Tutorials/classical-crack-sigma-yy.png | Bin 561651 -> 0 bytes .../quip/doc/Tutorials/crack-hybrid-mark.png | Bin 284057 -> 0 bytes .../doc/Tutorials/crack-initial-qm-region.png | Bin 193594 -> 0 bytes .../doc/Tutorials/crack-max-bolt-distrib.png | Bin 37854 -> 0 bytes 3rdparty/quip/doc/Tutorials/crack-velo.sh | 32 - 3rdparty/quip/doc/Tutorials/crack_slab_1.png | Bin 281237 -> 0 bytes 3rdparty/quip/doc/Tutorials/crack_slab_2.png | Bin 283764 -> 0 bytes 3rdparty/quip/doc/Tutorials/crack_slab_3.png | Bin 306182 -> 0 bytes 3rdparty/quip/doc/Tutorials/elastic.sh | 7 - .../energy-release-rate-crack-position.png | Bin 39293 -> 0 bytes 3rdparty/quip/doc/Tutorials/energyvolume1.png | Bin 26166 -> 0 bytes 3rdparty/quip/doc/Tutorials/energyvolume2.png | Bin 36036 -> 0 bytes 3rdparty/quip/doc/Tutorials/eval_TB/README | 27 - 3rdparty/quip/doc/Tutorials/fixed_mask.png | Bin 256024 -> 0 bytes 3rdparty/quip/doc/Tutorials/forces.png | Bin 332439 -> 0 bytes .../doc/Tutorials/gap_fitting_tutorial.ipynb | 956 - .../quip/doc/Tutorials/griffith-criterion.png | Bin 159477 -> 0 bytes 3rdparty/quip/doc/Tutorials/hysteresis.png | Bin 48200 -> 0 bytes 3rdparty/quip/doc/Tutorials/index.rst | 15 - 3rdparty/quip/doc/Tutorials/irwin-sig-yy.png | Bin 215499 -> 0 bytes .../doc/Tutorials/lawn-fracture-silicon.png | Bin 924421 -> 0 bytes .../quip/doc/Tutorials/lotf-crack-cluster.png | Bin 63088 -> 0 bytes .../quip/doc/Tutorials/lotf-crack-step-1.png | Bin 259590 -> 0 bytes .../quip/doc/Tutorials/lotf-crack-step-2.png | Bin 264071 -> 0 bytes ...otf-energy-release-rate-crack-position.png | Bin 32947 -> 0 bytes 3rdparty/quip/doc/Tutorials/lotf-overview.png | Bin 159543 -> 0 bytes .../quip/doc/Tutorials/lotf-pred-corr.png | Bin 66429 -> 0 bytes .../doc/Tutorials/lotf_check_force_error.png | Bin 164696 -> 0 bytes 3rdparty/quip/doc/Tutorials/make_crack.py | 246 - 3rdparty/quip/doc/Tutorials/make_crack_1.py | 92 - 3rdparty/quip/doc/Tutorials/make_crack_2.py | 151 - .../doc/Tutorials/make_crack_coordination.py | 258 - 3rdparty/quip/doc/Tutorials/methane.xyz | 7 - .../doc/Tutorials/multiscale-coupling.png | Bin 492167 -> 0 bytes 3rdparty/quip/doc/Tutorials/params.xml | 27808 --- .../quip/doc/Tutorials/potentialenergy.png | Bin 38274 -> 0 bytes 3rdparty/quip/doc/Tutorials/quartz.png | Bin 64129 -> 0 bytes 3rdparty/quip/doc/Tutorials/quartz.xyz | 11 - 3rdparty/quip/doc/Tutorials/quartz_0001.png | Bin 36627 -> 0 bytes 3rdparty/quip/doc/Tutorials/quartz_0001.xyz | 56 - 3rdparty/quip/doc/Tutorials/quartz_crack.xml | 57 - 3rdparty/quip/doc/Tutorials/quartz_crack.xyz | 4322 - .../quip/doc/Tutorials/quartz_crack_bulk.xyz | 11 - .../doc/Tutorials/quartz_running_crack.png | Bin 401386 -> 0 bytes .../quip/doc/Tutorials/quartz_seed_crack.png | Bin 401754 -> 0 bytes .../quip/doc/Tutorials/quartz_unit_cell.png | Bin 273285 -> 0 bytes .../quippy-ase-interoperability.ipynb | 184 - .../quippy-descriptor-tutorial.ipynb | 1935 - .../quip/doc/Tutorials/run_crack_classical.py | 134 - .../doc/Tutorials/run_crack_classical_1.py | 87 - 3rdparty/quip/doc/Tutorials/run_crack_lotf.py | 196 - .../quip/doc/Tutorials/run_crack_lotf_1.py | 188 - .../quip/doc/Tutorials/run_crack_lotf_2.py | 197 - .../quip/doc/Tutorials/run_crack_lotf_3.py | 208 - 3rdparty/quip/doc/Tutorials/si-1000.xyz | 21800 --- 3rdparty/quip/doc/Tutorials/si8.png | Bin 27630 -> 0 bytes 3rdparty/quip/doc/Tutorials/si_bulk.png | Bin 58869 -> 0 bytes 3rdparty/quip/doc/Tutorials/sigma_yy.png | Bin 421580 -> 0 bytes .../structure_analysis/README.mean_var_correl | 37 - .../doc/Tutorials/surface-energy-annealed.sh | 21 - .../doc/Tutorials/surface-energy-relaxed.sh | 14 - 3rdparty/quip/doc/Tutorials/surface-energy.sh | 14 - 3rdparty/quip/doc/Tutorials/surface.png | Bin 29459 -> 0 bytes .../Tutorials/temperature-crack-position.png | Bin 49501 -> 0 bytes 3rdparty/quip/doc/Tutorials/thin-strip.png | Bin 16634 -> 0 bytes 3rdparty/quip/doc/Tutorials/totalenergy.png | Bin 32964 -> 0 bytes 3rdparty/quip/doc/Tutorials/tutorial.rst | 901 - 3rdparty/quip/doc/Tutorials/unit_slab.png | Bin 30539 -> 0 bytes .../quip/doc/Tutorials/unit_slab_shifted.png | Bin 34554 -> 0 bytes .../doc/Tutorials/velocitydistribution.png | Bin 40523 -> 0 bytes 3rdparty/quip/doc/_static/theme_overrides.css | 12 - 3rdparty/quip/doc/_templates/layout.html | 12 - 3rdparty/quip/doc/adglass.rst | 619 - 3rdparty/quip/doc/atomeye.rst | 29 - 3rdparty/quip/doc/atomeyerc | 13 - 3rdparty/quip/doc/atoms.rst | 36 - 3rdparty/quip/doc/clusters.rst | 25 - 3rdparty/quip/doc/conf.py | 382 - 3rdparty/quip/doc/connection.rst | 37 - 3rdparty/quip/doc/cp2k.rst | 33 - 3rdparty/quip/doc/crack.rst | 25 - 3rdparty/quip/doc/crack.xyz | 3602 - 3rdparty/quip/doc/debug.py | 15 - 3rdparty/quip/doc/descriptors.rst | 30 - 3rdparty/quip/doc/dictionary.rst | 27 - 3rdparty/quip/doc/domaindecomposition.rst | 28 - 3rdparty/quip/doc/dynamicalsystem.rst | 27 - 3rdparty/quip/doc/elasticity.rst | 27 - 3rdparty/quip/doc/electrostaticembed.rst | 26 - 3rdparty/quip/doc/f2py_wrapper_gen.rst | 77 - 3rdparty/quip/doc/f90doc.rst | 92 - 3rdparty/quip/doc/farray.rst | 51 - 3rdparty/quip/doc/favicon.ico | Bin 99678 -> 0 bytes 3rdparty/quip/doc/find_surface_atoms.rst | 25 - 3rdparty/quip/doc/fortran_wrapper.rst | 66 - 3rdparty/quip/doc/fortranio.rst | 25 - 3rdparty/quip/doc/gap_fit.rst | 42 - .../doc/h2-molecule-comparison-molpro.png | Bin 124525 -> 0 bytes 3rdparty/quip/doc/h2-molecule-comparison.png | Bin 171552 -> 0 bytes 3rdparty/quip/doc/hybrid.png | Bin 45911 -> 0 bytes 3rdparty/quip/doc/hydrogen-bond-length.py | 74 - 3rdparty/quip/doc/index.rst | 120 - 3rdparty/quip/doc/install.rst | 355 - 3rdparty/quip/doc/intro.rst | 612 - 3rdparty/quip/doc/io.rst | 519 - 3rdparty/quip/doc/linearalgebra.rst | 26 - .../doc/lotf-temperature-crack-position.png | Bin 42669 -> 0 bytes 3rdparty/quip/doc/lotf.rst | 30 - 3rdparty/quip/doc/modcontents.py | 118 - 3rdparty/quip/doc/mpi_context.rst | 26 - 3rdparty/quip/doc/oo_fortran.rst | 79 - 3rdparty/quip/doc/paramreader.rst | 26 - 3rdparty/quip/doc/patch_f2py.rst | 27 - 3rdparty/quip/doc/periodictable.rst | 25 - 3rdparty/quip/doc/phonons.rst | 25 - 3rdparty/quip/doc/polarization.rst | 26 - 3rdparty/quip/doc/potential.rst | 37 - 3rdparty/quip/doc/potentialenergy2.png | Bin 44135 -> 0 bytes .../quip/doc/qlab-aux-property-colouring.png | Bin 59456 -> 0 bytes 3rdparty/quip/doc/qlab-force-stress.png | Bin 385013 -> 0 bytes 3rdparty/quip/doc/qlab.rst | 25 - 3rdparty/quip/doc/qpxml.rst | 25 - 3rdparty/quip/doc/quartz-charge.png | Bin 64236 -> 0 bytes 3rdparty/quip/doc/quartz-filtered.png | Bin 50780 -> 0 bytes 3rdparty/quip/doc/quaternions.rst | 26 - 3rdparty/quip/doc/quippy.rst | 102 - 3rdparty/quip/doc/real_space_covariance.rst | 26 - .../quip/doc/run_crack_classical_lotf.patch | 141 - 3rdparty/quip/doc/si2x2x2.png | Bin 38848 -> 0 bytes 3rdparty/quip/doc/si8-1.png | Bin 94100 -> 0 bytes 3rdparty/quip/doc/si8-2.png | Bin 95135 -> 0 bytes 3rdparty/quip/doc/simplex.rst | 25 - 3rdparty/quip/doc/spline.rst | 25 - 3rdparty/quip/doc/structures.rst | 27 - 3rdparty/quip/doc/system.rst | 26 - 3rdparty/quip/doc/table.rst | 26 - .../quip/doc/thin-strip-displacement-y.png | Bin 80059 -> 0 bytes 3rdparty/quip/doc/topology.rst | 25 - 3rdparty/quip/doc/totalenergy2.png | Bin 48188 -> 0 bytes 3rdparty/quip/doc/tutorial.rst | 901 - 3rdparty/quip/doc/tutorials.rst | 30 - 3rdparty/quip/doc/units.rst | 27 - 3rdparty/quip/doc/util.rst | 25 - 3rdparty/quip/doc/video.py | 57 - 3rdparty/quip/doc/visualisation.rst | 26 - 3rdparty/quip/quippy/KIND_MAP | 19 - 3rdparty/quip/quippy/Makefile | 104 - 3rdparty/quip/quippy/README | 35 - 3rdparty/quip/quippy/STRING_LENGTHS | 11 - 3rdparty/quip/quippy/doc_plugin.py | 166 - 3rdparty/quip/quippy/fix_headers | 23 - 3rdparty/quip/quippy/init.py | 49 - 3rdparty/quip/quippy/quippy/convert.py | 212 - 3rdparty/quip/quippy/quippy/descriptors.py | 200 - .../quip/quippy/quippy/dynamicalsystem.py | 622 - 3rdparty/quip/quippy/quippy/potential.py | 324 - 3rdparty/quip/quippy/requirements.txt | 3 - 3rdparty/quip/quippy/setup.py | 14 - .../quip/share/Parameters/concat_quip_params | 43 - .../quip/share/Parameters/ip.parms.BKS.xml | 19 - .../quip/share/Parameters/ip.parms.BOP.xml | 4 - .../share/Parameters/ip.parms.Brenner.xml | 33 - .../Parameters/ip.parms.Brenner_2002.xml | 1 - .../Parameters/ip.parms.Brenner_Screened.xml | 1 - .../share/Parameters/ip.parms.Coulomb.xml | 18 - .../Parameters/ip.parms.DispTS.CH-example.xml | 9 - .../share/Parameters/ip.parms.EAM_ErcolAd.xml | 59 - .../share/Parameters/ip.parms.Einstein.xml | 3 - .../quip/share/Parameters/ip.parms.FB.xml | 18 - .../Parameters/ip.parms.FC.filled_FSM_cf.xml | 18 - .../quip/share/Parameters/ip.parms.FS.xml | 24 - .../quip/share/Parameters/ip.parms.Glue.xml | 109 - .../share/Parameters/ip.parms.Glue_CaCd.xml | 1090 - .../quip/share/Parameters/ip.parms.LJ.xml | 10 - .../ip.parms.Morse.CoSb3_CompMatSci_44.xml | 6 - .../quip/share/Parameters/ip.parms.SW.xml | 46 - .../ip.parms.SW_SiC_CASTEP_elastic.xml | 16 - .../ip.parms.SW_SiC_DFTB_elastic.xml | 16 - .../ip.parms.SW_Si_H_DFTB_elastic.xml | 38 - .../quip/share/Parameters/ip.parms.SW_VP.xml | 73 - .../share/Parameters/ip.parms.Si_MEAM.xml | 69 - .../share/Parameters/ip.parms.Sutton_Chen.xml | 14 - .../quip/share/Parameters/ip.parms.TS.xml | 36 - .../share/Parameters/ip.parms.Template.xml | 1 - .../share/Parameters/ip.parms.Tersoff.xml | 18 - .../quip/share/Parameters/k_pt_mesh.data.xml | 6 - .../Parameters/self_consistency.data.xml | 6 - .../Parameters/tightbind.parms.Bowler.xml | 12 - .../Parameters/tightbind.parms.GSP.BOP0.xml | 11 - .../tightbind.parms.NRL_TB.Al_PRB_61.xml | 41 - .../tightbind.parms.NRL_TB.CuAu.xml | 442 - .../tightbind.parms.NRL_TB.Cu_unpub99.xml | 41 - .../tightbind.parms.NRL_TB.Fe_paramag.xml | 39 - .../tightbind.parms.NRL_TB.Fe_spinpol.xml | 40 - .../Parameters/tightbind.parms.NRL_TB.Mo.xml | 40 - .../Parameters/tightbind.parms.NRL_TB.Pb.xml | 37 - .../Parameters/tightbind.parms.NRL_TB.Si.xml | 41 - .../tightbind.parms.NRL_TB.Ti_PRB_73.xml | 38 - .../Parameters/tightbind.parms.NRL_TB.W.xml | 40 - .../tightbind.parms.NRL_TB.W_new.xml | 40 - 3rdparty/quip/share/Structures/Makefile | 19 - 3rdparty/quip/share/Structures/NaCl.xyz | 4 - 3rdparty/quip/share/Structures/bcc.xyz | 3 - 3rdparty/quip/share/Structures/bcc_sc.xyz | 4 - 3rdparty/quip/share/Structures/beta_Sn.xyz | 4 - 3rdparty/quip/share/Structures/dia.xyz | 4 - 3rdparty/quip/share/Structures/dia_sc.xyz | 10 - 3rdparty/quip/share/Structures/fcc.xyz | 3 - 3rdparty/quip/share/Structures/fcc_100.xyz | 4 - 3rdparty/quip/share/Structures/fcc_110.xyz | 8 - 3rdparty/quip/share/Structures/fcc_111.xyz | 5 - .../quip/share/Structures/fcc_111_rect.xyz | 8 - 3rdparty/quip/share/Structures/fcc_sc.xyz | 6 - 3rdparty/quip/share/Structures/hcp.xyz | 4 - 3rdparty/quip/share/Structures/hcp_ortho.xyz | 6 - 3rdparty/quip/share/Structures/sc.xyz | 3 - 3rdparty/quip/share/Structures/sh.xyz | 3 - .../share/Structures/skutterudite_filled.xyz | 19 - .../Structures/skutterudite_filled_sc.xyz | 36 - .../Structures/skutterudite_unfilled.xyz | 18 - .../skutterudite_unfilled_cubic.xyz | 34 - 3rdparty/quip/share/Structures/trigonal.xyz | 5 - .../quip/share/Structures/zinc_blende.xyz | 4 - 3rdparty/quip/src/FilePot_drivers/Makefile | 99 - .../castep_driver/castep_driver.py | 618 - .../castep_driver/castep_driver.sh | 260 - .../castep_driver/dummy_castep.py | 74 - .../castep_driver/example.cell | 9 - .../castep_driver/example.param | 14 - .../castep_driver/split_castep_log | 40 - .../castep_server/client/cghost_tcm | 18 - .../castep_server/client/ckill | 10 - .../castep_server/client/ckill_tcm | 9 - .../castep_server/client/cqstat | 11 - .../castep_server/client/cqstat_tcm | 44 - .../FilePot_drivers/castep_server/client/crun | 51 - .../castep_server/client/crun_tcm | 65 - .../FilePot_drivers/castep_server/client/csub | 18 - .../castep_server/client/csub_tcm | 41 - .../castep_server/etc/cs_active | 0 .../castep_server/etc/cs_config | 11 - .../castep_server/etc/cs_hosts | 0 .../castep_server/server/castep_server | 152 - .../castep_server/server/get_job_status | 6 - .../castep_server/server/get_new_job_id | 6 - .../FilePot_drivers/castep_server/server/qdel | 42 - .../castep_server/server/qstat | 9 - .../castep_server/server/qstat.awk | 16 - .../FilePot_drivers/castep_server/server/qsub | 38 - .../castep_server/server/qsubw | 38 - .../castep_server/server/species_count | 22 - .../castep_server/server/status | 19 - .../FilePot_drivers/castep_server/server/stop | 6 - .../castep_server/server/submit | 30 - .../quip/src/FilePot_drivers/cp2k_driver.f95 | 119 - .../src/FilePot_drivers/cp2k_driver/BASIS_SET | 4050 - .../cp2k_driver/H2O32_300K.xyz | 98 - .../FilePot_drivers/cp2k_driver/MM_POTENTIAL | 36 - .../src/FilePot_drivers/cp2k_driver/POTENTIAL | 2370 - .../src/FilePot_drivers/cp2k_driver/README | 46 - .../src/FilePot_drivers/cp2k_driver/aala.xyz | 24 - .../cp2k_driver/all_res.CHARMM.lib | 3424 - .../cp2k_driver/benchmark_job/force_diff | 25 - .../benchmark_job/qmmm_big_qm/BASIS_SET | 4046 - .../benchmark_job/qmmm_big_qm/POTENTIAL | 2366 - .../benchmark_job/qmmm_big_qm/cp2k_input.inp | 938 - .../qmmm_big_qm/job.benchmark.qmmm_big.sge | 109 - .../qmmm_big_qm/out.bench_mana.gfortran.16p | 533 - .../qmmm_big_qm/out.bench_mana.gfortran.32p | 539 - .../qmmm_big_qm/out.bench_mana.intel.16p | 534 - .../qmmm_big_qm/out.bench_mana.intel.32p | 534 - .../quip-frc-1.xyz.bench_mana.gfortran.16p | 5102 - .../quip-frc-1.xyz.bench_mana.gfortran.32p | 5102 - .../quip-frc-1.xyz.bench_mana.intel.16p | 5102 - .../quip-frc-1.xyz.bench_mana.intel.32p | 5102 - .../benchmark_job/qmmm_big_qm/quip.wfn | Bin 11081364 -> 0 bytes .../benchmark_job/qmmm_big_qm/quip_cp2k.psf | 6540 - .../benchmark_job/qmmm_big_qm/quip_cp2k.xyz | 5102 - .../benchmark_job/qmmm_small_qm/BASIS_SET | 4046 - .../benchmark_job/qmmm_small_qm/POTENTIAL | 2366 - .../qmmm_small_qm/cp2k_input.inp | 268 - .../job.benchmark.qmmm_small.sge | 78 - .../benchmark_job/qmmm_small_qm/quip.wfn | Bin 79272 -> 0 bytes .../benchmark_job/qmmm_small_qm/quip_cp2k.psf | 4748 - .../benchmark_job/qmmm_small_qm/quip_cp2k.xyz | 3668 - .../cp2k_driver/benchmark_job/time_diff | 72 - .../charmm.pot.nonbonded_1_4_scale | 2 - ...mm.pot.nonbonded_1_4_scale_methyl_chloride | 2 - .../charmm.pot.nonbonded_1_4_scale_silica | 2 - .../cp2k_driver/charmm.pot_methyl_chloride | 3343 - .../cp2k_driver/charmm.pot_silica | 2326 - ...2k_colvar_restraint_constraint_print.patch | 206 - ...olvar_restraint_constraint_print_new.patch | 206 - .../cp2k_driver/cp2k_exyz.patch.OUTDATED | 353 - .../cp2k_driver/cp2k_exyz_new.patch | 380 - .../cp2k_driver/cp2k_fft_lib.patch | 62 - .../cp2k_driver/cp2k_input.template | 344 - .../cp2k_driver/cp2k_input.template2 | 117 - .../cp2k_input_silica_bks.template | 165 - .../cp2k_driver/cp2k_motion_utils.F.patch | 78 - .../cp2k_driver/cp2k_npt_y_new.patch | 1196 - .../cp2k_driver/cp2k_reftraj.patch | 157 - .../cp2k_driver/cp2k_silica.patch | 4814 - .../cp2k_driver/cp2k_silica_example.inp | 5532 - .../cp2k_driver/cp2k_silica_new.patch | 2642 - .../cp2k_driver/cp2k_speed.patch | 1825 - .../cp2k_driver/cp2k_speed.patch.outdated | 843 - .../cp2k_driver/cp2k_speed_new.patch | 303 - .../cp2k_topology_pdb.F.patch.OUTDATED | 64 - .../cp2k_driver/cp2k_wfn_read.patch | 29 - .../FilePot_drivers/cp2k_driver/diala_zw.xyz | 25 - .../FilePot_drivers/cp2k_driver/examples.sh | 14 - .../FilePot_drivers/cp2k_driver/link.template | 24 - .../cp2k_driver/make_current_diffs | 14 - .../cp2k_driver/patch_cp2k_silica.sh | 35 - .../FilePot_drivers/cp2k_driver/qmlist.dat | 7 - .../cp2k_driver/reference_test_silica.tar.gz | Bin 1717764 -> 0 bytes .../reference_test_silica/PSF_GENERATION | 10 - .../reference_test_silica/README | 7 - .../reference_test_silica/all_res.CHARMM.lib | 3340 - .../reference_test_silica/cp2k_input.template | 185 - .../reference_test_silica/exyz.CHARMM.xyz | 5189 - .../reference_test_silica/quip_cp2k.psf | 44721 ----- .../reference_test_silica/run.sh | 22 - .../silica_water_NVT_new-1.ener | 2 - .../silica_water_NVT_new-1.temp | 1 - .../silica_water_NVT_new-dump-1.pdb | 5188 - .../silica_water_NVT_new-dump-1.psf | 44728 ----- .../silica_water_NVT_new-frc-1.xyz | 5189 - .../silica_water_NVT_new-frc-1.xyz_ref | 5189 - ...ter_NVT_new-frc-1.xyz_ref_before2010-04-09 | 5189 - .../silica_water_NVT_new-pos-1.xyz | 5189 - .../silica_water_NVT_new-vel-1.xyz | 5189 - .../silica_water_NVT_new.inp | 5476 - .../silica_water_NVT_new.out | 442 - .../silica_water_NVT_new.out_ref | 440 - ...ica_water_NVT_new.out_ref_before2010-04-09 | 440 - .../reference_test_silica_dopa/README | 3 - .../reference_test_silica_dopa/charmm.pot_ext | 2334 - .../reference_test_silica_dopa/cp2k.inp | 313 - .../reference_test_silica_dopa/cp2k.out_ref | 378 - .../dopa_A_water_quartz.psf | 55262 ------ .../dopa_A_water_quartz.xyz | 5158 - .../nvt-frc-1.xyz_ref | 5158 - .../reference_test_silica_dopa/restart.rst | 10668 -- .../reference_test_silica_dopa/run.sh | 22 - .../cp2k_driver/top_all22_prot_cmap.inp | 1761 - .../FilePot_drivers/cp2k_driver_module.f95 | 1871 - .../src/FilePot_drivers/cp2k_driver_old.f95 | 2708 - .../src/FilePot_drivers/cp2k_filepot_old.f95 | 259 - .../quip/src/FilePot_drivers/dbop_driver.sh | 195 - .../src/FilePot_drivers/dl_poly_driver.sh | 234 - .../quip/src/FilePot_drivers/evb_driver.f95 | 254 - .../quip/src/FilePot_drivers/molpro_driver.sh | 155 - .../profess_driver/profess.inpt.template | 18 - .../profess_driver/profess.ion.template | 4 - .../profess_driver/profess_driver.py | 243 - .../quip/src/FilePot_drivers/vasp_driver.f95 | 739 - .../vasp_driver/patch.REFTRAJ.vasp.4.6 | 170 - .../vasp_driver/patch.REFTRAJ.vasp.5.2.12 | 161 - .../vasp_driver/patch.REFTRAJ.vasp.5.lib | 20 - .../src/Potentials/AdjustablePotential.f95 | 1310 - 3rdparty/quip/src/Potentials/ApproxFermi.f95 | 293 - 3rdparty/quip/src/Potentials/COPYRIGHT | 29 - 3rdparty/quip/src/Potentials/CallbackPot.f95 | 310 - .../src/Potentials/ElectrostaticEmbed.f95 | 544 - 3rdparty/quip/src/Potentials/Ewald.f95 | 830 - 3rdparty/quip/src/Potentials/FilePot.f95 | 495 - 3rdparty/quip/src/Potentials/Functions.f95 | 451 - 3rdparty/quip/src/Potentials/IP.f95 | 1122 - 3rdparty/quip/src/Potentials/IPEwald.f95 | 554 - 3rdparty/quip/src/Potentials/IPModel_ASAP.f95 | 1027 - 3rdparty/quip/src/Potentials/IPModel_BOP.f95 | 800 - .../quip/src/Potentials/IPModel_BornMayer.f95 | 571 - .../quip/src/Potentials/IPModel_Brenner.f95 | 713 - .../src/Potentials/IPModel_Brenner_2002.f95 | 399 - .../Potentials/IPModel_Brenner_Screened.f95 | 404 - 3rdparty/quip/src/Potentials/IPModel_CH4.f95 | 204 - .../Potentials/IPModel_ConfiningMonomer.f95 | 340 - .../quip/src/Potentials/IPModel_Coulomb.f95 | 530 - .../quip/src/Potentials/IPModel_Custom.f95 | 192 - .../quip/src/Potentials/IPModel_DispTS.f95 | 647 - .../IPModel_EAM_Ercolessi_Adams.f95 | 814 - .../quip/src/Potentials/IPModel_Einstein.f95 | 369 - 3rdparty/quip/src/Potentials/IPModel_FB.f95 | 455 - 3rdparty/quip/src/Potentials/IPModel_FC.f95 | 713 - 3rdparty/quip/src/Potentials/IPModel_FC4.f95 | 836 - 3rdparty/quip/src/Potentials/IPModel_FS.f95 | 589 - 3rdparty/quip/src/Potentials/IPModel_FX.f95 | 367 - 3rdparty/quip/src/Potentials/IPModel_GAP.f95 | 959 - 3rdparty/quip/src/Potentials/IPModel_Glue.f95 | 905 - .../quip/src/Potentials/IPModel_HFdimer.f95 | 208 - 3rdparty/quip/src/Potentials/IPModel_KIM.f95 | 683 - 3rdparty/quip/src/Potentials/IPModel_LJ.f95 | 747 - .../quip/src/Potentials/IPModel_LMTO_TBE.f95 | 362 - .../src/Potentials/IPModel_LinearSOAP.f95 | 535 - 3rdparty/quip/src/Potentials/IPModel_MBD.f95 | 275 - 3rdparty/quip/src/Potentials/IPModel_MTP.f95 | 255 - .../quip/src/Potentials/IPModel_Morse.f95 | 569 - .../src/Potentials/IPModel_Multipoles.f95 | 700 - .../Potentials/IPModel_PartridgeSchwenke.f95 | 709 - 3rdparty/quip/src/Potentials/IPModel_SCME.f95 | 336 - 3rdparty/quip/src/Potentials/IPModel_SW.f95 | 920 - .../quip/src/Potentials/IPModel_SW_VP.f95 | 1218 - .../quip/src/Potentials/IPModel_Si_MEAM.f95 | 704 - .../quip/src/Potentials/IPModel_Spring.f95 | 259 - .../src/Potentials/IPModel_Sutton_Chen.f95 | 458 - 3rdparty/quip/src/Potentials/IPModel_TS.f95 | 968 - .../quip/src/Potentials/IPModel_TTM_nF.f90 | 365 - .../quip/src/Potentials/IPModel_Template.f95 | 295 - .../quip/src/Potentials/IPModel_Tersoff.f95 | 735 - .../quip/src/Potentials/IPModel_Tether.f95 | 197 - .../Potentials/IPModel_WaterDimer_Gillan.f95 | 1024 - .../Potentials/IPModel_WaterTrimer_Gillan.f95 | 700 - 3rdparty/quip/src/Potentials/IPModel_ZBL.f95 | 311 - .../quip/src/Potentials/IPModel_interface.h | 34 - 3rdparty/quip/src/Potentials/Makefile | 136 - 3rdparty/quip/src/Potentials/Matrix.f95 | 1551 - .../src/Potentials/Multipole_Interactions.f95 | 764 - 3rdparty/quip/src/Potentials/Multipoles.f95 | 642 - .../Potentials/Partridge_Schwenke_Dipole.f95 | 713 - 3rdparty/quip/src/Potentials/Potential.f95 | 2434 - .../Potentials/Potential_Cluster_header.f95 | 65 - .../Potentials/Potential_Cluster_routines.f95 | 163 - .../src/Potentials/Potential_EVB_header.f95 | 46 - .../src/Potentials/Potential_EVB_routines.f95 | 400 - .../Potential_ForceMixing_header.f95 | 128 - .../Potential_ForceMixing_routines.f95 | 783 - .../src/Potentials/Potential_Hybrid_utils.f95 | 284 - .../Potential_Local_E_Mix_header.f95 | 83 - .../Potential_Local_E_Mix_routines.f95 | 435 - .../src/Potentials/Potential_ONIOM_header.f95 | 81 - .../Potentials/Potential_ONIOM_routines.f95 | 410 - .../src/Potentials/Potential_Precon_Minim.f95 | 1659 - .../src/Potentials/Potential_Sum_header.f95 | 32 - .../src/Potentials/Potential_Sum_routines.f95 | 173 - .../quip/src/Potentials/Potential_simple.f95 | 1611 - .../quip/src/Potentials/QC_QUIP_Wrapper.f95 | 294 - 3rdparty/quip/src/Potentials/QUIP_Common.f95 | 113 - 3rdparty/quip/src/Potentials/QUIP_module.f95 | 74 - 3rdparty/quip/src/Potentials/README | 5 - .../quip/src/Potentials/RS_SparseMatrix.f95 | 2146 - 3rdparty/quip/src/Potentials/SK_SO_vogl.h | 484 - 3rdparty/quip/src/Potentials/SK_vogl.h | 1222 - 3rdparty/quip/src/Potentials/SKd_vogl.h | 2956 - 3rdparty/quip/src/Potentials/ScaLAPACK.f95 | 1306 - 3rdparty/quip/src/Potentials/SocketPot.f95 | 341 - 3rdparty/quip/src/Potentials/TB.f95 | 2360 - 3rdparty/quip/src/Potentials/TBMatrix.f95 | 1310 - 3rdparty/quip/src/Potentials/TBModel.f95 | 674 - .../quip/src/Potentials/TBModel_Bowler.f95 | 1089 - 3rdparty/quip/src/Potentials/TBModel_DFTB.f95 | 1143 - 3rdparty/quip/src/Potentials/TBModel_GSP.f95 | 1385 - .../quip/src/Potentials/TBModel_NRL_TB.f95 | 1921 - .../src/Potentials/TBModel_NRL_TB_defs.f95 | 48 - .../quip/src/Potentials/TBModel_interface.h | 44 - 3rdparty/quip/src/Potentials/TBSystem.f95 | 3943 - 3rdparty/quip/src/Potentials/TB_Common.f95 | 357 - .../src/Potentials/TB_GreensFunctions.f95 | 649 - 3rdparty/quip/src/Potentials/TB_Kpoints.f95 | 819 - 3rdparty/quip/src/Potentials/TB_Mixing.f95 | 518 - 3rdparty/quip/src/Potentials/TO_DO | 37 - 3rdparty/quip/src/Potentials/Yukawa.f95 | 594 - 3rdparty/quip/src/Potentials/error.inc | 131 - 3rdparty/quip/src/Potentials/ginted.f | 85 - 3rdparty/quip/src/Potentials/intro.tex | 34 - .../src/Potentials/quip_lammps_wrapper.f95 | 192 - .../src/Potentials/quip_unified_wrapper.f95 | 239 - .../quip/src/Programs/Constraints_Demo.f95 | 163 - 3rdparty/quip/src/Programs/DFTB_to_xml.f95 | 397 - 3rdparty/quip/src/Programs/Examples/README | 6 - .../quip/src/Programs/Examples/cxyzreader.f95 | 70 - .../Programs/Examples/domdecomp_example.f95 | 222 - .../quip/src/Programs/Examples/lj_example.f95 | 72 - .../src/Programs/Examples/lotf_metapot.f95 | 117 - .../quip/src/Programs/Examples/lotf_time.f95 | 172 - .../Programs/Examples/lotf_time_metapot.f95 | 129 - .../src/Programs/Examples/lotfpc_metapot.f95 | 149 - 3rdparty/quip/src/Programs/Examples/md.xyz | 4 - .../quip/src/Programs/Examples/md_example.f95 | 91 - 3rdparty/quip/src/Programs/FC_to_xml.f95 | 121 - 3rdparty/quip/src/Programs/GF_SC_notes.tex | 182 - 3rdparty/quip/src/Programs/Makefile | 86 - 3rdparty/quip/src/Programs/NRL_TB_to_xml.f95 | 1076 - 3rdparty/quip/src/Programs/QMMM_md_buf.f95 | 1978 - 3rdparty/quip/src/Programs/README | 5 - 3rdparty/quip/src/Programs/SC_notes.tex | 297 - 3rdparty/quip/src/Programs/TO_DO | 2 - 3rdparty/quip/src/Programs/align.f95 | 110 - .../src/Programs/analytical_free_E_UI.f95 | 177 - .../quip/src/Programs/analyze_md_phonons.f95 | 176 - .../quip/src/Programs/basin_exploration.f95 | 356 - 3rdparty/quip/src/Programs/bulktest.f95 | 322 - 3rdparty/quip/src/Programs/calc_n_poles.f95 | 59 - 3rdparty/quip/src/Programs/callback_test.f95 | 125 - 3rdparty/quip/src/Programs/crack.f95 | 1532 - 3rdparty/quip/src/Programs/crack.xml | 63 - 3rdparty/quip/src/Programs/crackdoc/Makefile | 35 - .../quip/src/Programs/crackdoc/flow-chart.eps | 259 - .../quip/src/Programs/crackdoc/loading.eps | 7223 - .../Programs/crackdoc/qm-selection-crack.eps | 2383 - .../src/Programs/create_hybrid_cluster.f95 | 120 - .../Programs/descriptors_wrapper_example.f95 | 58 - 3rdparty/quip/src/Programs/eval_server.sh | 98 - 3rdparty/quip/src/Programs/fgp.f95 | 690 - .../quip/src/Programs/fix_traj_latest.f95 | 98 - 3rdparty/quip/src/Programs/kp_mesh.py | 104 - 3rdparty/quip/src/Programs/local_E_fd.f95 | 145 - .../quip/src/Programs/local_random_search.f95 | 300 - 3rdparty/quip/src/Programs/lotf_params.xml | 56 - 3rdparty/quip/src/Programs/mark_hybrid.f95 | 112 - 3rdparty/quip/src/Programs/md.f95 | 1005 - 3rdparty/quip/src/Programs/md_gid.f95 | 254 - 3rdparty/quip/src/Programs/metapot_test.f95 | 136 - .../src/Programs/order_atoms_as_molecules.f95 | 94 - .../quip/src/Programs/parallel_io_test.f95 | 104 - 3rdparty/quip/src/Programs/quip.f95 | 832 - .../src/Programs/quip_wrapper_example.f95 | 40 - .../Programs/quip_wrapper_simple_example.f95 | 35 - .../Programs/quip_wrapper_simple_example_C.c | 27 - 3rdparty/quip/src/Programs/randomise_calc.f95 | 161 - 3rdparty/quip/src/Programs/rotate.f95 | 62 - 3rdparty/quip/src/Programs/slice_sample.f95 | 371 - 3rdparty/quip/src/Programs/socktest.f95 | 81 - 3rdparty/quip/src/Programs/socktest2.f95 | 86 - 3rdparty/quip/src/Programs/tabletest.f95 | 273 - .../Programs/test_CASTEP_MM_buffer_crack.f95 | 108 - .../src/Programs/test_CASTEP_water_bulk.f95 | 219 - .../src/Programs/test_CASTEP_water_chain.f95 | 145 - 3rdparty/quip/src/Programs/test_cova.f95 | 173 - 3rdparty/quip/src/Programs/test_dimer.f95 | 114 - 3rdparty/quip/src/Programs/ts_calculation.f95 | 204 - 3rdparty/quip/src/Programs/vacancy_map.f95 | 159 - .../Programs/vacancy_map_forcemix_relax.f95 | 160 - .../Programs/vacancy_map_hybrid_generate.f95 | 202 - .../src/Programs/vacancy_map_hybrid_relax.f95 | 134 - .../quip/src/Programs/vacancy_map_mod.f95 | 97 - .../quip/src/Programs/water_dimer_mayer.f95 | 239 - 3rdparty/quip/src/Programs/water_dimer_mc.f95 | 275 - 3rdparty/quip/src/Programs/wrap.f95 | 63 - .../src/Programs/xyz_to_SPECSYM_forces.f95 | 71 - .../src/Programs/xyz_to_SPECSYM_start.f95 | 63 - .../quip/src/Structure_processors/Makefile | 87 - .../src/Structure_processors/UI_integrate.f95 | 77 - .../src/Structure_processors/angle_distr.f95 | 907 - .../src/Structure_processors/clean_traj.f95 | 117 - .../quip/src/Structure_processors/convert.f95 | 72 - .../coordination_number.f95 | 300 - .../src/Structure_processors/decimate.f95 | 76 - .../quip/src/Structure_processors/density.f95 | 326 - .../src/Structure_processors/density_1d.f95 | 632 - .../src/Structure_processors/density_KDE.f95 | 701 - .../src/Structure_processors/density_new.f95 | 792 - .../src/Structure_processors/diffusion.f95 | 168 - .../Structure_processors/elastic_fields.f95 | 106 - .../src/Structure_processors/extract_EVB.f95 | 227 - .../src/Structure_processors/extract_cv.f95 | 288 - .../src/Structure_processors/file_rewrite.f95 | 97 - .../Structure_processors/find_space_minim.f95 | 291 - .../histogram_process.f95 | 326 - .../make_bulk_supercell.f95 | 38 - .../src/Structure_processors/make_k_mesh.f95 | 39 - .../make_surface_slab_vasp.f95 | 319 - .../Structure_processors/mean_var_correl.f95 | 797 - .../mean_var_decorrelated_err.f95 | 42 - .../src/Structure_processors/merge_traj.f95 | 102 - .../move_displacement_field.f95 | 122 - .../Structure_processors/msd_vibrations.f95 | 131 - .../quip/src/Structure_processors/nc2movie | 122 - .../quip/src/Structure_processors/rdfd.f95 | 323 - .../quip/src/Structure_processors/rings.f95 | 109 - .../quip/src/Structure_processors/solvate.f95 | 177 - .../Structure_processors/solvate_silica.f95 | 257 - .../structure_analysis_traj.f95 | 1400 - .../Structure_processors/temperature_by_kind | 65 - .../src/Structure_processors/test_ran.f95 | 93 - .../Structure_processors/vel_power_spectrum | 101 - .../src/Structure_processors/xyz2ecfg.awk | 265 - .../quip/src/Structure_processors/xyz2movie | 121 - .../quip/src/Structure_processors/xyz2pdb.f95 | 329 - .../xyz2residue_library.f95 | 52 - 3rdparty/quip/src/Utils/Makefile | 81 - 3rdparty/quip/src/Utils/crackparams.f95 | 1980 - 3rdparty/quip/src/Utils/cracktools.f95 | 2868 - 3rdparty/quip/src/Utils/elasticity.f95 | 736 - .../Utils/force_machine_learning_module.f95 | 1259 - 3rdparty/quip/src/Utils/phonons.f95 | 1241 - .../quip/src/Utils/real_space_covariance.f95 | 1101 - .../src/Utils/restraints_constraints_xml.f95 | 446 - .../structure_analysis_traj_routines.f95 | 1844 - 3rdparty/quip/src/Utils/transition_state.f95 | 802 - 3rdparty/quip/src/Utils/ts_params.f95 | 399 - 3rdparty/quip/src/f90wrap/LICENSE | 165 - 3rdparty/quip/src/f90wrap/README.md | 295 - 3rdparty/quip/src/f90wrap/docs/Makefile | 177 - 3rdparty/quip/src/f90wrap/docs/api.rst | 14 - .../f90wrap/docs/apidocs/f90wrap.codegen.rst | 7 - .../docs/apidocs/f90wrap.f90wrapgen.rst | 7 - .../f90wrap/docs/apidocs/f90wrap.fortran.rst | 7 - .../docs/apidocs/f90wrap.fortrantype.rst | 7 - .../f90wrap/docs/apidocs/f90wrap.latex.rst | 7 - .../f90wrap/docs/apidocs/f90wrap.parser.rst | 7 - .../docs/apidocs/f90wrap.pywrapgen.rst | 7 - .../quip/src/f90wrap/docs/apidocs/f90wrap.rst | 24 - .../docs/apidocs/f90wrap.transform.rst | 7 - .../quip/src/f90wrap/docs/apidocs/modules.rst | 7 - 3rdparty/quip/src/f90wrap/docs/conf.py | 295 - 3rdparty/quip/src/f90wrap/docs/index.rst | 114 - .../f90wrap/docs/tutorials/WCPM_logo_text.png | Bin 50398 -> 0 bytes .../docs/tutorials/ase-calculators.png | Bin 136520 -> 0 bytes .../docs/tutorials/boron-crack-100dpi.png | Bin 1012629 -> 0 bytes .../tutorials/f90wrap-demo-feb-2020.ipynb | 1228 - .../src/f90wrap/docs/tutorials/f90wrap.png | Bin 102614 -> 0 bytes .../kermode-csc-warwick-nov-2015.ipynb | 1204 - .../src/f90wrap/docs/tutorials/multiscale.png | Bin 143618 -> 0 bytes .../f90wrap/docs/tutorials/scipy-stack.png | Bin 75312 -> 0 bytes .../f90wrap/docs/tutorials/warwick-logo.png | Bin 746338 -> 0 bytes 3rdparty/quip/src/f90wrap/docs/usage.rst | 135 - .../quip/src/f90wrap/examples/CMakeLists.txt | 38 - 3rdparty/quip/src/f90wrap/examples/Makefile | 40 - .../examples/arrayderivedtypes/Makefile | 136 - .../examples/arrayderivedtypes/kind_map | 14 - .../examples/arrayderivedtypes/test.f90 | 17 - .../examples/arrayderivedtypes/tests.py | 26 - .../quip/src/f90wrap/examples/arrays/Makefile | 142 - .../src/f90wrap/examples/arrays/README.md | 36 - .../quip/src/f90wrap/examples/arrays/kind_map | 14 - .../src/f90wrap/examples/arrays/library.f90 | 50 - .../f90wrap/examples/arrays/memory_profile.py | 59 - .../f90wrap/examples/arrays/parameters.f90 | 13 - .../quip/src/f90wrap/examples/arrays/tests.py | 86 - .../f90wrap/examples/arrays_fixed/Makefile | 142 - .../f90wrap/examples/arrays_fixed/README.md | 36 - .../f90wrap/examples/arrays_fixed/kind_map | 14 - .../f90wrap/examples/arrays_fixed/library.f | 52 - .../examples/arrays_fixed/memory_profile.py | 59 - .../examples/arrays_fixed/parameters.f | 13 - .../f90wrap/examples/arrays_fixed/tests.py | 86 - .../arrays_in_derived_types_issue50/Makefile | 136 - .../arrays_in_derived_types_issue50/kind_map | 15 - .../arrays_in_derived_types_issue50/test.f90 | 18 - .../arrays_in_derived_types_issue50/tests.py | 33 - .../callback_print_function_issue93/Makefile | 144 - .../callback_print_function_issue93/README.md | 38 - .../callback_print_output_python.ipynb | 261 - .../caller.f90 | 28 - .../callback_print_function_issue93/cback.f90 | 30 - .../callback_print_function_issue93/kind_map | 9 - .../callback_print_function_issue93/tests.py | 61 - .../src/f90wrap/examples/cylinder/DNAD.f90 | 1744 - .../f90wrap/examples/cylinder/DNADHeaders.h | 305 - .../src/f90wrap/examples/cylinder/Makefile | 141 - .../quip/src/f90wrap/examples/cylinder/README | 4 - .../src/f90wrap/examples/cylinder/cyldnad.f90 | 15 - .../f90wrap/examples/cylinder/cylinder.ipynb | 257 - .../src/f90wrap/examples/cylinder/kind_map | 20 - .../src/f90wrap/examples/cylinder/tests.py | 44 - .../examples/derived-type-aliases/Makefile | 141 - .../examples/derived-type-aliases/kind_map | 16 - .../derived-type-aliases/mytype_mod.f90 | 25 - .../derived-type-aliases/othertype_mod.f90 | 25 - .../examples/derived-type-aliases/tests.py | 13 - .../f90wrap/examples/derivedtypes/Makefile | 142 - .../f90wrap/examples/derivedtypes/README.md | 37 - .../examples/derivedtypes/datatypes.f90 | 109 - .../f90wrap/examples/derivedtypes/kind_map | 17 - .../f90wrap/examples/derivedtypes/library.f90 | 184 - .../examples/derivedtypes/memory_profile.py | 59 - .../examples/derivedtypes/parameters.f90 | 13 - .../f90wrap/examples/derivedtypes/tests.py | 278 - .../examples/derivedtypes/tests_pkg.py | 1 - .../src/f90wrap/examples/elemental/Makefile | 12 - .../examples/elemental/elemental_module.f90 | 13 - .../src/f90wrap/examples/elemental/kind_map | 17 - .../src/f90wrap/examples/elemental/test.py | 26 - .../f90wrap/examples/errorbinding/Makefile | 142 - .../f90wrap/examples/errorbinding/README.md | 22 - .../examples/errorbinding/datatypes.f90 | 48 - .../f90wrap/examples/errorbinding/kind_map | 17 - .../examples/errorbinding/parameters.f90 | 13 - .../example2/ExampleMakefiles/Makefile | 273 - .../example2/ExampleMakefiles/Makefile_py | 134 - .../src/f90wrap/examples/example2/Makefile | 143 - .../quip/src/f90wrap/examples/example2/README | 4 - .../Source/BasicDefs/aa0_typelist.F90 | 24 - .../example2/Source/BasicDefs/aa1_modules.F90 | 55 - .../BasicDefs/aa2_defineAllProperties.F90 | 58 - .../Source/BasicDefs/assign_constants.F90 | 96 - .../example2/Source/HeliSrc/set_defaults.F90 | 32 - .../src/f90wrap/examples/example2/kind_map | 11 - .../f90wrap/examples/example2/test_module.py | 86 - .../f90wrap/examples/example2/test_package.py | 91 - .../src/f90wrap/examples/extends/Makefile | 19 - .../f90wrap/examples/extends/testextends.f90 | 21 - .../Makefile | 14 - .../dummy.file | 1 - .../functions.f90 | 33 - .../tests.py | 48 - .../src/f90wrap/examples/interface/Makefile | 31 - .../src/f90wrap/examples/interface/README.md | 1 - .../f90wrap/examples/interface/example.f90 | 75 - .../src/f90wrap/examples/interface/test.py | 28 - .../f90wrap/examples/interface/test_pkg.py | 27 - .../Makefile | 20 - .../main.f90 | 37 - .../run.py | 12 - .../src/f90wrap/examples/issue32/Makefile | 25 - .../src/f90wrap/examples/issue32/kind_map | 4 - .../src/f90wrap/examples/issue32/test.f90 | 5 - .../f90wrap/examples/mockderivetype/Makefile | 55 - .../examples/mockderivetype/Makefile.ifort | 95 - .../examples/mockderivetype/define.f90 | 63 - .../f90wrap/examples/mockderivetype/fwrap.f90 | 71 - .../f90wrap/examples/mockderivetype/kind_map | 11 - .../examples/mockderivetype/leveltwomod.f90 | 9 - .../examples/mockderivetype/readme.rst | 17 - .../f90wrap/examples/mockderivetype/test.py | 84 - .../examples/mockderivetype/testpkg.py | 86 - .../f90wrap/examples/mod_arg_clash/Makefile | 20 - .../f90wrap/examples/mod_arg_clash/test.f90 | 32 - .../f90wrap/examples/mod_arg_clash/test.py | 28 - .../examples/optional_args_issue53/Makefile | 20 - .../examples/optional_args_issue53/main.f90 | 12 - .../examples/optional_args_issue53/run.py | 27 - .../examples/optional_derived_arrays/Makefile | 19 - .../examples/optional_derived_arrays/test.f90 | 31 - .../passbyreference/example_mymodule.py | 37 - .../f90wrap/examples/passbyreference/makefile | 19 - .../examples/passbyreference/mycode.F90 | 25 - .../f90wrap/examples/recursive_type/Makefile | 139 - .../f90wrap/examples/recursive_type/README.md | 28 - .../f90wrap/examples/recursive_type/kind_map | 14 - .../f90wrap/examples/recursive_type/tests.py | 55 - .../f90wrap/examples/recursive_type/tree.f90 | 29 - .../examples/recursive_type_array/Makefile | 136 - .../examples/recursive_type_array/kind_map | 14 - .../examples/recursive_type_array/test.f90 | 23 - .../examples/recursive_type_array/tests.py | 36 - .../src/f90wrap/examples/strings/Makefile | 141 - .../src/f90wrap/examples/strings/README.md | 25 - .../src/f90wrap/examples/strings/kind_map | 16 - .../f90wrap/examples/strings/string_io.f90 | 57 - .../src/f90wrap/examples/strings/tests.py | 93 - .../f90wrap/examples/subroutine_args/Makefile | 140 - .../f90wrap/examples/subroutine_args/kind_map | 16 - .../subroutine_args/subroutine_mod.f90 | 53 - .../f90wrap/examples/subroutine_args/tests.py | 16 - .../subroutine_contains_issue101/Makefile | 23 - .../subroutine_contains_issue101/run.py | 39 - .../subroutine_contains_issue101/test.f90 | 95 - .../src/f90wrap/examples/type_bn/Makefile | 32 - .../src/f90wrap/examples/type_bn/README.md | 4 - .../quip/src/f90wrap/examples/type_bn/test.py | 27 - .../src/f90wrap/examples/type_bn/type_bn.f90 | 7 - 3rdparty/quip/src/f90wrap/f90wrap/__init__.py | 50 - .../src/f90wrap/f90wrap/arraydatamodule.c | 193 - 3rdparty/quip/src/f90wrap/f90wrap/codegen.py | 137 - .../quip/src/f90wrap/f90wrap/f90wrapgen.py | 867 - 3rdparty/quip/src/f90wrap/f90wrap/fortran.py | 968 - .../quip/src/f90wrap/f90wrap/fortrantype.py | 131 - 3rdparty/quip/src/f90wrap/f90wrap/latex.py | 950 - 3rdparty/quip/src/f90wrap/f90wrap/parser.py | 1517 - .../quip/src/f90wrap/f90wrap/pywrapgen.py | 752 - 3rdparty/quip/src/f90wrap/f90wrap/runtime.py | 55 - 3rdparty/quip/src/f90wrap/f90wrap/six.py | 890 - .../src/f90wrap/f90wrap/sizeoffortran.f90 | 12 - .../quip/src/f90wrap/f90wrap/transform.py | 1473 - 3rdparty/quip/src/f90wrap/pyproject.toml | 4 - 3rdparty/quip/src/f90wrap/requirements.txt | 2 - .../quip/src/f90wrap/scripts/f2py-f90wrap | 183 - 3rdparty/quip/src/f90wrap/scripts/f90doc | 122 - 3rdparty/quip/src/f90wrap/scripts/f90wrap | 408 - 3rdparty/quip/src/f90wrap/setup.py | 68 - 3rdparty/quip/src/f90wrap/test/.gitignore | 1 - 3rdparty/quip/src/f90wrap/test/__init__.py | 10 - .../quip/src/f90wrap/test/samples/circle.f90 | 94 - .../src/f90wrap/test/samples/test_circle.f90 | 20 - 3rdparty/quip/src/f90wrap/test/test_parser.py | 26 - .../quip/src/f90wrap/test/test_transform.py | 83 - 3rdparty/quip/src/f90wrap/version.txt | 2 - 3rdparty/quip/src/fox/CMakeLists.txt | 182 - 3rdparty/quip/src/fox/CTestConfig.cmake | 15 - 3rdparty/quip/src/fox/Changelog | 94 - .../src/fox/DoX/AttributeDictionaries.html | 206 - .../quip/src/fox/DoX/AttributeDictionaries.md | 152 - 3rdparty/quip/src/fox/DoX/Compilation.html | 209 - 3rdparty/quip/src/fox/DoX/Compilation.md | 184 - 3rdparty/quip/src/fox/DoX/Debugging.html | 73 - 3rdparty/quip/src/fox/DoX/Debugging.md | 58 - 3rdparty/quip/src/fox/DoX/DoX.css | 53 - 3rdparty/quip/src/fox/DoX/Embedding.html | 131 - 3rdparty/quip/src/fox/DoX/Embedding.md | 111 - 3rdparty/quip/src/fox/DoX/FoX.html | 97 - 3rdparty/quip/src/fox/DoX/FoX.md | 73 - 3rdparty/quip/src/fox/DoX/FoX_DoX.html | 3942 - 3rdparty/quip/src/fox/DoX/FoX_common.html | 46 - 3rdparty/quip/src/fox/DoX/FoX_common.md | 29 - 3rdparty/quip/src/fox/DoX/FoX_dom.html | 779 - 3rdparty/quip/src/fox/DoX/FoX_dom.md | 692 - 3rdparty/quip/src/fox/DoX/FoX_sax.html | 575 - 3rdparty/quip/src/fox/DoX/FoX_sax.md | 492 - 3rdparty/quip/src/fox/DoX/FoX_utils.html | 155 - 3rdparty/quip/src/fox/DoX/FoX_utils.md | 143 - 3rdparty/quip/src/fox/DoX/FoX_wcml.html | 525 - 3rdparty/quip/src/fox/DoX/FoX_wcml.md | 440 - 3rdparty/quip/src/fox/DoX/FoX_wkml.html | 441 - 3rdparty/quip/src/fox/DoX/FoX_wkml.md | 384 - 3rdparty/quip/src/fox/DoX/FoX_wxml.html | 453 - 3rdparty/quip/src/fox/DoX/FoX_wxml.md | 383 - 3rdparty/quip/src/fox/DoX/Information.html | 24 - 3rdparty/quip/src/fox/DoX/Information.md | 12 - 3rdparty/quip/src/fox/DoX/Licensing.html | 82 - 3rdparty/quip/src/fox/DoX/Licensing.md | 72 - 3rdparty/quip/src/fox/DoX/Standards.html | 47 - 3rdparty/quip/src/fox/DoX/Standards.md | 35 - .../quip/src/fox/DoX/StringConversion.html | 89 - 3rdparty/quip/src/fox/DoX/StringConversion.md | 72 - .../quip/src/fox/DoX/StringFormatting.html | 141 - 3rdparty/quip/src/fox/DoX/StringFormatting.md | 121 - 3rdparty/quip/src/fox/DoX/Versioning.html | 37 - 3rdparty/quip/src/fox/DoX/Versioning.md | 27 - 3rdparty/quip/src/fox/DoX/head | 9 - 3rdparty/quip/src/fox/DoX/index.html | 1 - 3rdparty/quip/src/fox/DoX/makefile | 21 - 3rdparty/quip/src/fox/DoX/tail | 3 - 3rdparty/quip/src/fox/FoX-config.in | 130 - 3rdparty/quip/src/fox/FoX.vfproj | 117 - 3rdparty/quip/src/fox/Fox.vfproj.README | 16 - 3rdparty/quip/src/fox/LICENSE | 71 - 3rdparty/quip/src/fox/Makefile | 181 - 3rdparty/quip/src/fox/README | 13 - 3rdparty/quip/src/fox/RELEASE | 18 - 3rdparty/quip/src/fox/arch.make | 0 3rdparty/quip/src/fox/arch.make.in | 43 - 3rdparty/quip/src/fox/cmake/CMakeLists.txt | 43 - .../src/fox/cmake/CheckAbortIntrinsic.cmake | 66 - .../src/fox/cmake/CheckAssociatedBug.cmake | 16 - .../src/fox/cmake/CheckFlushIntrinsic.cmake | 65 - .../quip/src/fox/cmake/DetermineEOL.cmake | 22 - .../src/fox/cmake/Fortran_Have_Flush.cmake | 7 - 3rdparty/quip/src/fox/cmake/abort_bare.f90 | 4 - 3rdparty/quip/src/fox/cmake/abort_intel.f90 | 4 - 3rdparty/quip/src/fox/cmake/abort_nag.f90 | 5 - 3rdparty/quip/src/fox/cmake/abort_xlf.f90 | 4 - .../quip/src/fox/cmake/associated_bug.f90 | 6 - 3rdparty/quip/src/fox/cmake/flush_bare.f90 | 5 - 3rdparty/quip/src/fox/cmake/flush_nag.f90 | 6 - 3rdparty/quip/src/fox/cmake/flush_xlf.f90 | 5 - 3rdparty/quip/src/fox/cmake/output_eol.f90 | 52 - 3rdparty/quip/src/fox/common/CMakeLists.txt | 33 - 3rdparty/quip/src/fox/common/FoX_common.F90 | 55 - .../quip/src/fox/common/m_common_attrs.F90 | 1081 - .../quip/src/fox/common/m_common_buffer.F90 | 261 - .../quip/src/fox/common/m_common_charset.F90 | 447 - .../src/fox/common/m_common_content_model.F90 | 490 - .../quip/src/fox/common/m_common_element.F90 | 1645 - .../quip/src/fox/common/m_common_elstack.F90 | 236 - .../quip/src/fox/common/m_common_entities.F90 | 475 - .../src/fox/common/m_common_entity_expand.F90 | 86 - .../quip/src/fox/common/m_common_error.F90 | 211 - 3rdparty/quip/src/fox/common/m_common_io.F90 | 102 - .../src/fox/common/m_common_namecheck.F90 | 501 - .../src/fox/common/m_common_namespaces.F90 | 830 - .../src/fox/common/m_common_notations.F90 | 120 - .../quip/src/fox/common/m_common_struct.F90 | 121 - 3rdparty/quip/src/fox/common/makefile | 59 - 3rdparty/quip/src/fox/common/test/Makefile | 12 - .../quip/src/fox/common/test/run_tests.sh | 328 - 3rdparty/quip/src/fox/common/test/test.sh | 68 - .../fox/common/test/test_common_namecheck.sh | 7 - .../fox/common/test/test_fsys_array_str.f90 | 44 - .../fox/common/test/test_fsys_array_str.out | 3 - .../quip/src/fox/common/test/test_input.f90 | 846 - .../quip/src/fox/common/test/test_input.out | 86 - .../quip/src/fox/common/test/test_str.f90.in | 11 - 3rdparty/quip/src/fox/common/test/test_str.sh | 24 - .../src/fox/common/test/test_xml_namecheck.sh | 7 - .../fox/common/test/test_xml_namecheck_1.f90 | 24 - .../fox/common/test/test_xml_namecheck_1.out | 10 - .../fox/common/test/test_xml_namecheck_10.f90 | 42 - .../fox/common/test/test_xml_namecheck_10.out | 28 - .../fox/common/test/test_xml_namecheck_2.f90 | 24 - .../fox/common/test/test_xml_namecheck_2.out | 10 - .../common/test/test_xml_namecheck_3.f90.fix | 20 - .../fox/common/test/test_xml_namecheck_3.out | 10 - .../fox/common/test/test_xml_namecheck_4.f90 | 15 - .../fox/common/test/test_xml_namecheck_4.out | 6 - .../fox/common/test/test_xml_namecheck_5.f90 | 28 - .../fox/common/test/test_xml_namecheck_5.out | 14 - .../fox/common/test/test_xml_namecheck_6.f90 | 15 - .../fox/common/test/test_xml_namecheck_6.out | 4 - .../fox/common/test/test_xml_namecheck_7.f90 | 16 - .../fox/common/test/test_xml_namecheck_7.out | 5 - .../fox/common/test/test_xml_namecheck_8.f90 | 62 - .../fox/common/test/test_xml_namecheck_8.out | 48 - .../fox/common/test/test_xml_namecheck_9.f90 | 40 - .../fox/common/test/test_xml_namecheck_9.out | 22 - 3rdparty/quip/src/fox/config/aclocal.m4 | 4916 - 3rdparty/quip/src/fox/config/config.guess | 1510 - 3rdparty/quip/src/fox/config/config.sub | 1619 - 3rdparty/quip/src/fox/config/configure.ac | 213 - 3rdparty/quip/src/fox/config/install-sh | 507 - .../fox/config/m4/TW_CHECK_ASSOCIATED_BUG.m4 | 81 - .../quip/src/fox/config/m4/TW_CHECK_FC_90.m4 | 94 - .../quip/src/fox/config/m4/TW_CHECK_FC_95.m4 | 115 - .../quip/src/fox/config/m4/TW_CHECK_FC_FPP.m4 | 84 - .../src/fox/config/m4/TW_CHECK_FC_FPP_90.m4 | 89 - .../src/fox/config/m4/TW_CHECK_FC_TR15580.m4 | 82 - .../src/fox/config/m4/TW_CHECK_FC_TR15581.m4 | 94 - .../src/fox/config/m4/TW_FC_CHECK_ABORT.m4 | 134 - .../quip/src/fox/config/m4/TW_FC_CHECK_EOL.m4 | 184 - .../src/fox/config/m4/TW_FC_CHECK_FLUSH.m4 | 113 - 3rdparty/quip/src/fox/config/m4/TW_FC_ID.m4 | 134 - .../quip/src/fox/config/m4/TW_FC_ID_FLAGS.m4 | 115 - .../quip/src/fox/config/m4/TW_FC_KINDS.m4 | 225 - .../quip/src/fox/config/m4/TW_PATH_NETCDF.m4 | 90 - .../src/fox/config/m4/TW_PROG_CYGPATH_W.m4 | 59 - 3rdparty/quip/src/fox/config/m4/fortran.m4 | 3134 - 3rdparty/quip/src/fox/config/m4/lang.m4 | 90 - 3rdparty/quip/src/fox/config/makefile | 17 - 3rdparty/quip/src/fox/configure | 7442 - 3rdparty/quip/src/fox/dom/CMakeLists.txt | 97 - 3rdparty/quip/src/fox/dom/FoX_dom.f90 | 261 - 3rdparty/quip/src/fox/dom/m_dom_attribute.m4 | 79 - .../quip/src/fox/dom/m_dom_character_data.m4 | 243 - 3rdparty/quip/src/fox/dom/m_dom_common.m4 | 71 - .../quip/src/fox/dom/m_dom_configuration.m4 | 295 - 3rdparty/quip/src/fox/dom/m_dom_document.m4 | 1421 - .../quip/src/fox/dom/m_dom_document_type.m4 | 90 - 3rdparty/quip/src/fox/dom/m_dom_dom.F90 | 12324 -- 3rdparty/quip/src/fox/dom/m_dom_dom.m4 | 68 - 3rdparty/quip/src/fox/dom/m_dom_element.m4 | 606 - 3rdparty/quip/src/fox/dom/m_dom_entity.m4 | 22 - 3rdparty/quip/src/fox/dom/m_dom_error.f90 | 211 - 3rdparty/quip/src/fox/dom/m_dom_exception.m4 | 96 - 3rdparty/quip/src/fox/dom/m_dom_extras.F90 | 2376 - 3rdparty/quip/src/fox/dom/m_dom_extras.m4 | 188 - .../quip/src/fox/dom/m_dom_implementation.m4 | 216 - .../quip/src/fox/dom/m_dom_namednodemap.m4 | 439 - 3rdparty/quip/src/fox/dom/m_dom_namespaces.m4 | 375 - 3rdparty/quip/src/fox/dom/m_dom_node.m4 | 1722 - 3rdparty/quip/src/fox/dom/m_dom_nodelist.m4 | 197 - 3rdparty/quip/src/fox/dom/m_dom_object.m4 | 141 - 3rdparty/quip/src/fox/dom/m_dom_parse.f90 | 577 - 3rdparty/quip/src/fox/dom/m_dom_parse.m4 | 570 - .../fox/dom/m_dom_processing_instruction.m4 | 11 - 3rdparty/quip/src/fox/dom/m_dom_text.m4 | 69 - 3rdparty/quip/src/fox/dom/m_dom_treewalk.m4 | 159 - 3rdparty/quip/src/fox/dom/m_dom_types.m4 | 287 - 3rdparty/quip/src/fox/dom/m_dom_utils.f90 | 437 - 3rdparty/quip/src/fox/dom/m_dom_utils.m4 | 334 - 3rdparty/quip/src/fox/dom/makefile | 50 - 3rdparty/quip/src/fox/dom/test/Makefile | 11 - 3rdparty/quip/src/fox/dom/test/run_tests.sh | 18 - 3rdparty/quip/src/fox/dom/test/test.sh | 68 - .../fox/dom/test/test_dom_getTextContent.sh | 7 - .../dom/test/test_dom_getTextContent_1.f90 | 24 - .../dom/test/test_dom_getTextContent_1.out | 3 - .../dom/test/test_dom_getTextContent_1.xml_in | 5 - .../dom/test/test_dom_getTextContent_2.f90 | 24 - .../dom/test/test_dom_getTextContent_2.out | 3 - .../dom/test/test_dom_getTextContent_2.xml_in | 5 - .../dom/test/test_dom_getTextContent_3.f90 | 24 - .../dom/test/test_dom_getTextContent_3.out | 3 - .../dom/test/test_dom_getTextContent_3.xml_in | 5 - .../dom/test/test_dom_getTextContent_4.f90 | 24 - .../dom/test/test_dom_getTextContent_4.out | 2 - .../dom/test/test_dom_getTextContent_4.xml_in | 5 - .../dom/test/test_dom_getTextContent_5.f90 | 24 - .../dom/test/test_dom_getTextContent_5.out | 3 - .../dom/test/test_dom_getTextContent_5.xml_in | 5 - .../src/fox/dom/test/test_dom_parseString.sh | 7 - .../fox/dom/test/test_dom_parseString_1.f90 | 24 - .../fox/dom/test/test_dom_parseString_1.out | 1 - .../src/fox/dom/test/test_dom_serialize.sh | 7 - .../src/fox/dom/test/test_dom_serialize_1.f90 | 25 - .../src/fox/dom/test/test_dom_serialize_1.xml | 2 - .../src/fox/dom/test/test_dom_serialize_2.f90 | 26 - .../src/fox/dom/test/test_dom_serialize_2.xml | 2 - 3rdparty/quip/src/fox/examples/CMakeLists.txt | 74 - 3rdparty/quip/src/fox/examples/Makefile | 74 - .../fox/examples/dom_canonicalize.ns.no.f90 | 36 - .../fox/examples/dom_canonicalize.ns.yes.f90 | 41 - .../src/fox/examples/dom_configuration.f90 | 72 - .../quip/src/fox/examples/dom_example_2.f90 | 45 - .../quip/src/fox/examples/dom_example_3.f90 | 26 - 3rdparty/quip/src/fox/examples/h2o.xml | 899 - .../quip/src/fox/examples/sax_example.f90 | 298 - .../quip/src/fox/examples/sax_example_2.f90 | 135 - 3rdparty/quip/src/fox/examples/staffNS.dtd | 45 - 3rdparty/quip/src/fox/examples/staffNS.xml | 59 - .../quip/src/fox/examples/wcml_example.f90 | 105 - .../quip/src/fox/examples/wkml_example.f90 | 21 - .../quip/src/fox/examples/wkml_example_2.f90 | 25 - .../src/fox/examples/wkml_example_input.txt | 10 - .../quip/src/fox/examples/wxml_example.f90 | 84 - .../src/fox/examples/xml_output_module.f90 | 57 - .../src/fox/examples/xml_output_program.f90 | 15 - 3rdparty/quip/src/fox/fsys/CMakeLists.txt | 34 - .../src/fox/fsys/fox_m_fsys_abort_flush.F90 | 124 - .../src/fox/fsys/fox_m_fsys_array_str.F90 | 94 - .../fox/fsys/fox_m_fsys_count_parse_input.F90 | 561 - .../fox/fsys/fox_m_fsys_count_parse_input.m4 | 440 - .../quip/src/fox/fsys/fox_m_fsys_format.F90 | 2253 - .../src/fox/fsys/fox_m_fsys_parse_input.F90 | 2204 - .../src/fox/fsys/fox_m_fsys_parse_input.m4 | 927 - .../src/fox/fsys/fox_m_fsys_realtypes.f90 | 12 - .../quip/src/fox/fsys/fox_m_fsys_string.F90 | 35 - .../src/fox/fsys/fox_m_fsys_string_list.F90 | 191 - .../quip/src/fox/fsys/fox_m_fsys_varstr.F90 | 254 - 3rdparty/quip/src/fox/fsys/m_ieee.f90 | 17 - 3rdparty/quip/src/fox/fsys/makefile | 38 - 3rdparty/quip/src/fox/m4/common.m4 | 30 - 3rdparty/quip/src/fox/m4/datatypes.m4 | 21 - 3rdparty/quip/src/fox/m4/foreach.m4 | 11 - 3rdparty/quip/src/fox/m4/quantity.m4 | 106 - 3rdparty/quip/src/fox/release.sh | 49 - 3rdparty/quip/src/fox/sax/CMakeLists.txt | 26 - 3rdparty/quip/src/fox/sax/ChangeLog | 161 - 3rdparty/quip/src/fox/sax/FoX_sax.f90 | 34 - 3rdparty/quip/src/fox/sax/m_sax_operate.F90 | 313 - 3rdparty/quip/src/fox/sax/m_sax_parser.F90 | 3029 - 3rdparty/quip/src/fox/sax/m_sax_reader.F90 | 411 - 3rdparty/quip/src/fox/sax/m_sax_tokenizer.F90 | 1139 - 3rdparty/quip/src/fox/sax/m_sax_types.F90 | 163 - .../quip/src/fox/sax/m_sax_xml_source.F90 | 438 - 3rdparty/quip/src/fox/sax/makefile | 34 - 3rdparty/quip/src/fox/sax/test/Makefile | 21 - 3rdparty/quip/src/fox/sax/test/SAX_test.xml | 51 - 3rdparty/quip/src/fox/sax/test/input_1.xml | 51 - 3rdparty/quip/src/fox/sax/test/input_2.xml | 53 - 3rdparty/quip/src/fox/sax/test/input_3.xml | 53 - .../quip/src/fox/sax/test/m_canonicalize.f90 | 120 - 3rdparty/quip/src/fox/sax/test/m_handlers.f90 | 121 - 3rdparty/quip/src/fox/sax/test/passed.sh | 11 - 3rdparty/quip/src/fox/sax/test/run_tests.sh | 21 - .../quip/src/fox/sax/test/sax_valid.ns.no.f90 | 56 - .../src/fox/sax/test/sax_valid.ns.yes.f90 | 56 - .../fox/sax/test/sax_well_formed.ns.no.f90 | 55 - .../fox/sax/test/sax_well_formed.ns.yes.f90 | 55 - 3rdparty/quip/src/fox/sax/test/test.sh | 1 - 3rdparty/quip/src/fox/sax/test/test2.xml | 2 - .../quip/src/fox/sax/test/test_sax_fsm_1.in | 2 - .../quip/src/fox/sax/test/test_sax_parser.sh | 7 - .../src/fox/sax/test/test_sax_parser_1.f90 | 15 - .../src/fox/sax/test/test_sax_parser_1.out | 1 - .../src/fox/sax/test/test_sax_parser_2.f90 | 24 - .../src/fox/sax/test/test_sax_parser_2.out | 19 - .../src/fox/sax/test/test_sax_parser_3.f90 | 23 - .../src/fox/sax/test/test_sax_parser_3.out | 15 - .../src/fox/sax/test/test_sax_parser_4.f90 | 24 - .../src/fox/sax/test/test_sax_parser_4.out | 2 - .../src/fox/sax/test/test_sax_parser_5.f90 | 18 - .../src/fox/sax/test/test_sax_parser_5.out | 1 - .../quip/src/fox/sax/test/test_sax_reader.sh | 7 - .../src/fox/sax/test/test_sax_reader_1.f90 | 21 - .../src/fox/sax/test/test_sax_reader_1.in | 1 - .../src/fox/sax/test/test_sax_reader_1.out | 2 - 3rdparty/quip/src/fox/sax/test/testin.xml | 60 - 3rdparty/quip/src/fox/utils/CMakeLists.txt | 22 - 3rdparty/quip/src/fox/utils/FoX_utils.f90 | 22 - .../quip/src/fox/utils/fox_m_utils_mtprng.F90 | 360 - .../quip/src/fox/utils/fox_m_utils_uri.F90 | 1033 - .../quip/src/fox/utils/fox_m_utils_uuid.F90 | 247 - 3rdparty/quip/src/fox/utils/makefile | 28 - 3rdparty/quip/src/fox/utils/test/Makefile | 12 - 3rdparty/quip/src/fox/utils/test/run_tests.sh | 20 - 3rdparty/quip/src/fox/utils/test/test.sh | 68 - 3rdparty/quip/src/fox/utils/test/test_URI.f90 | 25 - 3rdparty/quip/src/fox/utils/test/test_URI.out | 13 - .../quip/src/fox/utils/test/test_UUID.f90 | 89 - .../quip/src/fox/utils/test/test_UUID.out | 12 - .../quip/src/fox/utils/test/test_baseURI.f90 | 58 - .../quip/src/fox/utils/test/test_baseURI.out | 171 - .../quip/src/fox/utils/test/test_nullURI.f90 | 61 - .../quip/src/fox/utils/test/test_nullURI.out | 129 - .../quip/src/fox/utils/test/test_rfc2396.f90 | 139 - .../quip/src/fox/utils/test/test_rfc2396.out | 42 - .../quip/src/fox/utils/test/test_rfc2396b.f90 | 131 - .../quip/src/fox/utils/test/test_rfc2396b.out | 40 - 3rdparty/quip/src/fox/wcml/CMakeLists.txt | 104 - 3rdparty/quip/src/fox/wcml/FoX_wcml.f90 | 81 - 3rdparty/quip/src/fox/wcml/m_wcml_coma.F90 | 674 - 3rdparty/quip/src/fox/wcml/m_wcml_coma.m4 | 344 - 3rdparty/quip/src/fox/wcml/m_wcml_core.F90 | 142 - .../quip/src/fox/wcml/m_wcml_geometry.F90 | 156 - 3rdparty/quip/src/fox/wcml/m_wcml_geometry.m4 | 102 - .../quip/src/fox/wcml/m_wcml_inputdec.F90 | 280 - 3rdparty/quip/src/fox/wcml/m_wcml_lattice.F90 | 242 - 3rdparty/quip/src/fox/wcml/m_wcml_lattice.m4 | 148 - 3rdparty/quip/src/fox/wcml/m_wcml_lists.F90 | 282 - 3rdparty/quip/src/fox/wcml/m_wcml_lists.m4 | 115 - .../quip/src/fox/wcml/m_wcml_metadata.F90 | 38 - .../quip/src/fox/wcml/m_wcml_molecule.F90 | 1646 - 3rdparty/quip/src/fox/wcml/m_wcml_molecule.m4 | 788 - .../quip/src/fox/wcml/m_wcml_parameter.F90 | 1262 - .../quip/src/fox/wcml/m_wcml_parameter.m4 | 5 - .../quip/src/fox/wcml/m_wcml_property.F90 | 1122 - 3rdparty/quip/src/fox/wcml/m_wcml_property.m4 | 4 - 3rdparty/quip/src/fox/wcml/m_wcml_stml.F90 | 1001 - 3rdparty/quip/src/fox/wcml/m_wcml_stml.m4 | 144 - 3rdparty/quip/src/fox/wcml/makefile | 49 - 3rdparty/quip/src/fox/wcml/test/Makefile | 12 - 3rdparty/quip/src/fox/wcml/test/passed.sh | 11 - 3rdparty/quip/src/fox/wcml/test/run_tests.sh | 18 - 3rdparty/quip/src/fox/wcml/test/test.sh | 1 - 3rdparty/quip/src/fox/wcml/test/test_cml.sh | 7 - .../src/fox/wcml/test/test_cmlAddBandList.sh | 1 - .../fox/wcml/test/test_cmlAddBandList_1.f90 | 14 - .../fox/wcml/test/test_cmlAddBandList_1.xml | 8 - .../fox/wcml/test/test_cmlAddBandList_2.f90 | 14 - .../fox/wcml/test/test_cmlAddBandList_2.xml | 8 - .../fox/wcml/test/test_cmlAddBandList_3.f90 | 14 - .../fox/wcml/test/test_cmlAddBandList_3.xml | 8 - .../fox/wcml/test/test_cmlAddBandList_4.f90 | 14 - .../fox/wcml/test/test_cmlAddBandList_4.xml | 8 - .../src/fox/wcml/test/test_cmlAddCrystal.sh | 1 - .../fox/wcml/test/test_cmlAddCrystal_1.f90 | 22 - .../fox/wcml/test/test_cmlAddCrystal_1.xml | 7 - .../fox/wcml/test/test_cmlAddCrystal_2.f90 | 22 - .../fox/wcml/test/test_cmlAddCrystal_2.xml | 7 - .../fox/wcml/test/test_cmlAddEigenValue.sh | 1 - .../wcml/test/test_cmlAddEigenValueVector.sh | 1 - .../test/test_cmlAddEigenValueVector_1.f90 | 17 - .../test/test_cmlAddEigenValueVector_1.xml | 9 - .../test/test_cmlAddEigenValueVector_2.f90 | 17 - .../test/test_cmlAddEigenValueVector_2.xml | 9 - .../test/test_cmlAddEigenValueVector_3.f90 | 17 - .../test/test_cmlAddEigenValueVector_3.xml | 9 - .../test/test_cmlAddEigenValueVector_4.f90 | 17 - .../test/test_cmlAddEigenValueVector_4.xml | 9 - .../fox/wcml/test/test_cmlAddEigenValue_1.f90 | 16 - .../fox/wcml/test/test_cmlAddEigenValue_1.xml | 8 - .../fox/wcml/test/test_cmlAddEigenValue_2.f90 | 16 - .../fox/wcml/test/test_cmlAddEigenValue_2.xml | 8 - .../src/fox/wcml/test/test_cmlAddKpoint.sh | 1 - .../src/fox/wcml/test/test_cmlAddKpoint_1.f90 | 14 - .../src/fox/wcml/test/test_cmlAddKpoint_1.xml | 4 - .../src/fox/wcml/test/test_cmlAddKpoint_2.f90 | 14 - .../src/fox/wcml/test/test_cmlAddKpoint_2.xml | 4 - .../src/fox/wcml/test/test_cmlAddKpoint_3.f90 | 14 - .../src/fox/wcml/test/test_cmlAddKpoint_3.xml | 4 - .../src/fox/wcml/test/test_cmlAddKpoint_4.f90 | 14 - .../src/fox/wcml/test/test_cmlAddKpoint_4.xml | 4 - .../src/fox/wcml/test/test_cmlAddLattice.sh | 1 - .../fox/wcml/test/test_cmlAddLattice_1.f90 | 23 - .../fox/wcml/test/test_cmlAddLattice_1.xml | 8 - .../fox/wcml/test/test_cmlAddLattice_2.f90 | 23 - .../fox/wcml/test/test_cmlAddLattice_2.xml | 8 - .../src/fox/wcml/test/test_cmlAddMetadata.sh | 1 - .../fox/wcml/test/test_cmlAddMetadata_1.f90 | 15 - .../fox/wcml/test/test_cmlAddMetadata_1.xml | 4 - .../src/fox/wcml/test/test_cmlAddMolecule.sh | 1 - .../fox/wcml/test/test_cmlAddMolecule_1.f90 | 27 - .../fox/wcml/test/test_cmlAddMolecule_1.xml | 11 - .../fox/wcml/test/test_cmlAddMolecule_10.f90 | 30 - .../fox/wcml/test/test_cmlAddMolecule_10.xml | 16 - .../fox/wcml/test/test_cmlAddMolecule_11.f90 | 30 - .../fox/wcml/test/test_cmlAddMolecule_11.out | 2 - .../fox/wcml/test/test_cmlAddMolecule_12.f90 | 29 - .../fox/wcml/test/test_cmlAddMolecule_12.out | 2 - .../fox/wcml/test/test_cmlAddMolecule_13.f90 | 29 - .../fox/wcml/test/test_cmlAddMolecule_13.out | 2 - .../fox/wcml/test/test_cmlAddMolecule_14.f90 | 27 - .../fox/wcml/test/test_cmlAddMolecule_14.xml | 11 - .../fox/wcml/test/test_cmlAddMolecule_15.f90 | 27 - .../fox/wcml/test/test_cmlAddMolecule_15.xml | 11 - .../fox/wcml/test/test_cmlAddMolecule_16.f90 | 27 - .../fox/wcml/test/test_cmlAddMolecule_16.xml | 11 - .../fox/wcml/test/test_cmlAddMolecule_2.f90 | 27 - .../fox/wcml/test/test_cmlAddMolecule_2.xml | 11 - .../fox/wcml/test/test_cmlAddMolecule_3.f90 | 27 - .../fox/wcml/test/test_cmlAddMolecule_3.xml | 23 - .../fox/wcml/test/test_cmlAddMolecule_4.f90 | 27 - .../fox/wcml/test/test_cmlAddMolecule_4.xml | 11 - .../fox/wcml/test/test_cmlAddMolecule_5.f90 | 27 - .../fox/wcml/test/test_cmlAddMolecule_5.xml | 11 - .../fox/wcml/test/test_cmlAddMolecule_6.f90 | 27 - .../fox/wcml/test/test_cmlAddMolecule_6.xml | 23 - .../fox/wcml/test/test_cmlAddMolecule_7.f90 | 29 - .../fox/wcml/test/test_cmlAddMolecule_7.xml | 11 - .../fox/wcml/test/test_cmlAddMolecule_8.f90 | 30 - .../fox/wcml/test/test_cmlAddMolecule_8.xml | 17 - .../fox/wcml/test/test_cmlAddMolecule_9.f90 | 29 - .../fox/wcml/test/test_cmlAddMolecule_9.xml | 16 - .../src/fox/wcml/test/test_cmlAddNamespace.sh | 1 - .../fox/wcml/test/test_cmlAddNamespace_0.f90 | 11 - .../fox/wcml/test/test_cmlAddNamespace_0.out | 2 - .../fox/wcml/test/test_cmlAddNamespace_1.f90 | 13 - .../fox/wcml/test/test_cmlAddNamespace_1.out | 3 - .../fox/wcml/test/test_cmlAddNamespace_2.f90 | 14 - .../fox/wcml/test/test_cmlAddNamespace_2.xml | 3 - .../fox/wcml/test/test_cmlAddNamespace_3.f90 | 14 - .../fox/wcml/test/test_cmlAddNamespace_3.out | 2 - .../src/fox/wcml/test/test_cmlAddParameter.sh | 1 - .../fox/wcml/test/test_cmlAddParameter_1.f90 | 15 - .../fox/wcml/test/test_cmlAddParameter_1.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_10.f90 | 15 - .../fox/wcml/test/test_cmlAddParameter_10.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_11.f90 | 15 - .../fox/wcml/test/test_cmlAddParameter_11.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_12.f90 | 15 - .../fox/wcml/test/test_cmlAddParameter_12.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_13.f90 | 17 - .../fox/wcml/test/test_cmlAddParameter_13.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_14.f90 | 15 - .../fox/wcml/test/test_cmlAddParameter_14.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_15.f90 | 17 - .../fox/wcml/test/test_cmlAddParameter_15.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_16.f90 | 15 - .../fox/wcml/test/test_cmlAddParameter_16.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_17.f90 | 15 - .../fox/wcml/test/test_cmlAddParameter_17.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_18.f90 | 15 - .../fox/wcml/test/test_cmlAddParameter_18.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_19.f90 | 15 - .../fox/wcml/test/test_cmlAddParameter_19.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_2.f90 | 15 - .../fox/wcml/test/test_cmlAddParameter_2.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_20.f90 | 18 - .../fox/wcml/test/test_cmlAddParameter_20.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_21.f90 | 18 - .../fox/wcml/test/test_cmlAddParameter_21.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_22.f90 | 17 - .../fox/wcml/test/test_cmlAddParameter_22.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_23.f90 | 15 - .../fox/wcml/test/test_cmlAddParameter_23.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_24.f90 | 17 - .../fox/wcml/test/test_cmlAddParameter_24.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_25.f90 | 15 - .../fox/wcml/test/test_cmlAddParameter_25.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_3.f90 | 15 - .../fox/wcml/test/test_cmlAddParameter_3.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_4.f90 | 15 - .../fox/wcml/test/test_cmlAddParameter_4.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_5.f90 | 15 - .../fox/wcml/test/test_cmlAddParameter_5.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_6.f90 | 17 - .../fox/wcml/test/test_cmlAddParameter_6.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_7.f90 | 15 - .../fox/wcml/test/test_cmlAddParameter_7.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_8.f90 | 15 - .../fox/wcml/test/test_cmlAddParameter_8.xml | 6 - .../fox/wcml/test/test_cmlAddParameter_9.f90 | 15 - .../fox/wcml/test/test_cmlAddParameter_9.xml | 6 - .../src/fox/wcml/test/test_cmlAddProperty.sh | 1 - .../fox/wcml/test/test_cmlAddProperty_1.f90 | 15 - .../fox/wcml/test/test_cmlAddProperty_1.xml | 6 - .../fox/wcml/test/test_cmlAddProperty_10.f90 | 15 - .../fox/wcml/test/test_cmlAddProperty_10.xml | 6 - .../fox/wcml/test/test_cmlAddProperty_11.f90 | 15 - .../fox/wcml/test/test_cmlAddProperty_11.xml | 6 - .../fox/wcml/test/test_cmlAddProperty_12.f90 | 15 - .../fox/wcml/test/test_cmlAddProperty_12.xml | 6 - .../fox/wcml/test/test_cmlAddProperty_13.f90 | 17 - .../fox/wcml/test/test_cmlAddProperty_13.xml | 6 - .../fox/wcml/test/test_cmlAddProperty_14.f90 | 15 - .../fox/wcml/test/test_cmlAddProperty_14.xml | 6 - .../fox/wcml/test/test_cmlAddProperty_15.f90 | 17 - .../fox/wcml/test/test_cmlAddProperty_15.xml | 6 - .../fox/wcml/test/test_cmlAddProperty_16.f90 | 15 - .../fox/wcml/test/test_cmlAddProperty_16.xml | 6 - .../fox/wcml/test/test_cmlAddProperty_17.f90 | 15 - .../fox/wcml/test/test_cmlAddProperty_17.xml | 6 - .../fox/wcml/test/test_cmlAddProperty_18.f90 | 15 - .../fox/wcml/test/test_cmlAddProperty_18.xml | 6 - .../fox/wcml/test/test_cmlAddProperty_19.f90 | 15 - .../fox/wcml/test/test_cmlAddProperty_19.xml | 6 - .../fox/wcml/test/test_cmlAddProperty_2.f90 | 15 - .../fox/wcml/test/test_cmlAddProperty_2.xml | 6 - .../fox/wcml/test/test_cmlAddProperty_20.f90 | 18 - .../fox/wcml/test/test_cmlAddProperty_20.xml | 6 - .../fox/wcml/test/test_cmlAddProperty_21.f90 | 18 - .../fox/wcml/test/test_cmlAddProperty_21.xml | 6 - .../fox/wcml/test/test_cmlAddProperty_3.f90 | 15 - .../fox/wcml/test/test_cmlAddProperty_3.xml | 6 - .../fox/wcml/test/test_cmlAddProperty_4.f90 | 15 - .../fox/wcml/test/test_cmlAddProperty_4.xml | 6 - .../fox/wcml/test/test_cmlAddProperty_5.f90 | 15 - .../fox/wcml/test/test_cmlAddProperty_5.xml | 6 - .../fox/wcml/test/test_cmlAddProperty_6.f90 | 17 - .../fox/wcml/test/test_cmlAddProperty_6.xml | 6 - .../fox/wcml/test/test_cmlAddProperty_7.f90 | 15 - .../fox/wcml/test/test_cmlAddProperty_7.xml | 6 - .../fox/wcml/test/test_cmlAddProperty_8.f90 | 15 - .../fox/wcml/test/test_cmlAddProperty_8.xml | 6 - .../fox/wcml/test/test_cmlAddProperty_9.f90 | 15 - .../fox/wcml/test/test_cmlAddProperty_9.xml | 6 - .../src/fox/wcml/test/test_cmlAddSymmetry.sh | 1 - .../fox/wcml/test/test_cmlAddSymmetry_1.f90 | 14 - .../fox/wcml/test/test_cmlAddSymmetry_1.xml | 4 - .../fox/wcml/test/test_cmlAddSymmetry_2.f90 | 14 - .../fox/wcml/test/test_cmlAddSymmetry_2.xml | 4 - .../fox/wcml/test/test_cmlAddSymmetry_3.f90 | 24 - .../fox/wcml/test/test_cmlAddSymmetry_3.xml | 7 - .../fox/wcml/test/test_cmlAddSymmetry_4.f90 | 29 - .../fox/wcml/test/test_cmlAddSymmetry_4.xml | 7 - .../src/fox/wcml/test/test_cmlBeginFile.sh | 1 - .../src/fox/wcml/test/test_cmlBeginFile_1.f90 | 14 - .../src/fox/wcml/test/test_cmlBeginFile_1.out | 3 - .../src/fox/wcml/test/test_cmlBeginFile_2.f90 | 22 - .../src/fox/wcml/test/test_cmlBeginFile_2.out | 1 - .../quip/src/fox/wcml/test/test_cmlDumpDec.sh | 1 - .../src/fox/wcml/test/test_cmlDumpDec_1.f90 | 17 - .../src/fox/wcml/test/test_cmlDumpDec_1.input | 7 - .../src/fox/wcml/test/test_cmlDumpDec_1.xml | 17 - .../src/fox/wcml/test/test_cmlDumpDec_2.f90 | 17 - .../src/fox/wcml/test/test_cmlDumpDec_2.out | 2 - .../src/fox/wcml/test/test_cmlDumpDec_3.f90 | 18 - .../src/fox/wcml/test/test_cmlDumpDec_3.out | 2 - .../src/fox/wcml/test/test_cmlDumpDec_4.f90 | 18 - .../src/fox/wcml/test/test_cmlDumpDec_4.xml | 59 - .../src/fox/wcml/test/test_cmlDumpDec_4a.in | 26 - .../src/fox/wcml/test/test_cmlDumpDec_4b.in | 18 - .../quip/src/fox/wcml/test/test_cmlEndBand.sh | 1 - .../src/fox/wcml/test/test_cmlEndBand_1.f90 | 15 - .../src/fox/wcml/test/test_cmlEndBand_1.xml | 4 - .../quip/src/fox/wcml/test/test_cmlEndCml.sh | 1 - .../src/fox/wcml/test/test_cmlEndCml_0.f90 | 11 - .../src/fox/wcml/test/test_cmlEndCml_0.out | 2 - .../src/fox/wcml/test/test_cmlEndCml_1.f90 | 13 - .../src/fox/wcml/test/test_cmlEndCml_1.out | 3 - .../src/fox/wcml/test/test_cmlEndCml_2.f90 | 14 - .../src/fox/wcml/test/test_cmlEndCml_2.xml | 4 - .../src/fox/wcml/test/test_cmlEndKpoint.sh | 1 - .../fox/wcml/test/test_cmlEndKpointList.sh | 1 - .../fox/wcml/test/test_cmlEndKpointList_1.f90 | 15 - .../fox/wcml/test/test_cmlEndKpointList_1.xml | 4 - .../src/fox/wcml/test/test_cmlEndKpoint_1.f90 | 15 - .../src/fox/wcml/test/test_cmlEndKpoint_1.xml | 4 - .../fox/wcml/test/test_cmlEndMetadataList.sh | 1 - .../wcml/test/test_cmlEndMetadataList_1.f90 | 15 - .../wcml/test/test_cmlEndMetadataList_1.xml | 4 - .../src/fox/wcml/test/test_cmlEndModule.sh | 1 - .../src/fox/wcml/test/test_cmlEndModule_1.f90 | 15 - .../src/fox/wcml/test/test_cmlEndModule_1.xml | 4 - .../fox/wcml/test/test_cmlEndParameterList.sh | 1 - .../wcml/test/test_cmlEndParameterList_1.f90 | 15 - .../wcml/test/test_cmlEndParameterList_1.xml | 4 - .../fox/wcml/test/test_cmlEndPropertyList.sh | 1 - .../wcml/test/test_cmlEndPropertyList_1.f90 | 15 - .../wcml/test/test_cmlEndPropertyList_1.xml | 4 - .../quip/src/fox/wcml/test/test_cmlEndStep.sh | 1 - .../src/fox/wcml/test/test_cmlEndStep_1.f90 | 15 - .../src/fox/wcml/test/test_cmlEndStep_1.xml | 4 - .../src/fox/wcml/test/test_cmlFinishFile.sh | 1 - .../fox/wcml/test/test_cmlFinishFile_1.f90 | 11 - .../fox/wcml/test/test_cmlFinishFile_1.out | 2 - .../fox/wcml/test/test_cmlFinishFile_2.f90 | 12 - .../fox/wcml/test/test_cmlFinishFile_2.out | 3 - .../fox/wcml/test/test_cmlFinishFile_3.f90 | 14 - .../fox/wcml/test/test_cmlFinishFile_3.out | 2 - .../src/fox/wcml/test/test_cmlStartBand.sh | 1 - .../src/fox/wcml/test/test_cmlStartBand_1.f90 | 14 - .../src/fox/wcml/test/test_cmlStartBand_1.xml | 4 - .../src/fox/wcml/test/test_cmlStartBand_2.f90 | 14 - .../src/fox/wcml/test/test_cmlStartBand_2.xml | 4 - .../src/fox/wcml/test/test_cmlStartBand_3.f90 | 14 - .../src/fox/wcml/test/test_cmlStartBand_3.xml | 4 - .../src/fox/wcml/test/test_cmlStartBand_4.f90 | 14 - .../src/fox/wcml/test/test_cmlStartBand_4.xml | 4 - .../src/fox/wcml/test/test_cmlStartCml.sh | 1 - .../src/fox/wcml/test/test_cmlStartCml_0.f90 | 11 - .../src/fox/wcml/test/test_cmlStartCml_0.out | 2 - .../src/fox/wcml/test/test_cmlStartCml_1.f90 | 13 - .../src/fox/wcml/test/test_cmlStartCml_1.xml | 3 - .../src/fox/wcml/test/test_cmlStartCml_2.f90 | 13 - .../src/fox/wcml/test/test_cmlStartCml_2.xml | 3 - .../src/fox/wcml/test/test_cmlStartCml_3.f90 | 13 - .../src/fox/wcml/test/test_cmlStartCml_3.xml | 3 - .../src/fox/wcml/test/test_cmlStartCml_4.f90 | 13 - .../src/fox/wcml/test/test_cmlStartCml_4.xml | 3 - .../src/fox/wcml/test/test_cmlStartKpoint.sh | 1 - .../fox/wcml/test/test_cmlStartKpointList.sh | 1 - .../wcml/test/test_cmlStartKpointList_1.f90 | 14 - .../wcml/test/test_cmlStartKpointList_1.xml | 4 - .../fox/wcml/test/test_cmlStartKpoint_1.f90 | 14 - .../fox/wcml/test/test_cmlStartKpoint_1.xml | 4 - .../fox/wcml/test/test_cmlStartKpoint_2.f90 | 14 - .../fox/wcml/test/test_cmlStartKpoint_2.xml | 4 - .../fox/wcml/test/test_cmlStartKpoint_3.f90 | 14 - .../fox/wcml/test/test_cmlStartKpoint_3.xml | 4 - .../fox/wcml/test/test_cmlStartKpoint_4.f90 | 14 - .../fox/wcml/test/test_cmlStartKpoint_4.xml | 4 - .../wcml/test/test_cmlStartMetadataList.sh | 1 - .../wcml/test/test_cmlStartMetadataList_1.f90 | 15 - .../wcml/test/test_cmlStartMetadataList_1.xml | 4 - .../wcml/test/test_cmlStartMetadataList_2.f90 | 15 - .../wcml/test/test_cmlStartMetadataList_2.xml | 4 - .../wcml/test/test_cmlStartMetadataList_3.f90 | 15 - .../wcml/test/test_cmlStartMetadataList_3.xml | 4 - .../src/fox/wcml/test/test_cmlStartModule.sh | 1 - .../fox/wcml/test/test_cmlStartModule_1.f90 | 14 - .../fox/wcml/test/test_cmlStartModule_1.xml | 4 - .../fox/wcml/test/test_cmlStartModule_2.f90 | 14 - .../fox/wcml/test/test_cmlStartModule_2.xml | 4 - .../fox/wcml/test/test_cmlStartModule_3.f90 | 14 - .../fox/wcml/test/test_cmlStartModule_3.xml | 4 - .../wcml/test/test_cmlStartParameterList.sh | 1 - .../test/test_cmlStartParameterList_1.f90 | 14 - .../test/test_cmlStartParameterList_1.xml | 4 - .../test/test_cmlStartParameterList_2.f90 | 14 - .../test/test_cmlStartParameterList_2.xml | 4 - .../test/test_cmlStartParameterList_3.f90 | 14 - .../test/test_cmlStartParameterList_3.xml | 4 - .../wcml/test/test_cmlStartPropertyList.sh | 1 - .../wcml/test/test_cmlStartPropertyList_1.f90 | 14 - .../wcml/test/test_cmlStartPropertyList_1.xml | 4 - .../wcml/test/test_cmlStartPropertyList_2.f90 | 14 - .../wcml/test/test_cmlStartPropertyList_2.xml | 4 - .../wcml/test/test_cmlStartPropertyList_3.f90 | 14 - .../wcml/test/test_cmlStartPropertyList_3.xml | 4 - .../src/fox/wcml/test/test_cmlStartStep.sh | 1 - .../src/fox/wcml/test/test_cmlStartStep_1.f90 | 14 - .../src/fox/wcml/test/test_cmlStartStep_1.xml | 4 - .../src/fox/wcml/test/test_cmlStartStep_2.f90 | 14 - .../src/fox/wcml/test/test_cmlStartStep_2.xml | 4 - .../src/fox/wcml/test/test_cmlStartStep_3.f90 | 14 - .../src/fox/wcml/test/test_cmlStartStep_3.xml | 4 - 3rdparty/quip/src/fox/wkml/CMakeLists.txt | 40 - 3rdparty/quip/src/fox/wkml/FoX_wkml.f90 | 48 - 3rdparty/quip/src/fox/wkml/m_contours.F90 | 2138 - 3rdparty/quip/src/fox/wkml/m_wkml_chart.F90 | 116 - 3rdparty/quip/src/fox/wkml/m_wkml_color.F90 | 240 - .../quip/src/fox/wkml/m_wkml_color_def.F90 | 829 - .../quip/src/fox/wkml/m_wkml_contours.F90 | 300 - 3rdparty/quip/src/fox/wkml/m_wkml_core.F90 | 69 - .../quip/src/fox/wkml/m_wkml_coverage.F90 | 1190 - 3rdparty/quip/src/fox/wkml/m_wkml_coverage.m4 | 523 - .../quip/src/fox/wkml/m_wkml_features.F90 | 1157 - .../quip/src/fox/wkml/m_wkml_lowlevel.F90 | 1611 - 3rdparty/quip/src/fox/wkml/m_wkml_styling.F90 | 771 - 3rdparty/quip/src/fox/wkml/makefile | 48 - 3rdparty/quip/src/fox/wkml/rgb.txt | 753 - 3rdparty/quip/src/fox/wkml/rgb2wkml.py | 73 - 3rdparty/quip/src/fox/wkml/test/Makefile | 20 - .../fox/wkml/test/m_contours_test_data_sp.f90 | 2510 - 3rdparty/quip/src/fox/wkml/test/passed.sh | 11 - 3rdparty/quip/src/fox/wkml/test/run_tests.sh | 19 - 3rdparty/quip/src/fox/wkml/test/test.sh | 68 - .../fox/wkml/test/test_kmlAddInnerBoundary.sh | 7 - .../wkml/test/test_kmlAddInnerBoundary_0.f90 | 14 - .../wkml/test/test_kmlAddInnerBoundary_0.out | 2 - .../wkml/test/test_kmlAddInnerBoundary_1.f90 | 17 - .../wkml/test/test_kmlAddInnerBoundary_1.xml | 32 - .../wkml/test/test_kmlAddInnerBoundary_10.f90 | 18 - .../wkml/test/test_kmlAddInnerBoundary_10.xml | 32 - .../wkml/test/test_kmlAddInnerBoundary_11.f90 | 17 - .../wkml/test/test_kmlAddInnerBoundary_11.out | 2 - .../wkml/test/test_kmlAddInnerBoundary_12.f90 | 17 - .../wkml/test/test_kmlAddInnerBoundary_12.out | 2 - .../wkml/test/test_kmlAddInnerBoundary_13.f90 | 17 - .../wkml/test/test_kmlAddInnerBoundary_13.out | 2 - .../wkml/test/test_kmlAddInnerBoundary_14.f90 | 17 - .../wkml/test/test_kmlAddInnerBoundary_14.out | 2 - .../wkml/test/test_kmlAddInnerBoundary_15.f90 | 18 - .../wkml/test/test_kmlAddInnerBoundary_15.out | 2 - .../wkml/test/test_kmlAddInnerBoundary_16.f90 | 19 - .../wkml/test/test_kmlAddInnerBoundary_16.out | 2 - .../wkml/test/test_kmlAddInnerBoundary_17.f90 | 19 - .../wkml/test/test_kmlAddInnerBoundary_17.out | 2 - .../wkml/test/test_kmlAddInnerBoundary_18.f90 | 19 - .../wkml/test/test_kmlAddInnerBoundary_18.out | 2 - .../wkml/test/test_kmlAddInnerBoundary_2.f90 | 17 - .../wkml/test/test_kmlAddInnerBoundary_2.xml | 32 - .../wkml/test/test_kmlAddInnerBoundary_3.f90 | 17 - .../wkml/test/test_kmlAddInnerBoundary_3.xml | 32 - .../wkml/test/test_kmlAddInnerBoundary_4.f90 | 17 - .../wkml/test/test_kmlAddInnerBoundary_4.xml | 32 - .../wkml/test/test_kmlAddInnerBoundary_5.f90 | 18 - .../wkml/test/test_kmlAddInnerBoundary_5.xml | 32 - .../wkml/test/test_kmlAddInnerBoundary_6.f90 | 19 - .../wkml/test/test_kmlAddInnerBoundary_6.xml | 32 - .../wkml/test/test_kmlAddInnerBoundary_7.f90 | 19 - .../wkml/test/test_kmlAddInnerBoundary_7.xml | 32 - .../wkml/test/test_kmlAddInnerBoundary_8.f90 | 19 - .../wkml/test/test_kmlAddInnerBoundary_8.xml | 32 - .../wkml/test/test_kmlAddInnerBoundary_9.f90 | 18 - .../wkml/test/test_kmlAddInnerBoundary_9.xml | 32 - .../src/fox/wkml/test/test_kmlColorMap.sh | 7 - .../src/fox/wkml/test/test_kmlColorMap_1.f90 | 17 - .../src/fox/wkml/test/test_kmlColorMap_1.xml | 11 - .../src/fox/wkml/test/test_kmlColorMap_2.f90 | 17 - .../src/fox/wkml/test/test_kmlColorMap_2.xml | 11 - .../src/fox/wkml/test/test_kmlColorMap_3.f90 | 17 - .../src/fox/wkml/test/test_kmlColorMap_3.xml | 11 - .../src/fox/wkml/test/test_kmlColorMap_4.f90 | 17 - .../src/fox/wkml/test/test_kmlColorMap_4.out | 2 - .../src/fox/wkml/test/test_kmlColorMap_5.f90 | 17 - .../src/fox/wkml/test/test_kmlColorMap_5.out | 2 - .../src/fox/wkml/test/test_kmlColorMap_6.f90 | 17 - .../src/fox/wkml/test/test_kmlColorMap_6.out | 2 - .../src/fox/wkml/test/test_kmlColorMap_7.f90 | 17 - .../src/fox/wkml/test/test_kmlColorMap_7.out | 2 - .../src/fox/wkml/test/test_kmlColorMap_8.f90 | 17 - .../src/fox/wkml/test/test_kmlColorMap_8.out | 2 - .../src/fox/wkml/test/test_kmlContours.sh | 12 - .../src/fox/wkml/test/test_kmlContours_1.f90 | 21 - .../src/fox/wkml/test/test_kmlContours_1.xml | 143007 --------------- .../src/fox/wkml/test/test_kmlContours_2.f90 | 27 - .../src/fox/wkml/test/test_kmlContours_2.xml | 143007 --------------- .../src/fox/wkml/test/test_kmlContours_3.f90 | 23 - .../src/fox/wkml/test/test_kmlContours_3.xml | 143007 --------------- .../src/fox/wkml/test/test_kmlCreateLine.sh | 7 - .../fox/wkml/test/test_kmlCreateLineStyle.sh | 7 - .../wkml/test/test_kmlCreateLineStyle_0.f90 | 12 - .../wkml/test/test_kmlCreateLineStyle_0.out | 2 - .../wkml/test/test_kmlCreateLineStyle_1.f90 | 13 - .../wkml/test/test_kmlCreateLineStyle_1.xml | 9 - .../wkml/test/test_kmlCreateLineStyle_10.f90 | 16 - .../wkml/test/test_kmlCreateLineStyle_10.xml | 12 - .../wkml/test/test_kmlCreateLineStyle_11.f90 | 16 - .../wkml/test/test_kmlCreateLineStyle_11.xml | 12 - .../wkml/test/test_kmlCreateLineStyle_12.f90 | 16 - .../wkml/test/test_kmlCreateLineStyle_12.xml | 12 - .../wkml/test/test_kmlCreateLineStyle_2.f90 | 13 - .../wkml/test/test_kmlCreateLineStyle_2.xml | 11 - .../wkml/test/test_kmlCreateLineStyle_3.f90 | 13 - .../wkml/test/test_kmlCreateLineStyle_3.xml | 11 - .../wkml/test/test_kmlCreateLineStyle_4.f90 | 13 - .../wkml/test/test_kmlCreateLineStyle_4.xml | 11 - .../wkml/test/test_kmlCreateLineStyle_5.f90 | 13 - .../wkml/test/test_kmlCreateLineStyle_5.xml | 11 - .../wkml/test/test_kmlCreateLineStyle_6.f90 | 16 - .../wkml/test/test_kmlCreateLineStyle_6.out | 1 - .../wkml/test/test_kmlCreateLineStyle_7.f90 | 16 - .../wkml/test/test_kmlCreateLineStyle_7.out | 1 - .../wkml/test/test_kmlCreateLineStyle_8.f90 | 16 - .../wkml/test/test_kmlCreateLineStyle_8.out | 1 - .../wkml/test/test_kmlCreateLineStyle_9.f90 | 16 - .../wkml/test/test_kmlCreateLineStyle_9.out | 1 - .../fox/wkml/test/test_kmlCreateLine_1.f90 | 13 - .../fox/wkml/test/test_kmlCreateLine_1.xml | 15 - .../fox/wkml/test/test_kmlCreateLine_10.f90 | 13 - .../fox/wkml/test/test_kmlCreateLine_10.xml | 15 - .../fox/wkml/test/test_kmlCreateLine_11.f90 | 14 - .../fox/wkml/test/test_kmlCreateLine_11.out | 2 - .../fox/wkml/test/test_kmlCreateLine_12.f90 | 14 - .../fox/wkml/test/test_kmlCreateLine_12.out | 2 - .../fox/wkml/test/test_kmlCreateLine_13.f90 | 14 - .../fox/wkml/test/test_kmlCreateLine_13.xml | 15 - .../fox/wkml/test/test_kmlCreateLine_14.f90 | 14 - .../fox/wkml/test/test_kmlCreateLine_14.xml | 15 - .../fox/wkml/test/test_kmlCreateLine_15.f90 | 14 - .../fox/wkml/test/test_kmlCreateLine_15.out | 2 - .../fox/wkml/test/test_kmlCreateLine_16.f90 | 14 - .../fox/wkml/test/test_kmlCreateLine_16.out | 2 - .../fox/wkml/test/test_kmlCreateLine_17.f90 | 13 - .../fox/wkml/test/test_kmlCreateLine_17.out | 2 - .../fox/wkml/test/test_kmlCreateLine_18.f90 | 13 - .../fox/wkml/test/test_kmlCreateLine_18.out | 2 - .../fox/wkml/test/test_kmlCreateLine_19.f90 | 13 - .../fox/wkml/test/test_kmlCreateLine_19.xml | 14 - .../fox/wkml/test/test_kmlCreateLine_2.f90 | 13 - .../fox/wkml/test/test_kmlCreateLine_2.xml | 16 - .../fox/wkml/test/test_kmlCreateLine_20.f90 | 13 - .../fox/wkml/test/test_kmlCreateLine_20.xml | 14 - .../fox/wkml/test/test_kmlCreateLine_3.f90 | 13 - .../fox/wkml/test/test_kmlCreateLine_3.xml | 15 - .../fox/wkml/test/test_kmlCreateLine_4.f90 | 13 - .../fox/wkml/test/test_kmlCreateLine_4.xml | 15 - .../fox/wkml/test/test_kmlCreateLine_5.f90 | 13 - .../fox/wkml/test/test_kmlCreateLine_5.out | 2 - .../fox/wkml/test/test_kmlCreateLine_6.f90 | 13 - .../fox/wkml/test/test_kmlCreateLine_6.out | 2 - .../fox/wkml/test/test_kmlCreateLine_7.f90 | 13 - .../fox/wkml/test/test_kmlCreateLine_7.xml | 15 - .../fox/wkml/test/test_kmlCreateLine_8.f90 | 14 - .../fox/wkml/test/test_kmlCreateLine_8.xml | 16 - .../fox/wkml/test/test_kmlCreateLine_9.f90 | 13 - .../fox/wkml/test/test_kmlCreateLine_9.xml | 15 - .../fox/wkml/test/test_kmlCreatePointStyle.sh | 7 - .../wkml/test/test_kmlCreatePointStyle_0.f90 | 12 - .../wkml/test/test_kmlCreatePointStyle_0.out | 2 - .../wkml/test/test_kmlCreatePointStyle_1.f90 | 13 - .../wkml/test/test_kmlCreatePointStyle_1.xml | 9 - .../wkml/test/test_kmlCreatePointStyle_10.f90 | 13 - .../wkml/test/test_kmlCreatePointStyle_10.xml | 11 - .../wkml/test/test_kmlCreatePointStyle_11.f90 | 13 - .../wkml/test/test_kmlCreatePointStyle_11.out | 2 - .../wkml/test/test_kmlCreatePointStyle_12.f90 | 13 - .../wkml/test/test_kmlCreatePointStyle_12.xml | 12 - .../wkml/test/test_kmlCreatePointStyle_13.f90 | 13 - .../wkml/test/test_kmlCreatePointStyle_13.xml | 12 - .../wkml/test/test_kmlCreatePointStyle_14.f90 | 13 - .../wkml/test/test_kmlCreatePointStyle_14.out | 2 - .../wkml/test/test_kmlCreatePointStyle_15.f90 | 13 - .../wkml/test/test_kmlCreatePointStyle_15.xml | 11 - .../wkml/test/test_kmlCreatePointStyle_16.f90 | 13 - .../wkml/test/test_kmlCreatePointStyle_16.xml | 13 - .../wkml/test/test_kmlCreatePointStyle_17.f90 | 13 - .../wkml/test/test_kmlCreatePointStyle_17.out | 2 - .../wkml/test/test_kmlCreatePointStyle_18.f90 | 16 - .../wkml/test/test_kmlCreatePointStyle_18.xml | 11 - .../wkml/test/test_kmlCreatePointStyle_19.f90 | 16 - .../wkml/test/test_kmlCreatePointStyle_19.out | 1 - .../wkml/test/test_kmlCreatePointStyle_2.f90 | 13 - .../wkml/test/test_kmlCreatePointStyle_2.xml | 11 - .../wkml/test/test_kmlCreatePointStyle_20.f90 | 16 - .../wkml/test/test_kmlCreatePointStyle_20.out | 1 - .../wkml/test/test_kmlCreatePointStyle_21.f90 | 16 - .../wkml/test/test_kmlCreatePointStyle_21.out | 1 - .../wkml/test/test_kmlCreatePointStyle_3.f90 | 13 - .../wkml/test/test_kmlCreatePointStyle_3.xml | 12 - .../wkml/test/test_kmlCreatePointStyle_4.f90 | 13 - .../wkml/test/test_kmlCreatePointStyle_4.out | 1 - .../wkml/test/test_kmlCreatePointStyle_5.f90 | 13 - .../wkml/test/test_kmlCreatePointStyle_5.xml | 12 - .../wkml/test/test_kmlCreatePointStyle_6.f90 | 13 - .../wkml/test/test_kmlCreatePointStyle_6.xml | 12 - .../wkml/test/test_kmlCreatePointStyle_7.f90 | 13 - .../wkml/test/test_kmlCreatePointStyle_7.out | 4 - .../wkml/test/test_kmlCreatePointStyle_8.f90 | 13 - .../wkml/test/test_kmlCreatePointStyle_8.xml | 11 - .../wkml/test/test_kmlCreatePointStyle_9.f90 | 13 - .../wkml/test/test_kmlCreatePointStyle_9.xml | 11 - .../src/fox/wkml/test/test_kmlCreatePoints.sh | 7 - .../fox/wkml/test/test_kmlCreatePoints_1.f90 | 13 - .../fox/wkml/test/test_kmlCreatePoints_1.xml | 13 - .../fox/wkml/test/test_kmlCreatePoints_10.f90 | 13 - .../fox/wkml/test/test_kmlCreatePoints_10.xml | 18 - .../fox/wkml/test/test_kmlCreatePoints_11.f90 | 13 - .../fox/wkml/test/test_kmlCreatePoints_11.xml | 19 - .../fox/wkml/test/test_kmlCreatePoints_12.f90 | 13 - .../fox/wkml/test/test_kmlCreatePoints_12.xml | 18 - .../fox/wkml/test/test_kmlCreatePoints_2.f90 | 13 - .../fox/wkml/test/test_kmlCreatePoints_2.xml | 13 - .../fox/wkml/test/test_kmlCreatePoints_3.f90 | 13 - .../fox/wkml/test/test_kmlCreatePoints_3.xml | 18 - .../fox/wkml/test/test_kmlCreatePoints_4.f90 | 13 - .../fox/wkml/test/test_kmlCreatePoints_4.xml | 20 - .../fox/wkml/test/test_kmlCreatePoints_5.f90 | 17 - .../fox/wkml/test/test_kmlCreatePoints_5.xml | 18 - .../fox/wkml/test/test_kmlCreatePoints_6.f90 | 17 - .../fox/wkml/test/test_kmlCreatePoints_6.xml | 18 - .../fox/wkml/test/test_kmlCreatePoints_7.f90 | 18 - .../fox/wkml/test/test_kmlCreatePoints_7.xml | 18 - .../wkml/test/test_kmlCreatePolygonStyle.sh | 7 - .../test/test_kmlCreatePolygonStyle_1.f90 | 13 - .../test/test_kmlCreatePolygonStyle_1.xml | 9 - .../test/test_kmlCreatePolygonStyle_10.f90 | 16 - .../test/test_kmlCreatePolygonStyle_10.xml | 12 - .../test/test_kmlCreatePolygonStyle_11.f90 | 16 - .../test/test_kmlCreatePolygonStyle_11.xml | 12 - .../test/test_kmlCreatePolygonStyle_12.f90 | 16 - .../test/test_kmlCreatePolygonStyle_12.xml | 12 - .../test/test_kmlCreatePolygonStyle_2.f90 | 16 - .../test/test_kmlCreatePolygonStyle_2.out | 1 - .../test/test_kmlCreatePolygonStyle_3.f90 | 16 - .../test/test_kmlCreatePolygonStyle_3.out | 1 - .../test/test_kmlCreatePolygonStyle_4.f90 | 16 - .../test/test_kmlCreatePolygonStyle_4.out | 1 - .../test/test_kmlCreatePolygonStyle_5.f90 | 16 - .../test/test_kmlCreatePolygonStyle_5.out | 1 - .../test/test_kmlCreatePolygonStyle_6.f90 | 16 - .../test/test_kmlCreatePolygonStyle_6.xml | 11 - .../test/test_kmlCreatePolygonStyle_7.f90 | 16 - .../test/test_kmlCreatePolygonStyle_7.xml | 11 - .../test/test_kmlCreatePolygonStyle_8.f90 | 16 - .../test/test_kmlCreatePolygonStyle_8.xml | 11 - .../test/test_kmlCreatePolygonStyle_9.f90 | 16 - .../test/test_kmlCreatePolygonStyle_9.xml | 12 - .../wkml/test/test_kmlOpenCloseDocument.sh | 7 - .../wkml/test/test_kmlOpenCloseDocument_1.f90 | 12 - .../wkml/test/test_kmlOpenCloseDocument_1.xml | 6 - .../wkml/test/test_kmlOpenCloseDocument_2.f90 | 12 - .../wkml/test/test_kmlOpenCloseDocument_2.xml | 6 - .../wkml/test/test_kmlOpenCloseDocument_3.f90 | 12 - .../wkml/test/test_kmlOpenCloseDocument_3.xml | 6 - .../wkml/test/test_kmlOpenCloseDocument_4.f90 | 14 - .../wkml/test/test_kmlOpenCloseDocument_4.xml | 9 - .../wkml/test/test_kmlOpenCloseDocument_5.f90 | 14 - .../wkml/test/test_kmlOpenCloseDocument_5.xml | 9 - .../fox/wkml/test/test_kmlOpenCloseFolder.sh | 7 - .../wkml/test/test_kmlOpenCloseFolder_0.f90 | 13 - .../wkml/test/test_kmlOpenCloseFolder_0.out | 3 - .../wkml/test/test_kmlOpenCloseFolder_1.f90 | 14 - .../wkml/test/test_kmlOpenCloseFolder_1.xml | 7 - .../wkml/test/test_kmlOpenCloseFolder_2.f90 | 14 - .../wkml/test/test_kmlOpenCloseFolder_2.xml | 9 - .../wkml/test/test_kmlOpenCloseFolder_3.f90 | 14 - .../wkml/test/test_kmlOpenCloseFolder_3.xml | 7 - .../wkml/test/test_kmlOpenCloseFolder_4.f90 | 14 - .../wkml/test/test_kmlOpenCloseFolder_4.xml | 9 - .../wkml/test/test_kmlOpenCloseFolder_5.f90 | 13 - .../wkml/test/test_kmlOpenCloseFolder_5.out | 3 - .../fox/wkml/test/test_kmlStartEndRegion.sh | 7 - .../wkml/test/test_kmlStartEndRegion_0.f90 | 13 - .../wkml/test/test_kmlStartEndRegion_0.out | 2 - .../wkml/test/test_kmlStartEndRegion_1.f90 | 14 - .../wkml/test/test_kmlStartEndRegion_1.xml | 20 - .../wkml/test/test_kmlStartEndRegion_10.f90 | 14 - .../wkml/test/test_kmlStartEndRegion_10.out | 2 - .../wkml/test/test_kmlStartEndRegion_11.f90 | 14 - .../wkml/test/test_kmlStartEndRegion_11.xml | 20 - .../wkml/test/test_kmlStartEndRegion_12.f90 | 14 - .../wkml/test/test_kmlStartEndRegion_12.xml | 20 - .../wkml/test/test_kmlStartEndRegion_13.f90 | 15 - .../wkml/test/test_kmlStartEndRegion_13.out | 2 - .../wkml/test/test_kmlStartEndRegion_14.f90 | 16 - .../wkml/test/test_kmlStartEndRegion_14.out | 2 - .../wkml/test/test_kmlStartEndRegion_15.f90 | 16 - .../wkml/test/test_kmlStartEndRegion_15.out | 2 - .../wkml/test/test_kmlStartEndRegion_16.f90 | 16 - .../wkml/test/test_kmlStartEndRegion_16.out | 2 - .../wkml/test/test_kmlStartEndRegion_2.f90 | 14 - .../wkml/test/test_kmlStartEndRegion_2.xml | 20 - .../wkml/test/test_kmlStartEndRegion_3.f90 | 14 - .../wkml/test/test_kmlStartEndRegion_3.xml | 20 - .../wkml/test/test_kmlStartEndRegion_4.f90 | 14 - .../wkml/test/test_kmlStartEndRegion_4.xml | 20 - .../wkml/test/test_kmlStartEndRegion_5.f90 | 15 - .../wkml/test/test_kmlStartEndRegion_5.xml | 20 - .../wkml/test/test_kmlStartEndRegion_6.f90 | 16 - .../wkml/test/test_kmlStartEndRegion_6.xml | 20 - .../wkml/test/test_kmlStartEndRegion_7.f90 | 16 - .../wkml/test/test_kmlStartEndRegion_7.xml | 20 - .../wkml/test/test_kmlStartEndRegion_8.f90 | 16 - .../wkml/test/test_kmlStartEndRegion_8.xml | 20 - .../wkml/test/test_kmlStartEndRegion_9.f90 | 14 - .../wkml/test/test_kmlStartEndRegion_9.out | 2 - 3rdparty/quip/src/fox/wxml/CMakeLists.txt | 33 - 3rdparty/quip/src/fox/wxml/FoX_wxml.f90 | 45 - 3rdparty/quip/src/fox/wxml/m_wxml_core.F90 | 1877 - 3rdparty/quip/src/fox/wxml/m_wxml_escape.F90 | 140 - .../quip/src/fox/wxml/m_wxml_overloads.F90 | 1028 - .../quip/src/fox/wxml/m_wxml_overloads.m4 | 191 - 3rdparty/quip/src/fox/wxml/makefile | 34 - 3rdparty/quip/src/fox/wxml/test/Makefile | 12 - 3rdparty/quip/src/fox/wxml/test/passed.sh | 9 - 3rdparty/quip/src/fox/wxml/test/run_tests.sh | 18 - 3rdparty/quip/src/fox/wxml/test/test.sh | 1 - 3rdparty/quip/src/fox/wxml/test/test_xml.sh | 7 - .../fox/wxml/test/test_xml_AddAttribute.sh | 1 - .../fox/wxml/test/test_xml_AddAttribute_0.f90 | 12 - .../fox/wxml/test/test_xml_AddAttribute_0.out | 2 - .../fox/wxml/test/test_xml_AddAttribute_1.f90 | 15 - .../fox/wxml/test/test_xml_AddAttribute_1.xml | 2 - .../fox/wxml/test/test_xml_AddAttribute_2.f90 | 14 - .../fox/wxml/test/test_xml_AddAttribute_2.out | 3 - .../fox/wxml/test/test_xml_AddAttribute_3.f90 | 16 - .../fox/wxml/test/test_xml_AddAttribute_3.out | 3 - .../fox/wxml/test/test_xml_AddAttribute_4.f90 | 15 - .../fox/wxml/test/test_xml_AddAttribute_4.out | 2 - .../fox/wxml/test/test_xml_AddAttribute_5.f90 | 15 - .../fox/wxml/test/test_xml_AddAttribute_5.out | 3 - .../fox/wxml/test/test_xml_AddAttribute_6.f90 | 15 - .../fox/wxml/test/test_xml_AddAttribute_6.xml | 2 - .../fox/wxml/test/test_xml_AddAttribute_7.f90 | 15 - .../fox/wxml/test/test_xml_AddAttribute_7.xml | 2 - .../fox/wxml/test/test_xml_AddAttribute_8.f90 | 27 - .../fox/wxml/test/test_xml_AddAttribute_8.xml | 2 - .../test/test_xml_AddAttribute_overload_1.f90 | 15 - .../test/test_xml_AddAttribute_overload_1.xml | 2 - .../test_xml_AddAttribute_overload_10.f90 | 15 - .../test_xml_AddAttribute_overload_10.xml | 2 - .../test_xml_AddAttribute_overload_11.f90 | 15 - .../test_xml_AddAttribute_overload_11.xml | 2 - .../test_xml_AddAttribute_overload_12.f90 | 15 - .../test_xml_AddAttribute_overload_12.xml | 2 - .../test_xml_AddAttribute_overload_13.f90 | 15 - .../test_xml_AddAttribute_overload_13.xml | 2 - .../test_xml_AddAttribute_overload_14.f90 | 18 - .../test_xml_AddAttribute_overload_14.xml | 2 - .../test_xml_AddAttribute_overload_15.f90 | 18 - .../test_xml_AddAttribute_overload_15.xml | 2 - .../test_xml_AddAttribute_overload_16.f90 | 17 - .../test_xml_AddAttribute_overload_16.xml | 2 - .../test_xml_AddAttribute_overload_17.f90 | 17 - .../test_xml_AddAttribute_overload_17.xml | 2 - .../test_xml_AddAttribute_overload_18.f90 | 17 - .../test_xml_AddAttribute_overload_18.xml | 2 - .../test_xml_AddAttribute_overload_19.f90 | 17 - .../test_xml_AddAttribute_overload_19.xml | 2 - .../test/test_xml_AddAttribute_overload_2.f90 | 15 - .../test/test_xml_AddAttribute_overload_2.xml | 2 - .../test_xml_AddAttribute_overload_20.f90 | 17 - .../test_xml_AddAttribute_overload_20.xml | 2 - .../test/test_xml_AddAttribute_overload_3.f90 | 15 - .../test/test_xml_AddAttribute_overload_3.xml | 2 - .../test/test_xml_AddAttribute_overload_4.f90 | 15 - .../test/test_xml_AddAttribute_overload_4.xml | 2 - .../test/test_xml_AddAttribute_overload_5.f90 | 15 - .../test/test_xml_AddAttribute_overload_5.xml | 2 - .../test/test_xml_AddAttribute_overload_6.f90 | 15 - .../test/test_xml_AddAttribute_overload_6.xml | 2 - .../test/test_xml_AddAttribute_overload_7.f90 | 15 - .../test/test_xml_AddAttribute_overload_7.xml | 2 - .../test/test_xml_AddAttribute_overload_8.f90 | 15 - .../test/test_xml_AddAttribute_overload_8.xml | 2 - .../test/test_xml_AddAttribute_overload_9.f90 | 15 - .../test/test_xml_AddAttribute_overload_9.xml | 2 - .../fox/wxml/test/test_xml_AddCharacters.sh | 1 - .../wxml/test/test_xml_AddCharacters_0.f90 | 12 - .../wxml/test/test_xml_AddCharacters_0.out | 2 - .../wxml/test/test_xml_AddCharacters_1.f90 | 15 - .../wxml/test/test_xml_AddCharacters_1.xml | 2 - .../wxml/test/test_xml_AddCharacters_2.f90 | 15 - .../wxml/test/test_xml_AddCharacters_2.xml | 2 - .../wxml/test/test_xml_AddCharacters_3.f90 | 15 - .../wxml/test/test_xml_AddCharacters_3.xml | 2 - .../wxml/test/test_xml_AddCharacters_4.f90 | 14 - .../wxml/test/test_xml_AddCharacters_4.out | 2 - .../wxml/test/test_xml_AddCharacters_5.f90 | 15 - .../wxml/test/test_xml_AddCharacters_5.out | 2 - .../test_xml_AddCharacters_overload_1.f90 | 15 - .../test_xml_AddCharacters_overload_1.xml | 2 - .../test_xml_AddCharacters_overload_10.f90 | 15 - .../test_xml_AddCharacters_overload_10.xml | 2 - .../test_xml_AddCharacters_overload_11.f90 | 15 - .../test_xml_AddCharacters_overload_11.xml | 2 - .../test_xml_AddCharacters_overload_12.f90 | 15 - .../test_xml_AddCharacters_overload_12.xml | 2 - .../test_xml_AddCharacters_overload_13.f90 | 15 - .../test_xml_AddCharacters_overload_13.xml | 2 - .../test_xml_AddCharacters_overload_14.f90 | 18 - .../test_xml_AddCharacters_overload_14.xml | 2 - .../test_xml_AddCharacters_overload_15.f90 | 18 - .../test_xml_AddCharacters_overload_15.xml | 2 - .../test_xml_AddCharacters_overload_16.f90 | 18 - .../test_xml_AddCharacters_overload_16.xml | 2 - .../test_xml_AddCharacters_overload_17.f90 | 18 - .../test_xml_AddCharacters_overload_17.xml | 2 - .../test_xml_AddCharacters_overload_18.f90 | 18 - .../test_xml_AddCharacters_overload_18.xml | 2 - .../test_xml_AddCharacters_overload_19.f90 | 18 - .../test_xml_AddCharacters_overload_19.xml | 2 - .../test_xml_AddCharacters_overload_2.f90 | 15 - .../test_xml_AddCharacters_overload_2.xml | 2 - .../test_xml_AddCharacters_overload_20.f90 | 18 - .../test_xml_AddCharacters_overload_20.xml | 2 - .../test_xml_AddCharacters_overload_3.f90 | 15 - .../test_xml_AddCharacters_overload_3.xml | 2 - .../test_xml_AddCharacters_overload_4.f90 | 15 - .../test_xml_AddCharacters_overload_4.xml | 2 - .../test_xml_AddCharacters_overload_5.f90 | 15 - .../test_xml_AddCharacters_overload_5.xml | 2 - .../test_xml_AddCharacters_overload_6.f90 | 15 - .../test_xml_AddCharacters_overload_6.xml | 2 - .../test_xml_AddCharacters_overload_7.f90 | 15 - .../test_xml_AddCharacters_overload_7.xml | 2 - .../test_xml_AddCharacters_overload_8.f90 | 15 - .../test_xml_AddCharacters_overload_8.xml | 2 - .../test_xml_AddCharacters_overload_9.f90 | 15 - .../test_xml_AddCharacters_overload_9.xml | 2 - .../src/fox/wxml/test/test_xml_AddComment.sh | 1 - .../fox/wxml/test/test_xml_AddComment_0.f90 | 12 - .../fox/wxml/test/test_xml_AddComment_0.out | 2 - .../fox/wxml/test/test_xml_AddComment_1.f90 | 14 - .../fox/wxml/test/test_xml_AddComment_1.xml | 3 - .../fox/wxml/test/test_xml_AddComment_2.f90 | 14 - .../fox/wxml/test/test_xml_AddComment_2.out | 2 - .../fox/wxml/test/test_xml_AddComment_3.f90 | 14 - .../fox/wxml/test/test_xml_AddComment_3.out | 2 - .../src/fox/wxml/test/test_xml_AddDOCTYPE.sh | 1 - .../fox/wxml/test/test_xml_AddDOCTYPE_0.f90 | 16 - .../fox/wxml/test/test_xml_AddDOCTYPE_0.out | 2 - .../fox/wxml/test/test_xml_AddDOCTYPE_1.f90 | 15 - .../fox/wxml/test/test_xml_AddDOCTYPE_1.xml | 3 - .../fox/wxml/test/test_xml_AddDOCTYPE_2.f90 | 16 - .../fox/wxml/test/test_xml_AddDOCTYPE_2.xml | 3 - .../fox/wxml/test/test_xml_AddDOCTYPE_3.f90 | 15 - .../fox/wxml/test/test_xml_AddDOCTYPE_3.out | 2 - .../fox/wxml/test/test_xml_AddDOCTYPE_4.f90 | 15 - .../fox/wxml/test/test_xml_AddDOCTYPE_4.xml | 3 - .../fox/wxml/test/test_xml_AddDOCTYPE_5.f90 | 16 - .../fox/wxml/test/test_xml_AddDOCTYPE_5.out | 2 - .../wxml/test/test_xml_AddExternalEntity.sh | 1 - .../test/test_xml_AddExternalEntity_0.f90 | 15 - .../test/test_xml_AddExternalEntity_0.out | 2 - .../test/test_xml_AddExternalEntity_1.f90 | 16 - .../test/test_xml_AddExternalEntity_1.xml | 5 - .../test/test_xml_AddExternalEntity_2.f90 | 17 - .../test/test_xml_AddExternalEntity_2.xml | 5 - .../test/test_xml_AddExternalEntity_3.f90 | 17 - .../test/test_xml_AddExternalEntity_3.xml | 5 - .../test/test_xml_AddExternalEntity_4.f90 | 19 - .../test/test_xml_AddExternalEntity_4.xml | 6 - .../wxml/test/test_xml_AddInternalEntity.sh | 1 - .../test/test_xml_AddInternalEntity_0.f90 | 15 - .../test/test_xml_AddInternalEntity_0.out | 2 - .../test/test_xml_AddInternalEntity_1.f90 | 16 - .../test/test_xml_AddInternalEntity_1.xml | 5 - .../test/test_xml_AddInternalEntity_2.f90 | 16 - .../test/test_xml_AddInternalEntity_2.out | 2 - .../test/test_xml_AddInternalEntity_3.f90 | 16 - .../test/test_xml_AddInternalEntity_3.out | 2 - .../test/test_xml_AddInternalEntity_4.f90 | 16 - .../test/test_xml_AddInternalEntity_4.xml | 5 - .../fox/wxml/test/test_xml_AddNewline_1.f90 | 17 - .../fox/wxml/test/test_xml_AddNewline_1.xml | 5 - .../src/fox/wxml/test/test_xml_AddNotation.sh | 1 - .../fox/wxml/test/test_xml_AddNotation_0.f90 | 15 - .../fox/wxml/test/test_xml_AddNotation_0.out | 2 - .../fox/wxml/test/test_xml_AddNotation_1.f90 | 16 - .../fox/wxml/test/test_xml_AddNotation_1.xml | 5 - .../fox/wxml/test/test_xml_AddNotation_2.f90 | 16 - .../fox/wxml/test/test_xml_AddNotation_2.xml | 5 - .../fox/wxml/test/test_xml_AddNotation_3.f90 | 16 - .../fox/wxml/test/test_xml_AddNotation_3.xml | 5 - .../wxml/test/test_xml_AddParameterEntity.sh | 1 - .../test/test_xml_AddParameterEntity_0.f90 | 15 - .../test/test_xml_AddParameterEntity_0.out | 2 - .../test/test_xml_AddParameterEntity_1.f90 | 16 - .../test/test_xml_AddParameterEntity_1.xml | 5 - .../test/test_xml_AddParameterEntity_2.f90 | 16 - .../test/test_xml_AddParameterEntity_2.out | 2 - .../test/test_xml_AddParameterEntity_3.f90 | 16 - .../test/test_xml_AddParameterEntity_3.out | 2 - .../test/test_xml_AddParameterEntity_4.f90 | 16 - .../test/test_xml_AddParameterEntity_4.out | 2 - .../test/test_xml_AddParameterEntity_5.f90 | 16 - .../test/test_xml_AddParameterEntity_5.out | 2 - .../test/test_xml_AddParameterEntity_6.f90 | 16 - .../test/test_xml_AddParameterEntity_6.xml | 5 - .../test/test_xml_AddParameterEntity_7.f90 | 16 - .../test/test_xml_AddParameterEntity_7.xml | 5 - .../wxml/test/test_xml_AddPseudoAttribute.sh | 1 - .../test/test_xml_AddPseudoAttribute_0.f90 | 12 - .../test/test_xml_AddPseudoAttribute_0.out | 2 - .../test/test_xml_AddPseudoAttribute_1.f90 | 15 - .../test/test_xml_AddPseudoAttribute_1.xml | 3 - .../test/test_xml_AddPseudoAttribute_2.f90 | 14 - .../test/test_xml_AddPseudoAttribute_2.out | 2 - .../test/test_xml_AddPseudoAttribute_3.f90 | 16 - .../test/test_xml_AddPseudoAttribute_3.out | 3 - .../test/test_xml_AddPseudoAttribute_4.f90 | 15 - .../test/test_xml_AddPseudoAttribute_4.out | 2 - .../test/test_xml_AddPseudoAttribute_5.f90 | 15 - .../test/test_xml_AddPseudoAttribute_5.out | 3 - ...test_xml_AddPseudoAttribute_overload_1.f90 | 15 - ...test_xml_AddPseudoAttribute_overload_1.xml | 3 - ...est_xml_AddPseudoAttribute_overload_10.f90 | 15 - ...est_xml_AddPseudoAttribute_overload_10.xml | 3 - ...est_xml_AddPseudoAttribute_overload_11.f90 | 15 - ...est_xml_AddPseudoAttribute_overload_11.xml | 3 - ...est_xml_AddPseudoAttribute_overload_12.f90 | 15 - ...est_xml_AddPseudoAttribute_overload_12.xml | 3 - ...est_xml_AddPseudoAttribute_overload_13.f90 | 15 - ...est_xml_AddPseudoAttribute_overload_13.xml | 3 - ...est_xml_AddPseudoAttribute_overload_14.f90 | 18 - ...est_xml_AddPseudoAttribute_overload_14.xml | 3 - ...est_xml_AddPseudoAttribute_overload_15.f90 | 18 - ...est_xml_AddPseudoAttribute_overload_15.xml | 3 - ...est_xml_AddPseudoAttribute_overload_16.f90 | 18 - ...est_xml_AddPseudoAttribute_overload_16.xml | 3 - ...est_xml_AddPseudoAttribute_overload_17.f90 | 18 - ...est_xml_AddPseudoAttribute_overload_17.xml | 3 - ...est_xml_AddPseudoAttribute_overload_18.f90 | 18 - ...est_xml_AddPseudoAttribute_overload_18.xml | 3 - ...est_xml_AddPseudoAttribute_overload_19.f90 | 18 - ...est_xml_AddPseudoAttribute_overload_19.xml | 3 - ...test_xml_AddPseudoAttribute_overload_2.f90 | 15 - ...test_xml_AddPseudoAttribute_overload_2.xml | 3 - ...est_xml_AddPseudoAttribute_overload_20.f90 | 18 - ...est_xml_AddPseudoAttribute_overload_20.xml | 3 - ...test_xml_AddPseudoAttribute_overload_3.f90 | 15 - ...test_xml_AddPseudoAttribute_overload_3.xml | 3 - ...test_xml_AddPseudoAttribute_overload_4.f90 | 15 - ...test_xml_AddPseudoAttribute_overload_4.xml | 3 - ...test_xml_AddPseudoAttribute_overload_5.f90 | 15 - ...test_xml_AddPseudoAttribute_overload_5.xml | 3 - ...test_xml_AddPseudoAttribute_overload_6.f90 | 15 - ...test_xml_AddPseudoAttribute_overload_6.xml | 3 - ...test_xml_AddPseudoAttribute_overload_7.f90 | 15 - ...test_xml_AddPseudoAttribute_overload_7.xml | 3 - ...test_xml_AddPseudoAttribute_overload_8.f90 | 15 - ...test_xml_AddPseudoAttribute_overload_8.xml | 3 - ...test_xml_AddPseudoAttribute_overload_9.f90 | 15 - ...test_xml_AddPseudoAttribute_overload_9.xml | 3 - .../wxml/test/test_xml_AddXMLDeclaration.sh | 1 - .../test/test_xml_AddXMLDeclaration_0.f90 | 12 - .../test/test_xml_AddXMLDeclaration_0.out | 2 - .../test/test_xml_AddXMLDeclaration_1.f90 | 14 - .../test/test_xml_AddXMLDeclaration_1.xml | 2 - .../test/test_xml_AddXMLDeclaration_2.f90 | 14 - .../test/test_xml_AddXMLDeclaration_2.xml | 2 - .../test/test_xml_AddXMLDeclaration_3.f90 | 14 - .../test/test_xml_AddXMLDeclaration_3.xml | 2 - .../test/test_xml_AddXMLDeclaration_4.f90 | 14 - .../test/test_xml_AddXMLDeclaration_4.xml | 2 - .../test/test_xml_AddXMLDeclaration_5.f90 | 14 - .../test/test_xml_AddXMLDeclaration_5.out | 2 - .../src/fox/wxml/test/test_xml_AddXMLPI.sh | 1 - .../src/fox/wxml/test/test_xml_AddXMLPI_0.f90 | 11 - .../src/fox/wxml/test/test_xml_AddXMLPI_0.out | 2 - .../src/fox/wxml/test/test_xml_AddXMLPI_1.f90 | 14 - .../src/fox/wxml/test/test_xml_AddXMLPI_1.xml | 3 - .../src/fox/wxml/test/test_xml_AddXMLPI_2.f90 | 15 - .../src/fox/wxml/test/test_xml_AddXMLPI_2.xml | 3 - .../src/fox/wxml/test/test_xml_AddXMLPI_3.f90 | 14 - .../src/fox/wxml/test/test_xml_AddXMLPI_3.xml | 3 - .../src/fox/wxml/test/test_xml_AddXMLPI_4.f90 | 13 - .../src/fox/wxml/test/test_xml_AddXMLPI_4.out | 3 - .../src/fox/wxml/test/test_xml_AddXMLPI_5.f90 | 13 - .../src/fox/wxml/test/test_xml_AddXMLPI_5.out | 3 - .../wxml/test/test_xml_AddXMLStylesheet.sh | 1 - .../wxml/test/test_xml_AddXMLStylesheet_0.f90 | 11 - .../wxml/test/test_xml_AddXMLStylesheet_0.out | 2 - .../wxml/test/test_xml_AddXMLStylesheet_1.f90 | 14 - .../wxml/test/test_xml_AddXMLStylesheet_1.xml | 3 - .../wxml/test/test_xml_AddXMLStylesheet_2.f90 | 14 - .../wxml/test/test_xml_AddXMLStylesheet_2.xml | 3 - .../wxml/test/test_xml_AddXMLStylesheet_3.f90 | 14 - .../wxml/test/test_xml_AddXMLStylesheet_3.xml | 3 - .../wxml/test/test_xml_AddXMLStylesheet_4.f90 | 14 - .../wxml/test/test_xml_AddXMLStylesheet_4.xml | 3 - .../wxml/test/test_xml_AddXMLStylesheet_5.f90 | 14 - .../wxml/test/test_xml_AddXMLStylesheet_5.xml | 3 - .../quip/src/fox/wxml/test/test_xml_Close.sh | 1 - .../src/fox/wxml/test/test_xml_Close_1.f90 | 12 - .../src/fox/wxml/test/test_xml_Close_1.out | 3 - .../src/fox/wxml/test/test_xml_Close_2.f90 | 14 - .../src/fox/wxml/test/test_xml_Close_2.out | 2 - .../src/fox/wxml/test/test_xml_Close_3.f90 | 11 - .../src/fox/wxml/test/test_xml_Close_3.out | 2 - .../src/fox/wxml/test/test_xml_Close_4.f90 | 14 - .../src/fox/wxml/test/test_xml_Close_4.out | 3 - .../src/fox/wxml/test/test_xml_Close_5.f90 | 16 - .../src/fox/wxml/test/test_xml_Close_5.xml | 6 - .../src/fox/wxml/test/test_xml_EndElement.sh | 1 - .../fox/wxml/test/test_xml_EndElement_0.f90 | 12 - .../fox/wxml/test/test_xml_EndElement_0.out | 2 - .../fox/wxml/test/test_xml_EndElement_1.f90 | 14 - .../fox/wxml/test/test_xml_EndElement_1.out | 3 - .../fox/wxml/test/test_xml_EndElement_2.f90 | 15 - .../fox/wxml/test/test_xml_EndElement_2.xml | 2 - .../fox/wxml/test/test_xml_EndElement_3.f90 | 15 - .../fox/wxml/test/test_xml_EndElement_3.out | 3 - .../fox/wxml/test/test_xml_EndElement_4.f90 | 16 - .../fox/wxml/test/test_xml_EndElement_4.xml | 4 - .../fox/wxml/test/test_xml_EndElement_5.f90 | 16 - .../fox/wxml/test/test_xml_EndElement_5.xml | 4 - .../src/fox/wxml/test/test_xml_Namespaces.sh | 1 - .../fox/wxml/test/test_xml_Namespaces_0.f90 | 12 - .../fox/wxml/test/test_xml_Namespaces_0.out | 2 - .../fox/wxml/test/test_xml_Namespaces_1.f90 | 15 - .../fox/wxml/test/test_xml_Namespaces_1.xml | 2 - .../fox/wxml/test/test_xml_Namespaces_10.f90 | 20 - .../fox/wxml/test/test_xml_Namespaces_10.out | 2 - .../fox/wxml/test/test_xml_Namespaces_11.f90 | 22 - .../fox/wxml/test/test_xml_Namespaces_11.out | 3 - .../fox/wxml/test/test_xml_Namespaces_12.f90 | 21 - .../fox/wxml/test/test_xml_Namespaces_12.out | 2 - .../fox/wxml/test/test_xml_Namespaces_13.f90 | 36 - .../fox/wxml/test/test_xml_Namespaces_13.xml | 22 - .../fox/wxml/test/test_xml_Namespaces_2.f90 | 15 - .../fox/wxml/test/test_xml_Namespaces_2.xml | 2 - .../fox/wxml/test/test_xml_Namespaces_3.f90 | 17 - .../fox/wxml/test/test_xml_Namespaces_3.xml | 2 - .../fox/wxml/test/test_xml_Namespaces_4.f90 | 21 - .../fox/wxml/test/test_xml_Namespaces_4.out | 3 - .../fox/wxml/test/test_xml_Namespaces_5.f90 | 20 - .../fox/wxml/test/test_xml_Namespaces_5.out | 3 - .../fox/wxml/test/test_xml_Namespaces_6.f90 | 18 - .../fox/wxml/test/test_xml_Namespaces_6.xml | 4 - .../fox/wxml/test/test_xml_Namespaces_7.f90 | 20 - .../fox/wxml/test/test_xml_Namespaces_7.xml | 6 - .../fox/wxml/test/test_xml_Namespaces_8.f90 | 21 - .../fox/wxml/test/test_xml_Namespaces_8.out | 2 - .../fox/wxml/test/test_xml_Namespaces_9.f90 | 20 - .../fox/wxml/test/test_xml_Namespaces_9.out | 2 - .../src/fox/wxml/test/test_xml_NewElement.sh | 1 - .../fox/wxml/test/test_xml_NewElement_0.f90 | 12 - .../fox/wxml/test/test_xml_NewElement_0.out | 2 - .../fox/wxml/test/test_xml_NewElement_1.f90 | 14 - .../fox/wxml/test/test_xml_NewElement_1.xml | 2 - .../fox/wxml/test/test_xml_NewElement_2.f90 | 14 - .../fox/wxml/test/test_xml_NewElement_2.out | 2 - .../fox/wxml/test/test_xml_NewElement_3.f90 | 16 - .../fox/wxml/test/test_xml_NewElement_3.out | 3 - .../fox/wxml/test/test_xml_NewElement_4.f90 | 14 - .../fox/wxml/test/test_xml_NewElement_4.out | 3 - .../fox/wxml/test/test_xml_NewElement_5.f90 | 15 - .../fox/wxml/test/test_xml_NewElement_5.out | 3 - .../fox/wxml/test/test_xml_NewElement_6.f90 | 16 - .../fox/wxml/test/test_xml_NewElement_6.out | 3 - .../fox/wxml/test/test_xml_NewElement_7.f90 | 18 - .../fox/wxml/test/test_xml_NewElement_7.out | 4 - .../src/fox/wxml/test/test_xml_Openfile.sh | 74 - .../src/fox/wxml/test/test_xml_Openfile_1.f90 | 14 - .../src/fox/wxml/test/test_xml_Openfile_2.f90 | 14 - .../src/fox/wxml/test/test_xml_Openfile_3.f90 | 13 - .../src/fox/wxml/test/test_xml_Openfile_4.f90 | 14 - .../src/fox/wxml/test/test_xml_Openfile_4.out | 2 - 3rdparty/quip/src/libAtoms/Atoms.f95 | 3546 - 3rdparty/quip/src/libAtoms/Atoms_ll.f95 | 391 - 3rdparty/quip/src/libAtoms/Atoms_types.f95 | 1779 - 3rdparty/quip/src/libAtoms/Barostat.f95 | 682 - 3rdparty/quip/src/libAtoms/CInOutput.f95 | 1089 - 3rdparty/quip/src/libAtoms/COPYRIGHT | 29 - 3rdparty/quip/src/libAtoms/Connection.f95 | 2192 - 3rdparty/quip/src/libAtoms/Constraints.f95 | 1828 - 3rdparty/quip/src/libAtoms/Dictionary.f95 | 3206 - .../quip/src/libAtoms/DomainDecomposition.f95 | 1605 - .../quip/src/libAtoms/DynamicalSystem.f95 | 3279 - 3rdparty/quip/src/libAtoms/ExtendableStr.f95 | 703 - 3rdparty/quip/src/libAtoms/Group.f95 | 812 - 3rdparty/quip/src/libAtoms/LinkedList.f95 | 957 - 3rdparty/quip/src/libAtoms/MPI_context.f95 | 1511 - 3rdparty/quip/src/libAtoms/Makefile | 152 - 3rdparty/quip/src/libAtoms/ParamReader.f95 | 1027 - 3rdparty/quip/src/libAtoms/PeriodicTable.f95 | 204 - 3rdparty/quip/src/libAtoms/Quaternions.f95 | 782 - 3rdparty/quip/src/libAtoms/README | 161 - 3rdparty/quip/src/libAtoms/RigidBody.f95 | 885 - 3rdparty/quip/src/libAtoms/SocketTools.f95 | 326 - 3rdparty/quip/src/libAtoms/Sparse.f95 | 716 - 3rdparty/quip/src/libAtoms/Spline.f95 | 463 - 3rdparty/quip/src/libAtoms/Structures.f95 | 3498 - 3rdparty/quip/src/libAtoms/System.f95 | 3467 - 3rdparty/quip/src/libAtoms/Table.f95 | 2134 - 3rdparty/quip/src/libAtoms/Thermostat.f95 | 1929 - 3rdparty/quip/src/libAtoms/Topology.f95 | 3461 - 3rdparty/quip/src/libAtoms/Units.f95 | 150 - 3rdparty/quip/src/libAtoms/alphashape.cpp | 285 - .../quip/src/libAtoms/angular_functions.f95 | 522 - 3rdparty/quip/src/libAtoms/clusters.f95 | 4294 - 3rdparty/quip/src/libAtoms/cutil.c | 501 - 3rdparty/quip/src/libAtoms/error.f95 | 416 - 3rdparty/quip/src/libAtoms/error.inc | 131 - .../quip/src/libAtoms/find_surface_atoms.f95 | 333 - 3rdparty/quip/src/libAtoms/frametools.f95 | 239 - .../quip/src/libAtoms/gamma_functions.f95 | 244 - 3rdparty/quip/src/libAtoms/histogram1d.f95 | 1991 - 3rdparty/quip/src/libAtoms/histogram2d.f95 | 826 - 3rdparty/quip/src/libAtoms/intro.tex | 261 - .../quip/src/libAtoms/k_means_clustering.f95 | 245 - 3rdparty/quip/src/libAtoms/lbfgs.f | 1180 - 3rdparty/quip/src/libAtoms/libAtoms.f95 | 78 - .../quip/src/libAtoms/libAtoms_misc_utils.f95 | 56 - .../src/libAtoms/libAtoms_utils_no_module.f95 | 396 - 3rdparty/quip/src/libAtoms/libatoms.h | 219 - 3rdparty/quip/src/libAtoms/linearalgebra.f95 | 7533 - 3rdparty/quip/src/libAtoms/lobpcg.f95 | 686 - .../libAtoms/make_thermo_baro_algorithm_docs | 4 - 3rdparty/quip/src/libAtoms/malloc.c | 5090 - 3rdparty/quip/src/libAtoms/minimal_md.f95 | 102 - 3rdparty/quip/src/libAtoms/minimization.f95 | 6246 - 3rdparty/quip/src/libAtoms/netcdf.c | 1193 - 3rdparty/quip/src/libAtoms/nye_tensor.f95 | 310 - 3rdparty/quip/src/libAtoms/partition.f95 | 413 - .../quip/src/libAtoms/protein_res.CHARMM.lib | 2239 - 3rdparty/quip/src/libAtoms/ringstat.f95 | 469 - 3rdparty/quip/src/libAtoms/sockets.c | 197 - 3rdparty/quip/src/libAtoms/statistics.f95 | 83 - .../src/libAtoms/steinhardt_nelson_qw.f95 | 234 - 3rdparty/quip/src/libAtoms/test_gamma.f95 | 76 - .../quip/src/libAtoms/test_iostat_vals.f90 | 47 - .../src/libAtoms/thermo_baro_algorithm.tex | 19 - 3rdparty/quip/src/libAtoms/xyz.c | 1457 - 3rdparty/quip/tests/GAP.xml | 171 - ...xml.sparseX.GAP_2018_10_7_60_14_59_24_9701 | 10 - ...xml.sparseX.GAP_2018_10_7_60_14_59_24_9702 | 10 - ...xml.sparseX.GAP_2018_10_7_60_14_59_24_9703 | 10 - 3rdparty/quip/tests/Makefile | 24 - 3rdparty/quip/tests/SW_pot.xml | 26 - 3rdparty/quip/tests/do_not_run/test_md.sh | 102 - .../quip/tests/do_not_run/test_md_velo.sh | 103 - 3rdparty/quip/tests/gap_sample.xyz | 83 - 3rdparty/quip/tests/old_test_elastic.py | 176 - 3rdparty/quip/tests/old_test_potential.py | 5084 - 3rdparty/quip/tests/quippytest.py | 96 - 3rdparty/quip/tests/rules/py3_test.inc | 45 - 3rdparty/quip/tests/run_all.py | 49 - 3rdparty/quip/tests/test_descriptor.py | 50 - 3rdparty/quip/tests/test_dynamicalsystem.py | 239 - 3rdparty/quip/tests/test_filepot.py | 131 - 3rdparty/quip/tests/test_gappot.py | 48 - 3rdparty/quip/tests/test_pot.py | 155 - 3rdparty/quip/tests/test_potential_cell.py | 52 - 3rdparty/quip/tests/test_quip.sh | 41 - 3rdparty/quip/travis/Makefile.inc | 44 - 3rdparty/quip/travis/Makefile.nogap.inc | 44 - 3rdparty/quip/travis/trigger_gap_release.sh | 3 - 3rdparty/quip/travis/trigger_quip_docker.sh | 9 - 2270 files changed, 1237842 deletions(-) delete mode 100644 3rdparty/gap/.gitignore delete mode 100644 3rdparty/gap/LICENSE.md delete mode 100644 3rdparty/gap/Makefile delete mode 100644 3rdparty/gap/clustering.f95 delete mode 100644 3rdparty/gap/descriptors.f95 delete mode 100644 3rdparty/gap/descriptors_wrapper.f95 delete mode 100644 3rdparty/gap/doc/Makefile delete mode 100644 3rdparty/gap/doc/conf.py delete mode 100644 3rdparty/gap/doc/gap_fit.rst delete mode 100644 3rdparty/gap/doc/gap_fitting_tutorial.ipynb delete mode 100644 3rdparty/gap/doc/index.rst delete mode 100644 3rdparty/gap/doc/modcontents.py delete mode 100644 3rdparty/gap/doc/quippy-descriptor-tutorial.ipynb delete mode 100644 3rdparty/gap/doc/tutorials.rst delete mode 100644 3rdparty/gap/error.inc delete mode 100644 3rdparty/gap/gap_fit.f95 delete mode 100644 3rdparty/gap/gap_fit_module.f95 delete mode 100755 3rdparty/gap/gapversion delete mode 100644 3rdparty/gap/gp_fit.f95 delete mode 100644 3rdparty/gap/gp_predict.f95 delete mode 100644 3rdparty/gap/make_permutations_v2.f95 delete mode 100755 3rdparty/gap/teach_sparse delete mode 100644 3rdparty/quip/.gitignore delete mode 100644 3rdparty/quip/.travis.yml delete mode 100644 3rdparty/quip/Makefile delete mode 100644 3rdparty/quip/Makefile.config delete mode 100644 3rdparty/quip/Makefile.fox delete mode 100644 3rdparty/quip/Makefile.rules delete mode 100644 3rdparty/quip/README.md delete mode 100644 3rdparty/quip/arch/Makefile.Kaiju delete mode 100644 3rdparty/quip/arch/Makefile.altix delete mode 100644 3rdparty/quip/arch/Makefile.altix-mpi delete mode 100644 3rdparty/quip/arch/Makefile.bgq_gfortran delete mode 100644 3rdparty/quip/arch/Makefile.bgq_gfortran_fen delete mode 100644 3rdparty/quip/arch/Makefile.cray_xt3 delete mode 100644 3rdparty/quip/arch/Makefile.cray_xt3-mpi delete mode 100644 3rdparty/quip/arch/Makefile.darwin_x86_32_gfortran delete mode 100644 3rdparty/quip/arch/Makefile.darwin_x86_64_gfortran delete mode 100644 3rdparty/quip/arch/Makefile.darwin_x86_64_gfortran_openmp delete mode 100644 3rdparty/quip/arch/Makefile.darwin_x86_64_gfortran_openmpi delete mode 100644 3rdparty/quip/arch/Makefile.darwin_x86_64_ifort_icc delete mode 100644 3rdparty/quip/arch/Makefile.linux_x86_32_gfortran delete mode 100644 3rdparty/quip/arch/Makefile.linux_x86_64_gfortran delete mode 100644 3rdparty/quip/arch/Makefile.linux_x86_64_gfortran_CrayXC30 delete mode 100644 3rdparty/quip/arch/Makefile.linux_x86_64_gfortran_CrayXC30_mpi delete mode 100644 3rdparty/quip/arch/Makefile.linux_x86_64_gfortran_CrayXE6_mpi delete mode 100644 3rdparty/quip/arch/Makefile.linux_x86_64_gfortran_openmp delete mode 100644 3rdparty/quip/arch/Makefile.linux_x86_64_gfortran_openmpi delete mode 100644 3rdparty/quip/arch/Makefile.linux_x86_64_ifort_gcc delete mode 100644 3rdparty/quip/arch/Makefile.linux_x86_64_ifort_gcc_openmp delete mode 100644 3rdparty/quip/arch/Makefile.linux_x86_64_ifort_gcc_openmpi delete mode 100644 3rdparty/quip/arch/Makefile.linux_x86_64_ifort_icc delete mode 100644 3rdparty/quip/arch/Makefile.linux_x86_64_ifort_icc_mpi delete mode 100644 3rdparty/quip/arch/Makefile.linux_x86_64_ifort_icc_openmp delete mode 100644 3rdparty/quip/arch/Makefile.linux_x86_64_ifort_icc_serial delete mode 100755 3rdparty/quip/bin/checkcode delete mode 100755 3rdparty/quip/bin/checkuse.py delete mode 100755 3rdparty/quip/bin/coverage_report.py delete mode 100755 3rdparty/quip/bin/f90doc.py delete mode 100644 3rdparty/quip/bin/find_sizeof_fortran_t delete mode 100755 3rdparty/quip/bin/fix_headers delete mode 100644 3rdparty/quip/bin/fix_sym_links delete mode 100755 3rdparty/quip/bin/gitversion delete mode 100755 3rdparty/quip/bin/ipynb2rst.py delete mode 100755 3rdparty/quip/bin/makedep.py delete mode 100755 3rdparty/quip/bin/mkdtd.pl delete mode 100755 3rdparty/quip/bin/module_name delete mode 100755 3rdparty/quip/bin/protect_mod delete mode 100755 3rdparty/quip/bin/unprotect_mod delete mode 100755 3rdparty/quip/bin/update-authors delete mode 100755 3rdparty/quip/bin/validate.py delete mode 100644 3rdparty/quip/doc/Makefile delete mode 100644 3rdparty/quip/doc/Tutorials/Introduction.ipynb delete mode 100644 3rdparty/quip/doc/Tutorials/NRL_TB_to_xml/README delete mode 100644 3rdparty/quip/doc/Tutorials/TS_params.xml delete mode 100644 3rdparty/quip/doc/Tutorials/adaptive-qmmm-references.rst delete mode 100644 3rdparty/quip/doc/Tutorials/adaptive-qmmm-solutions.rst delete mode 100644 3rdparty/quip/doc/Tutorials/adaptive-qmmm-step0.rst delete mode 100644 3rdparty/quip/doc/Tutorials/adaptive-qmmm-step1.rst delete mode 100644 3rdparty/quip/doc/Tutorials/adaptive-qmmm-step2.rst delete mode 100644 3rdparty/quip/doc/Tutorials/adaptive-qmmm-step3.rst delete mode 100644 3rdparty/quip/doc/Tutorials/adaptive-qmmm-theory.rst delete mode 100644 3rdparty/quip/doc/Tutorials/adaptive-qmmm.rst delete mode 100644 3rdparty/quip/doc/Tutorials/adglass.rst delete mode 100644 3rdparty/quip/doc/Tutorials/alphaquartz.png delete mode 100644 3rdparty/quip/doc/Tutorials/alphaquartz2.png delete mode 100644 3rdparty/quip/doc/Tutorials/atomistic-vs-continuum.png delete mode 100644 3rdparty/quip/doc/Tutorials/benzene_frames.xyz delete mode 100644 3rdparty/quip/doc/Tutorials/brittle-vs-ductile-microscale.png delete mode 100644 3rdparty/quip/doc/Tutorials/brittle-vs-ductile.png delete mode 100644 3rdparty/quip/doc/Tutorials/buffer-region.png delete mode 100644 3rdparty/quip/doc/Tutorials/cij.dat delete mode 100644 3rdparty/quip/doc/Tutorials/classical-crack-coordination.png delete mode 100644 3rdparty/quip/doc/Tutorials/classical-crack-sigma-yy-average.png delete mode 100644 3rdparty/quip/doc/Tutorials/classical-crack-sigma-yy.png delete mode 100644 3rdparty/quip/doc/Tutorials/crack-hybrid-mark.png delete mode 100644 3rdparty/quip/doc/Tutorials/crack-initial-qm-region.png delete mode 100644 3rdparty/quip/doc/Tutorials/crack-max-bolt-distrib.png delete mode 100755 3rdparty/quip/doc/Tutorials/crack-velo.sh delete mode 100644 3rdparty/quip/doc/Tutorials/crack_slab_1.png delete mode 100644 3rdparty/quip/doc/Tutorials/crack_slab_2.png delete mode 100644 3rdparty/quip/doc/Tutorials/crack_slab_3.png delete mode 100755 3rdparty/quip/doc/Tutorials/elastic.sh delete mode 100644 3rdparty/quip/doc/Tutorials/energy-release-rate-crack-position.png delete mode 100644 3rdparty/quip/doc/Tutorials/energyvolume1.png delete mode 100644 3rdparty/quip/doc/Tutorials/energyvolume2.png delete mode 100644 3rdparty/quip/doc/Tutorials/eval_TB/README delete mode 100644 3rdparty/quip/doc/Tutorials/fixed_mask.png delete mode 100644 3rdparty/quip/doc/Tutorials/forces.png delete mode 100644 3rdparty/quip/doc/Tutorials/gap_fitting_tutorial.ipynb delete mode 100644 3rdparty/quip/doc/Tutorials/griffith-criterion.png delete mode 100644 3rdparty/quip/doc/Tutorials/hysteresis.png delete mode 100644 3rdparty/quip/doc/Tutorials/index.rst delete mode 100644 3rdparty/quip/doc/Tutorials/irwin-sig-yy.png delete mode 100644 3rdparty/quip/doc/Tutorials/lawn-fracture-silicon.png delete mode 100644 3rdparty/quip/doc/Tutorials/lotf-crack-cluster.png delete mode 100644 3rdparty/quip/doc/Tutorials/lotf-crack-step-1.png delete mode 100644 3rdparty/quip/doc/Tutorials/lotf-crack-step-2.png delete mode 100644 3rdparty/quip/doc/Tutorials/lotf-energy-release-rate-crack-position.png delete mode 100644 3rdparty/quip/doc/Tutorials/lotf-overview.png delete mode 100644 3rdparty/quip/doc/Tutorials/lotf-pred-corr.png delete mode 100644 3rdparty/quip/doc/Tutorials/lotf_check_force_error.png delete mode 100644 3rdparty/quip/doc/Tutorials/make_crack.py delete mode 100644 3rdparty/quip/doc/Tutorials/make_crack_1.py delete mode 100644 3rdparty/quip/doc/Tutorials/make_crack_2.py delete mode 100644 3rdparty/quip/doc/Tutorials/make_crack_coordination.py delete mode 100644 3rdparty/quip/doc/Tutorials/methane.xyz delete mode 100644 3rdparty/quip/doc/Tutorials/multiscale-coupling.png delete mode 100644 3rdparty/quip/doc/Tutorials/params.xml delete mode 100644 3rdparty/quip/doc/Tutorials/potentialenergy.png delete mode 100644 3rdparty/quip/doc/Tutorials/quartz.png delete mode 100644 3rdparty/quip/doc/Tutorials/quartz.xyz delete mode 100644 3rdparty/quip/doc/Tutorials/quartz_0001.png delete mode 100644 3rdparty/quip/doc/Tutorials/quartz_0001.xyz delete mode 100644 3rdparty/quip/doc/Tutorials/quartz_crack.xml delete mode 100644 3rdparty/quip/doc/Tutorials/quartz_crack.xyz delete mode 100644 3rdparty/quip/doc/Tutorials/quartz_crack_bulk.xyz delete mode 100644 3rdparty/quip/doc/Tutorials/quartz_running_crack.png delete mode 100644 3rdparty/quip/doc/Tutorials/quartz_seed_crack.png delete mode 100644 3rdparty/quip/doc/Tutorials/quartz_unit_cell.png delete mode 100644 3rdparty/quip/doc/Tutorials/quippy-ase-interoperability.ipynb delete mode 100644 3rdparty/quip/doc/Tutorials/quippy-descriptor-tutorial.ipynb delete mode 100644 3rdparty/quip/doc/Tutorials/run_crack_classical.py delete mode 100644 3rdparty/quip/doc/Tutorials/run_crack_classical_1.py delete mode 100644 3rdparty/quip/doc/Tutorials/run_crack_lotf.py delete mode 100644 3rdparty/quip/doc/Tutorials/run_crack_lotf_1.py delete mode 100644 3rdparty/quip/doc/Tutorials/run_crack_lotf_2.py delete mode 100644 3rdparty/quip/doc/Tutorials/run_crack_lotf_3.py delete mode 100644 3rdparty/quip/doc/Tutorials/si-1000.xyz delete mode 100644 3rdparty/quip/doc/Tutorials/si8.png delete mode 100644 3rdparty/quip/doc/Tutorials/si_bulk.png delete mode 100644 3rdparty/quip/doc/Tutorials/sigma_yy.png delete mode 100644 3rdparty/quip/doc/Tutorials/structure_analysis/README.mean_var_correl delete mode 100755 3rdparty/quip/doc/Tutorials/surface-energy-annealed.sh delete mode 100755 3rdparty/quip/doc/Tutorials/surface-energy-relaxed.sh delete mode 100755 3rdparty/quip/doc/Tutorials/surface-energy.sh delete mode 100644 3rdparty/quip/doc/Tutorials/surface.png delete mode 100644 3rdparty/quip/doc/Tutorials/temperature-crack-position.png delete mode 100644 3rdparty/quip/doc/Tutorials/thin-strip.png delete mode 100644 3rdparty/quip/doc/Tutorials/totalenergy.png delete mode 100644 3rdparty/quip/doc/Tutorials/tutorial.rst delete mode 100644 3rdparty/quip/doc/Tutorials/unit_slab.png delete mode 100644 3rdparty/quip/doc/Tutorials/unit_slab_shifted.png delete mode 100644 3rdparty/quip/doc/Tutorials/velocitydistribution.png delete mode 100644 3rdparty/quip/doc/_static/theme_overrides.css delete mode 100644 3rdparty/quip/doc/_templates/layout.html delete mode 100644 3rdparty/quip/doc/adglass.rst delete mode 100644 3rdparty/quip/doc/atomeye.rst delete mode 100644 3rdparty/quip/doc/atomeyerc delete mode 100644 3rdparty/quip/doc/atoms.rst delete mode 100644 3rdparty/quip/doc/clusters.rst delete mode 100644 3rdparty/quip/doc/conf.py delete mode 100644 3rdparty/quip/doc/connection.rst delete mode 100644 3rdparty/quip/doc/cp2k.rst delete mode 100644 3rdparty/quip/doc/crack.rst delete mode 100644 3rdparty/quip/doc/crack.xyz delete mode 100644 3rdparty/quip/doc/debug.py delete mode 100644 3rdparty/quip/doc/descriptors.rst delete mode 100644 3rdparty/quip/doc/dictionary.rst delete mode 100644 3rdparty/quip/doc/domaindecomposition.rst delete mode 100644 3rdparty/quip/doc/dynamicalsystem.rst delete mode 100644 3rdparty/quip/doc/elasticity.rst delete mode 100644 3rdparty/quip/doc/electrostaticembed.rst delete mode 100644 3rdparty/quip/doc/f2py_wrapper_gen.rst delete mode 100644 3rdparty/quip/doc/f90doc.rst delete mode 100644 3rdparty/quip/doc/farray.rst delete mode 100644 3rdparty/quip/doc/favicon.ico delete mode 100644 3rdparty/quip/doc/find_surface_atoms.rst delete mode 100644 3rdparty/quip/doc/fortran_wrapper.rst delete mode 100644 3rdparty/quip/doc/fortranio.rst delete mode 100644 3rdparty/quip/doc/gap_fit.rst delete mode 100644 3rdparty/quip/doc/h2-molecule-comparison-molpro.png delete mode 100644 3rdparty/quip/doc/h2-molecule-comparison.png delete mode 100644 3rdparty/quip/doc/hybrid.png delete mode 100644 3rdparty/quip/doc/hydrogen-bond-length.py delete mode 100644 3rdparty/quip/doc/index.rst delete mode 100644 3rdparty/quip/doc/install.rst delete mode 100644 3rdparty/quip/doc/intro.rst delete mode 100644 3rdparty/quip/doc/io.rst delete mode 100644 3rdparty/quip/doc/linearalgebra.rst delete mode 100644 3rdparty/quip/doc/lotf-temperature-crack-position.png delete mode 100644 3rdparty/quip/doc/lotf.rst delete mode 100644 3rdparty/quip/doc/modcontents.py delete mode 100644 3rdparty/quip/doc/mpi_context.rst delete mode 100644 3rdparty/quip/doc/oo_fortran.rst delete mode 100644 3rdparty/quip/doc/paramreader.rst delete mode 100644 3rdparty/quip/doc/patch_f2py.rst delete mode 100644 3rdparty/quip/doc/periodictable.rst delete mode 100644 3rdparty/quip/doc/phonons.rst delete mode 100644 3rdparty/quip/doc/polarization.rst delete mode 100644 3rdparty/quip/doc/potential.rst delete mode 100644 3rdparty/quip/doc/potentialenergy2.png delete mode 100644 3rdparty/quip/doc/qlab-aux-property-colouring.png delete mode 100644 3rdparty/quip/doc/qlab-force-stress.png delete mode 100644 3rdparty/quip/doc/qlab.rst delete mode 100644 3rdparty/quip/doc/qpxml.rst delete mode 100644 3rdparty/quip/doc/quartz-charge.png delete mode 100644 3rdparty/quip/doc/quartz-filtered.png delete mode 100644 3rdparty/quip/doc/quaternions.rst delete mode 100644 3rdparty/quip/doc/quippy.rst delete mode 100644 3rdparty/quip/doc/real_space_covariance.rst delete mode 100644 3rdparty/quip/doc/run_crack_classical_lotf.patch delete mode 100644 3rdparty/quip/doc/si2x2x2.png delete mode 100644 3rdparty/quip/doc/si8-1.png delete mode 100644 3rdparty/quip/doc/si8-2.png delete mode 100644 3rdparty/quip/doc/simplex.rst delete mode 100644 3rdparty/quip/doc/spline.rst delete mode 100644 3rdparty/quip/doc/structures.rst delete mode 100644 3rdparty/quip/doc/system.rst delete mode 100644 3rdparty/quip/doc/table.rst delete mode 100644 3rdparty/quip/doc/thin-strip-displacement-y.png delete mode 100644 3rdparty/quip/doc/topology.rst delete mode 100644 3rdparty/quip/doc/totalenergy2.png delete mode 100644 3rdparty/quip/doc/tutorial.rst delete mode 100644 3rdparty/quip/doc/tutorials.rst delete mode 100644 3rdparty/quip/doc/units.rst delete mode 100644 3rdparty/quip/doc/util.rst delete mode 100644 3rdparty/quip/doc/video.py delete mode 100644 3rdparty/quip/doc/visualisation.rst delete mode 100644 3rdparty/quip/quippy/KIND_MAP delete mode 100644 3rdparty/quip/quippy/Makefile delete mode 100644 3rdparty/quip/quippy/README delete mode 100644 3rdparty/quip/quippy/STRING_LENGTHS delete mode 100644 3rdparty/quip/quippy/doc_plugin.py delete mode 100755 3rdparty/quip/quippy/fix_headers delete mode 100644 3rdparty/quip/quippy/init.py delete mode 100644 3rdparty/quip/quippy/quippy/convert.py delete mode 100644 3rdparty/quip/quippy/quippy/descriptors.py delete mode 100644 3rdparty/quip/quippy/quippy/dynamicalsystem.py delete mode 100644 3rdparty/quip/quippy/quippy/potential.py delete mode 100644 3rdparty/quip/quippy/requirements.txt delete mode 100644 3rdparty/quip/quippy/setup.py delete mode 100755 3rdparty/quip/share/Parameters/concat_quip_params delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.BKS.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.BOP.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.Brenner.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.Brenner_2002.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.Brenner_Screened.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.Coulomb.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.DispTS.CH-example.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.EAM_ErcolAd.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.Einstein.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.FB.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.FC.filled_FSM_cf.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.FS.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.Glue.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.Glue_CaCd.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.LJ.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.Morse.CoSb3_CompMatSci_44.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.SW.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.SW_SiC_CASTEP_elastic.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.SW_SiC_DFTB_elastic.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.SW_Si_H_DFTB_elastic.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.SW_VP.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.Si_MEAM.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.Sutton_Chen.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.TS.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.Template.xml delete mode 100644 3rdparty/quip/share/Parameters/ip.parms.Tersoff.xml delete mode 100644 3rdparty/quip/share/Parameters/k_pt_mesh.data.xml delete mode 100644 3rdparty/quip/share/Parameters/self_consistency.data.xml delete mode 100644 3rdparty/quip/share/Parameters/tightbind.parms.Bowler.xml delete mode 100644 3rdparty/quip/share/Parameters/tightbind.parms.GSP.BOP0.xml delete mode 100644 3rdparty/quip/share/Parameters/tightbind.parms.NRL_TB.Al_PRB_61.xml delete mode 100644 3rdparty/quip/share/Parameters/tightbind.parms.NRL_TB.CuAu.xml delete mode 100644 3rdparty/quip/share/Parameters/tightbind.parms.NRL_TB.Cu_unpub99.xml delete mode 100644 3rdparty/quip/share/Parameters/tightbind.parms.NRL_TB.Fe_paramag.xml delete mode 100644 3rdparty/quip/share/Parameters/tightbind.parms.NRL_TB.Fe_spinpol.xml delete mode 100644 3rdparty/quip/share/Parameters/tightbind.parms.NRL_TB.Mo.xml delete mode 100644 3rdparty/quip/share/Parameters/tightbind.parms.NRL_TB.Pb.xml delete mode 100644 3rdparty/quip/share/Parameters/tightbind.parms.NRL_TB.Si.xml delete mode 100644 3rdparty/quip/share/Parameters/tightbind.parms.NRL_TB.Ti_PRB_73.xml delete mode 100644 3rdparty/quip/share/Parameters/tightbind.parms.NRL_TB.W.xml delete mode 100644 3rdparty/quip/share/Parameters/tightbind.parms.NRL_TB.W_new.xml delete mode 100644 3rdparty/quip/share/Structures/Makefile delete mode 100644 3rdparty/quip/share/Structures/NaCl.xyz delete mode 100644 3rdparty/quip/share/Structures/bcc.xyz delete mode 100644 3rdparty/quip/share/Structures/bcc_sc.xyz delete mode 100644 3rdparty/quip/share/Structures/beta_Sn.xyz delete mode 100644 3rdparty/quip/share/Structures/dia.xyz delete mode 100644 3rdparty/quip/share/Structures/dia_sc.xyz delete mode 100644 3rdparty/quip/share/Structures/fcc.xyz delete mode 100644 3rdparty/quip/share/Structures/fcc_100.xyz delete mode 100644 3rdparty/quip/share/Structures/fcc_110.xyz delete mode 100644 3rdparty/quip/share/Structures/fcc_111.xyz delete mode 100644 3rdparty/quip/share/Structures/fcc_111_rect.xyz delete mode 100644 3rdparty/quip/share/Structures/fcc_sc.xyz delete mode 100644 3rdparty/quip/share/Structures/hcp.xyz delete mode 100755 3rdparty/quip/share/Structures/hcp_ortho.xyz delete mode 100644 3rdparty/quip/share/Structures/sc.xyz delete mode 100644 3rdparty/quip/share/Structures/sh.xyz delete mode 100644 3rdparty/quip/share/Structures/skutterudite_filled.xyz delete mode 100644 3rdparty/quip/share/Structures/skutterudite_filled_sc.xyz delete mode 100644 3rdparty/quip/share/Structures/skutterudite_unfilled.xyz delete mode 100644 3rdparty/quip/share/Structures/skutterudite_unfilled_cubic.xyz delete mode 100644 3rdparty/quip/share/Structures/trigonal.xyz delete mode 100644 3rdparty/quip/share/Structures/zinc_blende.xyz delete mode 100644 3rdparty/quip/src/FilePot_drivers/Makefile delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_driver/castep_driver.py delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_driver/castep_driver.sh delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_driver/dummy_castep.py delete mode 100644 3rdparty/quip/src/FilePot_drivers/castep_driver/example.cell delete mode 100644 3rdparty/quip/src/FilePot_drivers/castep_driver/example.param delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_driver/split_castep_log delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_server/client/cghost_tcm delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_server/client/ckill delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_server/client/ckill_tcm delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_server/client/cqstat delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_server/client/cqstat_tcm delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_server/client/crun delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_server/client/crun_tcm delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_server/client/csub delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_server/client/csub_tcm delete mode 100644 3rdparty/quip/src/FilePot_drivers/castep_server/etc/cs_active delete mode 100644 3rdparty/quip/src/FilePot_drivers/castep_server/etc/cs_config delete mode 100644 3rdparty/quip/src/FilePot_drivers/castep_server/etc/cs_hosts delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_server/server/castep_server delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_server/server/get_job_status delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_server/server/get_new_job_id delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_server/server/qdel delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_server/server/qstat delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_server/server/qstat.awk delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_server/server/qsub delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_server/server/qsubw delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_server/server/species_count delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_server/server/status delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_server/server/stop delete mode 100755 3rdparty/quip/src/FilePot_drivers/castep_server/server/submit delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver.f95 delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/BASIS_SET delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/H2O32_300K.xyz delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/MM_POTENTIAL delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/POTENTIAL delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/README delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/aala.xyz delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/all_res.CHARMM.lib delete mode 100755 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/force_diff delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_big_qm/BASIS_SET delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_big_qm/POTENTIAL delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_big_qm/cp2k_input.inp delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_big_qm/job.benchmark.qmmm_big.sge delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_big_qm/out.bench_mana.gfortran.16p delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_big_qm/out.bench_mana.gfortran.32p delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_big_qm/out.bench_mana.intel.16p delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_big_qm/out.bench_mana.intel.32p delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_big_qm/quip-frc-1.xyz.bench_mana.gfortran.16p delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_big_qm/quip-frc-1.xyz.bench_mana.gfortran.32p delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_big_qm/quip-frc-1.xyz.bench_mana.intel.16p delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_big_qm/quip-frc-1.xyz.bench_mana.intel.32p delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_big_qm/quip.wfn delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_big_qm/quip_cp2k.psf delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_big_qm/quip_cp2k.xyz delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_small_qm/BASIS_SET delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_small_qm/POTENTIAL delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_small_qm/cp2k_input.inp delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_small_qm/job.benchmark.qmmm_small.sge delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_small_qm/quip.wfn delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_small_qm/quip_cp2k.psf delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/qmmm_small_qm/quip_cp2k.xyz delete mode 100755 3rdparty/quip/src/FilePot_drivers/cp2k_driver/benchmark_job/time_diff delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/charmm.pot.nonbonded_1_4_scale delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/charmm.pot.nonbonded_1_4_scale_methyl_chloride delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/charmm.pot.nonbonded_1_4_scale_silica delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/charmm.pot_methyl_chloride delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/charmm.pot_silica delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/cp2k_colvar_restraint_constraint_print.patch delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/cp2k_colvar_restraint_constraint_print_new.patch delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/cp2k_exyz.patch.OUTDATED delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/cp2k_exyz_new.patch delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/cp2k_fft_lib.patch delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/cp2k_input.template delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/cp2k_input.template2 delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/cp2k_input_silica_bks.template delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/cp2k_motion_utils.F.patch delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/cp2k_npt_y_new.patch delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/cp2k_reftraj.patch delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/cp2k_silica.patch delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/cp2k_silica_example.inp delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/cp2k_silica_new.patch delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/cp2k_speed.patch delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/cp2k_speed.patch.outdated delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/cp2k_speed_new.patch delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/cp2k_topology_pdb.F.patch.OUTDATED delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/cp2k_wfn_read.patch delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/diala_zw.xyz delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/examples.sh delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/link.template delete mode 100755 3rdparty/quip/src/FilePot_drivers/cp2k_driver/make_current_diffs delete mode 100755 3rdparty/quip/src/FilePot_drivers/cp2k_driver/patch_cp2k_silica.sh delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/qmlist.dat delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/reference_test_silica.tar.gz delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica/PSF_GENERATION delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica/README delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica/all_res.CHARMM.lib delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica/cp2k_input.template delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica/exyz.CHARMM.xyz delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica/quip_cp2k.psf delete mode 100755 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica/run.sh delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica/silica_water_NVT_new-1.ener delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica/silica_water_NVT_new-1.temp delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica/silica_water_NVT_new-dump-1.pdb delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica/silica_water_NVT_new-dump-1.psf delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica/silica_water_NVT_new-frc-1.xyz delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica/silica_water_NVT_new-frc-1.xyz_ref delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica/silica_water_NVT_new-frc-1.xyz_ref_before2010-04-09 delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica/silica_water_NVT_new-pos-1.xyz delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica/silica_water_NVT_new-vel-1.xyz delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica/silica_water_NVT_new.inp delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica/silica_water_NVT_new.out delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica/silica_water_NVT_new.out_ref delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica/silica_water_NVT_new.out_ref_before2010-04-09 delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica_dopa/README delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica_dopa/charmm.pot_ext delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica_dopa/cp2k.inp delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica_dopa/cp2k.out_ref delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica_dopa/dopa_A_water_quartz.psf delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica_dopa/dopa_A_water_quartz.xyz delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica_dopa/nvt-frc-1.xyz_ref delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica_dopa/restart.rst delete mode 100755 3rdparty/quip/src/FilePot_drivers/cp2k_driver/silica_benchmark/reference_test_silica_dopa/run.sh delete mode 100755 3rdparty/quip/src/FilePot_drivers/cp2k_driver/top_all22_prot_cmap.inp delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver_module.f95 delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_driver_old.f95 delete mode 100644 3rdparty/quip/src/FilePot_drivers/cp2k_filepot_old.f95 delete mode 100644 3rdparty/quip/src/FilePot_drivers/dbop_driver.sh delete mode 100755 3rdparty/quip/src/FilePot_drivers/dl_poly_driver.sh delete mode 100644 3rdparty/quip/src/FilePot_drivers/evb_driver.f95 delete mode 100755 3rdparty/quip/src/FilePot_drivers/molpro_driver.sh delete mode 100644 3rdparty/quip/src/FilePot_drivers/profess_driver/profess.inpt.template delete mode 100644 3rdparty/quip/src/FilePot_drivers/profess_driver/profess.ion.template delete mode 100755 3rdparty/quip/src/FilePot_drivers/profess_driver/profess_driver.py delete mode 100644 3rdparty/quip/src/FilePot_drivers/vasp_driver.f95 delete mode 100644 3rdparty/quip/src/FilePot_drivers/vasp_driver/patch.REFTRAJ.vasp.4.6 delete mode 100644 3rdparty/quip/src/FilePot_drivers/vasp_driver/patch.REFTRAJ.vasp.5.2.12 delete mode 100644 3rdparty/quip/src/FilePot_drivers/vasp_driver/patch.REFTRAJ.vasp.5.lib delete mode 100644 3rdparty/quip/src/Potentials/AdjustablePotential.f95 delete mode 100644 3rdparty/quip/src/Potentials/ApproxFermi.f95 delete mode 100644 3rdparty/quip/src/Potentials/COPYRIGHT delete mode 100644 3rdparty/quip/src/Potentials/CallbackPot.f95 delete mode 100644 3rdparty/quip/src/Potentials/ElectrostaticEmbed.f95 delete mode 100644 3rdparty/quip/src/Potentials/Ewald.f95 delete mode 100644 3rdparty/quip/src/Potentials/FilePot.f95 delete mode 100644 3rdparty/quip/src/Potentials/Functions.f95 delete mode 100644 3rdparty/quip/src/Potentials/IP.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPEwald.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_ASAP.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_BOP.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_BornMayer.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_Brenner.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_Brenner_2002.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_Brenner_Screened.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_CH4.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_ConfiningMonomer.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_Coulomb.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_Custom.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_DispTS.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_EAM_Ercolessi_Adams.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_Einstein.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_FB.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_FC.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_FC4.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_FS.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_FX.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_GAP.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_Glue.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_HFdimer.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_KIM.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_LJ.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_LMTO_TBE.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_LinearSOAP.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_MBD.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_MTP.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_Morse.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_Multipoles.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_PartridgeSchwenke.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_SCME.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_SW.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_SW_VP.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_Si_MEAM.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_Spring.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_Sutton_Chen.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_TS.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_TTM_nF.f90 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_Template.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_Tersoff.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_Tether.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_WaterDimer_Gillan.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_WaterTrimer_Gillan.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_ZBL.f95 delete mode 100644 3rdparty/quip/src/Potentials/IPModel_interface.h delete mode 100644 3rdparty/quip/src/Potentials/Makefile delete mode 100644 3rdparty/quip/src/Potentials/Matrix.f95 delete mode 100644 3rdparty/quip/src/Potentials/Multipole_Interactions.f95 delete mode 100644 3rdparty/quip/src/Potentials/Multipoles.f95 delete mode 100644 3rdparty/quip/src/Potentials/Partridge_Schwenke_Dipole.f95 delete mode 100644 3rdparty/quip/src/Potentials/Potential.f95 delete mode 100644 3rdparty/quip/src/Potentials/Potential_Cluster_header.f95 delete mode 100644 3rdparty/quip/src/Potentials/Potential_Cluster_routines.f95 delete mode 100644 3rdparty/quip/src/Potentials/Potential_EVB_header.f95 delete mode 100644 3rdparty/quip/src/Potentials/Potential_EVB_routines.f95 delete mode 100644 3rdparty/quip/src/Potentials/Potential_ForceMixing_header.f95 delete mode 100644 3rdparty/quip/src/Potentials/Potential_ForceMixing_routines.f95 delete mode 100644 3rdparty/quip/src/Potentials/Potential_Hybrid_utils.f95 delete mode 100644 3rdparty/quip/src/Potentials/Potential_Local_E_Mix_header.f95 delete mode 100644 3rdparty/quip/src/Potentials/Potential_Local_E_Mix_routines.f95 delete mode 100644 3rdparty/quip/src/Potentials/Potential_ONIOM_header.f95 delete mode 100644 3rdparty/quip/src/Potentials/Potential_ONIOM_routines.f95 delete mode 100644 3rdparty/quip/src/Potentials/Potential_Precon_Minim.f95 delete mode 100644 3rdparty/quip/src/Potentials/Potential_Sum_header.f95 delete mode 100644 3rdparty/quip/src/Potentials/Potential_Sum_routines.f95 delete mode 100644 3rdparty/quip/src/Potentials/Potential_simple.f95 delete mode 100644 3rdparty/quip/src/Potentials/QC_QUIP_Wrapper.f95 delete mode 100644 3rdparty/quip/src/Potentials/QUIP_Common.f95 delete mode 100644 3rdparty/quip/src/Potentials/QUIP_module.f95 delete mode 100644 3rdparty/quip/src/Potentials/README delete mode 100644 3rdparty/quip/src/Potentials/RS_SparseMatrix.f95 delete mode 100644 3rdparty/quip/src/Potentials/SK_SO_vogl.h delete mode 100644 3rdparty/quip/src/Potentials/SK_vogl.h delete mode 100644 3rdparty/quip/src/Potentials/SKd_vogl.h delete mode 100644 3rdparty/quip/src/Potentials/ScaLAPACK.f95 delete mode 100644 3rdparty/quip/src/Potentials/SocketPot.f95 delete mode 100644 3rdparty/quip/src/Potentials/TB.f95 delete mode 100644 3rdparty/quip/src/Potentials/TBMatrix.f95 delete mode 100644 3rdparty/quip/src/Potentials/TBModel.f95 delete mode 100644 3rdparty/quip/src/Potentials/TBModel_Bowler.f95 delete mode 100644 3rdparty/quip/src/Potentials/TBModel_DFTB.f95 delete mode 100644 3rdparty/quip/src/Potentials/TBModel_GSP.f95 delete mode 100644 3rdparty/quip/src/Potentials/TBModel_NRL_TB.f95 delete mode 100644 3rdparty/quip/src/Potentials/TBModel_NRL_TB_defs.f95 delete mode 100644 3rdparty/quip/src/Potentials/TBModel_interface.h delete mode 100644 3rdparty/quip/src/Potentials/TBSystem.f95 delete mode 100644 3rdparty/quip/src/Potentials/TB_Common.f95 delete mode 100644 3rdparty/quip/src/Potentials/TB_GreensFunctions.f95 delete mode 100644 3rdparty/quip/src/Potentials/TB_Kpoints.f95 delete mode 100644 3rdparty/quip/src/Potentials/TB_Mixing.f95 delete mode 100644 3rdparty/quip/src/Potentials/TO_DO delete mode 100644 3rdparty/quip/src/Potentials/Yukawa.f95 delete mode 100644 3rdparty/quip/src/Potentials/error.inc delete mode 100644 3rdparty/quip/src/Potentials/ginted.f delete mode 100644 3rdparty/quip/src/Potentials/intro.tex delete mode 100644 3rdparty/quip/src/Potentials/quip_lammps_wrapper.f95 delete mode 100644 3rdparty/quip/src/Potentials/quip_unified_wrapper.f95 delete mode 100644 3rdparty/quip/src/Programs/Constraints_Demo.f95 delete mode 100644 3rdparty/quip/src/Programs/DFTB_to_xml.f95 delete mode 100644 3rdparty/quip/src/Programs/Examples/README delete mode 100644 3rdparty/quip/src/Programs/Examples/cxyzreader.f95 delete mode 100644 3rdparty/quip/src/Programs/Examples/domdecomp_example.f95 delete mode 100644 3rdparty/quip/src/Programs/Examples/lj_example.f95 delete mode 100644 3rdparty/quip/src/Programs/Examples/lotf_metapot.f95 delete mode 100644 3rdparty/quip/src/Programs/Examples/lotf_time.f95 delete mode 100644 3rdparty/quip/src/Programs/Examples/lotf_time_metapot.f95 delete mode 100644 3rdparty/quip/src/Programs/Examples/lotfpc_metapot.f95 delete mode 100644 3rdparty/quip/src/Programs/Examples/md.xyz delete mode 100644 3rdparty/quip/src/Programs/Examples/md_example.f95 delete mode 100644 3rdparty/quip/src/Programs/FC_to_xml.f95 delete mode 100644 3rdparty/quip/src/Programs/GF_SC_notes.tex delete mode 100644 3rdparty/quip/src/Programs/Makefile delete mode 100644 3rdparty/quip/src/Programs/NRL_TB_to_xml.f95 delete mode 100644 3rdparty/quip/src/Programs/QMMM_md_buf.f95 delete mode 100644 3rdparty/quip/src/Programs/README delete mode 100644 3rdparty/quip/src/Programs/SC_notes.tex delete mode 100644 3rdparty/quip/src/Programs/TO_DO delete mode 100644 3rdparty/quip/src/Programs/align.f95 delete mode 100644 3rdparty/quip/src/Programs/analytical_free_E_UI.f95 delete mode 100644 3rdparty/quip/src/Programs/analyze_md_phonons.f95 delete mode 100644 3rdparty/quip/src/Programs/basin_exploration.f95 delete mode 100644 3rdparty/quip/src/Programs/bulktest.f95 delete mode 100644 3rdparty/quip/src/Programs/calc_n_poles.f95 delete mode 100644 3rdparty/quip/src/Programs/callback_test.f95 delete mode 100644 3rdparty/quip/src/Programs/crack.f95 delete mode 100644 3rdparty/quip/src/Programs/crack.xml delete mode 100644 3rdparty/quip/src/Programs/crackdoc/Makefile delete mode 100644 3rdparty/quip/src/Programs/crackdoc/flow-chart.eps delete mode 100644 3rdparty/quip/src/Programs/crackdoc/loading.eps delete mode 100644 3rdparty/quip/src/Programs/crackdoc/qm-selection-crack.eps delete mode 100644 3rdparty/quip/src/Programs/create_hybrid_cluster.f95 delete mode 100644 3rdparty/quip/src/Programs/descriptors_wrapper_example.f95 delete mode 100755 3rdparty/quip/src/Programs/eval_server.sh delete mode 100644 3rdparty/quip/src/Programs/fgp.f95 delete mode 100644 3rdparty/quip/src/Programs/fix_traj_latest.f95 delete mode 100755 3rdparty/quip/src/Programs/kp_mesh.py delete mode 100644 3rdparty/quip/src/Programs/local_E_fd.f95 delete mode 100644 3rdparty/quip/src/Programs/local_random_search.f95 delete mode 100644 3rdparty/quip/src/Programs/lotf_params.xml delete mode 100644 3rdparty/quip/src/Programs/mark_hybrid.f95 delete mode 100644 3rdparty/quip/src/Programs/md.f95 delete mode 100644 3rdparty/quip/src/Programs/md_gid.f95 delete mode 100644 3rdparty/quip/src/Programs/metapot_test.f95 delete mode 100644 3rdparty/quip/src/Programs/order_atoms_as_molecules.f95 delete mode 100644 3rdparty/quip/src/Programs/parallel_io_test.f95 delete mode 100644 3rdparty/quip/src/Programs/quip.f95 delete mode 100644 3rdparty/quip/src/Programs/quip_wrapper_example.f95 delete mode 100644 3rdparty/quip/src/Programs/quip_wrapper_simple_example.f95 delete mode 100644 3rdparty/quip/src/Programs/quip_wrapper_simple_example_C.c delete mode 100644 3rdparty/quip/src/Programs/randomise_calc.f95 delete mode 100644 3rdparty/quip/src/Programs/rotate.f95 delete mode 100644 3rdparty/quip/src/Programs/slice_sample.f95 delete mode 100644 3rdparty/quip/src/Programs/socktest.f95 delete mode 100644 3rdparty/quip/src/Programs/socktest2.f95 delete mode 100644 3rdparty/quip/src/Programs/tabletest.f95 delete mode 100644 3rdparty/quip/src/Programs/test_CASTEP_MM_buffer_crack.f95 delete mode 100644 3rdparty/quip/src/Programs/test_CASTEP_water_bulk.f95 delete mode 100644 3rdparty/quip/src/Programs/test_CASTEP_water_chain.f95 delete mode 100644 3rdparty/quip/src/Programs/test_cova.f95 delete mode 100644 3rdparty/quip/src/Programs/test_dimer.f95 delete mode 100644 3rdparty/quip/src/Programs/ts_calculation.f95 delete mode 100644 3rdparty/quip/src/Programs/vacancy_map.f95 delete mode 100644 3rdparty/quip/src/Programs/vacancy_map_forcemix_relax.f95 delete mode 100644 3rdparty/quip/src/Programs/vacancy_map_hybrid_generate.f95 delete mode 100644 3rdparty/quip/src/Programs/vacancy_map_hybrid_relax.f95 delete mode 100644 3rdparty/quip/src/Programs/vacancy_map_mod.f95 delete mode 100644 3rdparty/quip/src/Programs/water_dimer_mayer.f95 delete mode 100644 3rdparty/quip/src/Programs/water_dimer_mc.f95 delete mode 100644 3rdparty/quip/src/Programs/wrap.f95 delete mode 100644 3rdparty/quip/src/Programs/xyz_to_SPECSYM_forces.f95 delete mode 100644 3rdparty/quip/src/Programs/xyz_to_SPECSYM_start.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/Makefile delete mode 100644 3rdparty/quip/src/Structure_processors/UI_integrate.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/angle_distr.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/clean_traj.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/convert.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/coordination_number.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/decimate.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/density.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/density_1d.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/density_KDE.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/density_new.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/diffusion.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/elastic_fields.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/extract_EVB.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/extract_cv.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/file_rewrite.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/find_space_minim.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/histogram_process.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/make_bulk_supercell.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/make_k_mesh.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/make_surface_slab_vasp.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/mean_var_correl.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/mean_var_decorrelated_err.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/merge_traj.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/move_displacement_field.f95 delete mode 100755 3rdparty/quip/src/Structure_processors/msd_vibrations.f95 delete mode 100755 3rdparty/quip/src/Structure_processors/nc2movie delete mode 100644 3rdparty/quip/src/Structure_processors/rdfd.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/rings.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/solvate.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/solvate_silica.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/structure_analysis_traj.f95 delete mode 100755 3rdparty/quip/src/Structure_processors/temperature_by_kind delete mode 100755 3rdparty/quip/src/Structure_processors/test_ran.f95 delete mode 100755 3rdparty/quip/src/Structure_processors/vel_power_spectrum delete mode 100755 3rdparty/quip/src/Structure_processors/xyz2ecfg.awk delete mode 100755 3rdparty/quip/src/Structure_processors/xyz2movie delete mode 100644 3rdparty/quip/src/Structure_processors/xyz2pdb.f95 delete mode 100644 3rdparty/quip/src/Structure_processors/xyz2residue_library.f95 delete mode 100644 3rdparty/quip/src/Utils/Makefile delete mode 100644 3rdparty/quip/src/Utils/crackparams.f95 delete mode 100644 3rdparty/quip/src/Utils/cracktools.f95 delete mode 100644 3rdparty/quip/src/Utils/elasticity.f95 delete mode 100644 3rdparty/quip/src/Utils/force_machine_learning_module.f95 delete mode 100644 3rdparty/quip/src/Utils/phonons.f95 delete mode 100644 3rdparty/quip/src/Utils/real_space_covariance.f95 delete mode 100644 3rdparty/quip/src/Utils/restraints_constraints_xml.f95 delete mode 100644 3rdparty/quip/src/Utils/structure_analysis_traj_routines.f95 delete mode 100644 3rdparty/quip/src/Utils/transition_state.f95 delete mode 100644 3rdparty/quip/src/Utils/ts_params.f95 delete mode 100644 3rdparty/quip/src/f90wrap/LICENSE delete mode 100644 3rdparty/quip/src/f90wrap/README.md delete mode 100644 3rdparty/quip/src/f90wrap/docs/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/docs/api.rst delete mode 100644 3rdparty/quip/src/f90wrap/docs/apidocs/f90wrap.codegen.rst delete mode 100644 3rdparty/quip/src/f90wrap/docs/apidocs/f90wrap.f90wrapgen.rst delete mode 100644 3rdparty/quip/src/f90wrap/docs/apidocs/f90wrap.fortran.rst delete mode 100644 3rdparty/quip/src/f90wrap/docs/apidocs/f90wrap.fortrantype.rst delete mode 100644 3rdparty/quip/src/f90wrap/docs/apidocs/f90wrap.latex.rst delete mode 100644 3rdparty/quip/src/f90wrap/docs/apidocs/f90wrap.parser.rst delete mode 100644 3rdparty/quip/src/f90wrap/docs/apidocs/f90wrap.pywrapgen.rst delete mode 100644 3rdparty/quip/src/f90wrap/docs/apidocs/f90wrap.rst delete mode 100644 3rdparty/quip/src/f90wrap/docs/apidocs/f90wrap.transform.rst delete mode 100644 3rdparty/quip/src/f90wrap/docs/apidocs/modules.rst delete mode 100644 3rdparty/quip/src/f90wrap/docs/conf.py delete mode 100644 3rdparty/quip/src/f90wrap/docs/index.rst delete mode 100644 3rdparty/quip/src/f90wrap/docs/tutorials/WCPM_logo_text.png delete mode 100644 3rdparty/quip/src/f90wrap/docs/tutorials/ase-calculators.png delete mode 100644 3rdparty/quip/src/f90wrap/docs/tutorials/boron-crack-100dpi.png delete mode 100644 3rdparty/quip/src/f90wrap/docs/tutorials/f90wrap-demo-feb-2020.ipynb delete mode 100644 3rdparty/quip/src/f90wrap/docs/tutorials/f90wrap.png delete mode 100644 3rdparty/quip/src/f90wrap/docs/tutorials/kermode-csc-warwick-nov-2015.ipynb delete mode 100644 3rdparty/quip/src/f90wrap/docs/tutorials/multiscale.png delete mode 100644 3rdparty/quip/src/f90wrap/docs/tutorials/scipy-stack.png delete mode 100644 3rdparty/quip/src/f90wrap/docs/tutorials/warwick-logo.png delete mode 100644 3rdparty/quip/src/f90wrap/docs/usage.rst delete mode 100644 3rdparty/quip/src/f90wrap/examples/CMakeLists.txt delete mode 100644 3rdparty/quip/src/f90wrap/examples/Makefile delete mode 100755 3rdparty/quip/src/f90wrap/examples/arrayderivedtypes/Makefile delete mode 100755 3rdparty/quip/src/f90wrap/examples/arrayderivedtypes/kind_map delete mode 100644 3rdparty/quip/src/f90wrap/examples/arrayderivedtypes/test.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/arrayderivedtypes/tests.py delete mode 100755 3rdparty/quip/src/f90wrap/examples/arrays/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/arrays/README.md delete mode 100755 3rdparty/quip/src/f90wrap/examples/arrays/kind_map delete mode 100644 3rdparty/quip/src/f90wrap/examples/arrays/library.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/arrays/memory_profile.py delete mode 100644 3rdparty/quip/src/f90wrap/examples/arrays/parameters.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/arrays/tests.py delete mode 100755 3rdparty/quip/src/f90wrap/examples/arrays_fixed/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/arrays_fixed/README.md delete mode 100755 3rdparty/quip/src/f90wrap/examples/arrays_fixed/kind_map delete mode 100644 3rdparty/quip/src/f90wrap/examples/arrays_fixed/library.f delete mode 100644 3rdparty/quip/src/f90wrap/examples/arrays_fixed/memory_profile.py delete mode 100644 3rdparty/quip/src/f90wrap/examples/arrays_fixed/parameters.f delete mode 100644 3rdparty/quip/src/f90wrap/examples/arrays_fixed/tests.py delete mode 100755 3rdparty/quip/src/f90wrap/examples/arrays_in_derived_types_issue50/Makefile delete mode 100755 3rdparty/quip/src/f90wrap/examples/arrays_in_derived_types_issue50/kind_map delete mode 100644 3rdparty/quip/src/f90wrap/examples/arrays_in_derived_types_issue50/test.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/arrays_in_derived_types_issue50/tests.py delete mode 100755 3rdparty/quip/src/f90wrap/examples/callback_print_function_issue93/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/callback_print_function_issue93/README.md delete mode 100644 3rdparty/quip/src/f90wrap/examples/callback_print_function_issue93/callback_print_output_python.ipynb delete mode 100644 3rdparty/quip/src/f90wrap/examples/callback_print_function_issue93/caller.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/callback_print_function_issue93/cback.f90 delete mode 100755 3rdparty/quip/src/f90wrap/examples/callback_print_function_issue93/kind_map delete mode 100644 3rdparty/quip/src/f90wrap/examples/callback_print_function_issue93/tests.py delete mode 100644 3rdparty/quip/src/f90wrap/examples/cylinder/DNAD.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/cylinder/DNADHeaders.h delete mode 100755 3rdparty/quip/src/f90wrap/examples/cylinder/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/cylinder/README delete mode 100644 3rdparty/quip/src/f90wrap/examples/cylinder/cyldnad.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/cylinder/cylinder.ipynb delete mode 100755 3rdparty/quip/src/f90wrap/examples/cylinder/kind_map delete mode 100644 3rdparty/quip/src/f90wrap/examples/cylinder/tests.py delete mode 100755 3rdparty/quip/src/f90wrap/examples/derived-type-aliases/Makefile delete mode 100755 3rdparty/quip/src/f90wrap/examples/derived-type-aliases/kind_map delete mode 100644 3rdparty/quip/src/f90wrap/examples/derived-type-aliases/mytype_mod.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/derived-type-aliases/othertype_mod.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/derived-type-aliases/tests.py delete mode 100755 3rdparty/quip/src/f90wrap/examples/derivedtypes/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/derivedtypes/README.md delete mode 100644 3rdparty/quip/src/f90wrap/examples/derivedtypes/datatypes.f90 delete mode 100755 3rdparty/quip/src/f90wrap/examples/derivedtypes/kind_map delete mode 100644 3rdparty/quip/src/f90wrap/examples/derivedtypes/library.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/derivedtypes/memory_profile.py delete mode 100644 3rdparty/quip/src/f90wrap/examples/derivedtypes/parameters.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/derivedtypes/tests.py delete mode 120000 3rdparty/quip/src/f90wrap/examples/derivedtypes/tests_pkg.py delete mode 100644 3rdparty/quip/src/f90wrap/examples/elemental/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/elemental/elemental_module.f90 delete mode 100755 3rdparty/quip/src/f90wrap/examples/elemental/kind_map delete mode 100644 3rdparty/quip/src/f90wrap/examples/elemental/test.py delete mode 100755 3rdparty/quip/src/f90wrap/examples/errorbinding/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/errorbinding/README.md delete mode 100644 3rdparty/quip/src/f90wrap/examples/errorbinding/datatypes.f90 delete mode 100755 3rdparty/quip/src/f90wrap/examples/errorbinding/kind_map delete mode 100644 3rdparty/quip/src/f90wrap/examples/errorbinding/parameters.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/example2/ExampleMakefiles/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/example2/ExampleMakefiles/Makefile_py delete mode 100644 3rdparty/quip/src/f90wrap/examples/example2/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/example2/README delete mode 100644 3rdparty/quip/src/f90wrap/examples/example2/Source/BasicDefs/aa0_typelist.F90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/example2/Source/BasicDefs/aa1_modules.F90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/example2/Source/BasicDefs/aa2_defineAllProperties.F90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/example2/Source/BasicDefs/assign_constants.F90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/example2/Source/HeliSrc/set_defaults.F90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/example2/kind_map delete mode 100644 3rdparty/quip/src/f90wrap/examples/example2/test_module.py delete mode 100644 3rdparty/quip/src/f90wrap/examples/example2/test_package.py delete mode 100644 3rdparty/quip/src/f90wrap/examples/extends/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/extends/testextends.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/fixed_1D_derived_type_array_argument/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/fixed_1D_derived_type_array_argument/dummy.file delete mode 100644 3rdparty/quip/src/f90wrap/examples/fixed_1D_derived_type_array_argument/functions.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/fixed_1D_derived_type_array_argument/tests.py delete mode 100644 3rdparty/quip/src/f90wrap/examples/interface/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/interface/README.md delete mode 100644 3rdparty/quip/src/f90wrap/examples/interface/example.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/interface/test.py delete mode 100644 3rdparty/quip/src/f90wrap/examples/interface/test_pkg.py delete mode 100644 3rdparty/quip/src/f90wrap/examples/issue105_function_definition_with_empty_lines/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/issue105_function_definition_with_empty_lines/main.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/issue105_function_definition_with_empty_lines/run.py delete mode 100644 3rdparty/quip/src/f90wrap/examples/issue32/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/issue32/kind_map delete mode 100644 3rdparty/quip/src/f90wrap/examples/issue32/test.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/mockderivetype/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/mockderivetype/Makefile.ifort delete mode 100644 3rdparty/quip/src/f90wrap/examples/mockderivetype/define.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/mockderivetype/fwrap.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/mockderivetype/kind_map delete mode 100644 3rdparty/quip/src/f90wrap/examples/mockderivetype/leveltwomod.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/mockderivetype/readme.rst delete mode 100644 3rdparty/quip/src/f90wrap/examples/mockderivetype/test.py delete mode 100644 3rdparty/quip/src/f90wrap/examples/mockderivetype/testpkg.py delete mode 100644 3rdparty/quip/src/f90wrap/examples/mod_arg_clash/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/mod_arg_clash/test.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/mod_arg_clash/test.py delete mode 100644 3rdparty/quip/src/f90wrap/examples/optional_args_issue53/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/optional_args_issue53/main.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/optional_args_issue53/run.py delete mode 100644 3rdparty/quip/src/f90wrap/examples/optional_derived_arrays/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/optional_derived_arrays/test.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/passbyreference/example_mymodule.py delete mode 100644 3rdparty/quip/src/f90wrap/examples/passbyreference/makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/passbyreference/mycode.F90 delete mode 100755 3rdparty/quip/src/f90wrap/examples/recursive_type/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/recursive_type/README.md delete mode 100755 3rdparty/quip/src/f90wrap/examples/recursive_type/kind_map delete mode 100644 3rdparty/quip/src/f90wrap/examples/recursive_type/tests.py delete mode 100644 3rdparty/quip/src/f90wrap/examples/recursive_type/tree.f90 delete mode 100755 3rdparty/quip/src/f90wrap/examples/recursive_type_array/Makefile delete mode 100755 3rdparty/quip/src/f90wrap/examples/recursive_type_array/kind_map delete mode 100644 3rdparty/quip/src/f90wrap/examples/recursive_type_array/test.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/recursive_type_array/tests.py delete mode 100755 3rdparty/quip/src/f90wrap/examples/strings/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/strings/README.md delete mode 100755 3rdparty/quip/src/f90wrap/examples/strings/kind_map delete mode 100644 3rdparty/quip/src/f90wrap/examples/strings/string_io.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/strings/tests.py delete mode 100755 3rdparty/quip/src/f90wrap/examples/subroutine_args/Makefile delete mode 100755 3rdparty/quip/src/f90wrap/examples/subroutine_args/kind_map delete mode 100644 3rdparty/quip/src/f90wrap/examples/subroutine_args/subroutine_mod.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/subroutine_args/tests.py delete mode 100644 3rdparty/quip/src/f90wrap/examples/subroutine_contains_issue101/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/subroutine_contains_issue101/run.py delete mode 100644 3rdparty/quip/src/f90wrap/examples/subroutine_contains_issue101/test.f90 delete mode 100644 3rdparty/quip/src/f90wrap/examples/type_bn/Makefile delete mode 100644 3rdparty/quip/src/f90wrap/examples/type_bn/README.md delete mode 100644 3rdparty/quip/src/f90wrap/examples/type_bn/test.py delete mode 100644 3rdparty/quip/src/f90wrap/examples/type_bn/type_bn.f90 delete mode 100644 3rdparty/quip/src/f90wrap/f90wrap/__init__.py delete mode 100644 3rdparty/quip/src/f90wrap/f90wrap/arraydatamodule.c delete mode 100644 3rdparty/quip/src/f90wrap/f90wrap/codegen.py delete mode 100644 3rdparty/quip/src/f90wrap/f90wrap/f90wrapgen.py delete mode 100644 3rdparty/quip/src/f90wrap/f90wrap/fortran.py delete mode 100644 3rdparty/quip/src/f90wrap/f90wrap/fortrantype.py delete mode 100644 3rdparty/quip/src/f90wrap/f90wrap/latex.py delete mode 100644 3rdparty/quip/src/f90wrap/f90wrap/parser.py delete mode 100644 3rdparty/quip/src/f90wrap/f90wrap/pywrapgen.py delete mode 100644 3rdparty/quip/src/f90wrap/f90wrap/runtime.py delete mode 100644 3rdparty/quip/src/f90wrap/f90wrap/six.py delete mode 100644 3rdparty/quip/src/f90wrap/f90wrap/sizeoffortran.f90 delete mode 100644 3rdparty/quip/src/f90wrap/f90wrap/transform.py delete mode 100644 3rdparty/quip/src/f90wrap/pyproject.toml delete mode 100644 3rdparty/quip/src/f90wrap/requirements.txt delete mode 100644 3rdparty/quip/src/f90wrap/scripts/f2py-f90wrap delete mode 100644 3rdparty/quip/src/f90wrap/scripts/f90doc delete mode 100644 3rdparty/quip/src/f90wrap/scripts/f90wrap delete mode 100644 3rdparty/quip/src/f90wrap/setup.py delete mode 100644 3rdparty/quip/src/f90wrap/test/.gitignore delete mode 100644 3rdparty/quip/src/f90wrap/test/__init__.py delete mode 100644 3rdparty/quip/src/f90wrap/test/samples/circle.f90 delete mode 100644 3rdparty/quip/src/f90wrap/test/samples/test_circle.f90 delete mode 100644 3rdparty/quip/src/f90wrap/test/test_parser.py delete mode 100644 3rdparty/quip/src/f90wrap/test/test_transform.py delete mode 100644 3rdparty/quip/src/f90wrap/version.txt delete mode 100644 3rdparty/quip/src/fox/CMakeLists.txt delete mode 100644 3rdparty/quip/src/fox/CTestConfig.cmake delete mode 100644 3rdparty/quip/src/fox/Changelog delete mode 100644 3rdparty/quip/src/fox/DoX/AttributeDictionaries.html delete mode 100644 3rdparty/quip/src/fox/DoX/AttributeDictionaries.md delete mode 100644 3rdparty/quip/src/fox/DoX/Compilation.html delete mode 100644 3rdparty/quip/src/fox/DoX/Compilation.md delete mode 100644 3rdparty/quip/src/fox/DoX/Debugging.html delete mode 100644 3rdparty/quip/src/fox/DoX/Debugging.md delete mode 100644 3rdparty/quip/src/fox/DoX/DoX.css delete mode 100644 3rdparty/quip/src/fox/DoX/Embedding.html delete mode 100644 3rdparty/quip/src/fox/DoX/Embedding.md delete mode 100644 3rdparty/quip/src/fox/DoX/FoX.html delete mode 100644 3rdparty/quip/src/fox/DoX/FoX.md delete mode 100644 3rdparty/quip/src/fox/DoX/FoX_DoX.html delete mode 100644 3rdparty/quip/src/fox/DoX/FoX_common.html delete mode 100644 3rdparty/quip/src/fox/DoX/FoX_common.md delete mode 100644 3rdparty/quip/src/fox/DoX/FoX_dom.html delete mode 100644 3rdparty/quip/src/fox/DoX/FoX_dom.md delete mode 100644 3rdparty/quip/src/fox/DoX/FoX_sax.html delete mode 100644 3rdparty/quip/src/fox/DoX/FoX_sax.md delete mode 100644 3rdparty/quip/src/fox/DoX/FoX_utils.html delete mode 100644 3rdparty/quip/src/fox/DoX/FoX_utils.md delete mode 100644 3rdparty/quip/src/fox/DoX/FoX_wcml.html delete mode 100644 3rdparty/quip/src/fox/DoX/FoX_wcml.md delete mode 100644 3rdparty/quip/src/fox/DoX/FoX_wkml.html delete mode 100644 3rdparty/quip/src/fox/DoX/FoX_wkml.md delete mode 100644 3rdparty/quip/src/fox/DoX/FoX_wxml.html delete mode 100644 3rdparty/quip/src/fox/DoX/FoX_wxml.md delete mode 100644 3rdparty/quip/src/fox/DoX/Information.html delete mode 100644 3rdparty/quip/src/fox/DoX/Information.md delete mode 100644 3rdparty/quip/src/fox/DoX/Licensing.html delete mode 100644 3rdparty/quip/src/fox/DoX/Licensing.md delete mode 100644 3rdparty/quip/src/fox/DoX/Standards.html delete mode 100644 3rdparty/quip/src/fox/DoX/Standards.md delete mode 100644 3rdparty/quip/src/fox/DoX/StringConversion.html delete mode 100644 3rdparty/quip/src/fox/DoX/StringConversion.md delete mode 100644 3rdparty/quip/src/fox/DoX/StringFormatting.html delete mode 100644 3rdparty/quip/src/fox/DoX/StringFormatting.md delete mode 100644 3rdparty/quip/src/fox/DoX/Versioning.html delete mode 100644 3rdparty/quip/src/fox/DoX/Versioning.md delete mode 100644 3rdparty/quip/src/fox/DoX/head delete mode 120000 3rdparty/quip/src/fox/DoX/index.html delete mode 100644 3rdparty/quip/src/fox/DoX/makefile delete mode 100644 3rdparty/quip/src/fox/DoX/tail delete mode 100755 3rdparty/quip/src/fox/FoX-config.in delete mode 100644 3rdparty/quip/src/fox/FoX.vfproj delete mode 100644 3rdparty/quip/src/fox/Fox.vfproj.README delete mode 100644 3rdparty/quip/src/fox/LICENSE delete mode 100644 3rdparty/quip/src/fox/Makefile delete mode 100644 3rdparty/quip/src/fox/README delete mode 100644 3rdparty/quip/src/fox/RELEASE delete mode 100644 3rdparty/quip/src/fox/arch.make delete mode 100644 3rdparty/quip/src/fox/arch.make.in delete mode 100644 3rdparty/quip/src/fox/cmake/CMakeLists.txt delete mode 100644 3rdparty/quip/src/fox/cmake/CheckAbortIntrinsic.cmake delete mode 100644 3rdparty/quip/src/fox/cmake/CheckAssociatedBug.cmake delete mode 100644 3rdparty/quip/src/fox/cmake/CheckFlushIntrinsic.cmake delete mode 100644 3rdparty/quip/src/fox/cmake/DetermineEOL.cmake delete mode 100644 3rdparty/quip/src/fox/cmake/Fortran_Have_Flush.cmake delete mode 100644 3rdparty/quip/src/fox/cmake/abort_bare.f90 delete mode 100644 3rdparty/quip/src/fox/cmake/abort_intel.f90 delete mode 100644 3rdparty/quip/src/fox/cmake/abort_nag.f90 delete mode 100644 3rdparty/quip/src/fox/cmake/abort_xlf.f90 delete mode 100644 3rdparty/quip/src/fox/cmake/associated_bug.f90 delete mode 100644 3rdparty/quip/src/fox/cmake/flush_bare.f90 delete mode 100644 3rdparty/quip/src/fox/cmake/flush_nag.f90 delete mode 100644 3rdparty/quip/src/fox/cmake/flush_xlf.f90 delete mode 100644 3rdparty/quip/src/fox/cmake/output_eol.f90 delete mode 100644 3rdparty/quip/src/fox/common/CMakeLists.txt delete mode 100644 3rdparty/quip/src/fox/common/FoX_common.F90 delete mode 100644 3rdparty/quip/src/fox/common/m_common_attrs.F90 delete mode 100644 3rdparty/quip/src/fox/common/m_common_buffer.F90 delete mode 100644 3rdparty/quip/src/fox/common/m_common_charset.F90 delete mode 100644 3rdparty/quip/src/fox/common/m_common_content_model.F90 delete mode 100644 3rdparty/quip/src/fox/common/m_common_element.F90 delete mode 100644 3rdparty/quip/src/fox/common/m_common_elstack.F90 delete mode 100644 3rdparty/quip/src/fox/common/m_common_entities.F90 delete mode 100644 3rdparty/quip/src/fox/common/m_common_entity_expand.F90 delete mode 100644 3rdparty/quip/src/fox/common/m_common_error.F90 delete mode 100644 3rdparty/quip/src/fox/common/m_common_io.F90 delete mode 100644 3rdparty/quip/src/fox/common/m_common_namecheck.F90 delete mode 100644 3rdparty/quip/src/fox/common/m_common_namespaces.F90 delete mode 100644 3rdparty/quip/src/fox/common/m_common_notations.F90 delete mode 100644 3rdparty/quip/src/fox/common/m_common_struct.F90 delete mode 100644 3rdparty/quip/src/fox/common/makefile delete mode 100644 3rdparty/quip/src/fox/common/test/Makefile delete mode 100755 3rdparty/quip/src/fox/common/test/run_tests.sh delete mode 100755 3rdparty/quip/src/fox/common/test/test.sh delete mode 100755 3rdparty/quip/src/fox/common/test/test_common_namecheck.sh delete mode 100644 3rdparty/quip/src/fox/common/test/test_fsys_array_str.f90 delete mode 100644 3rdparty/quip/src/fox/common/test/test_fsys_array_str.out delete mode 100644 3rdparty/quip/src/fox/common/test/test_input.f90 delete mode 100644 3rdparty/quip/src/fox/common/test/test_input.out delete mode 100644 3rdparty/quip/src/fox/common/test/test_str.f90.in delete mode 100755 3rdparty/quip/src/fox/common/test/test_str.sh delete mode 100755 3rdparty/quip/src/fox/common/test/test_xml_namecheck.sh delete mode 100644 3rdparty/quip/src/fox/common/test/test_xml_namecheck_1.f90 delete mode 100644 3rdparty/quip/src/fox/common/test/test_xml_namecheck_1.out delete mode 100644 3rdparty/quip/src/fox/common/test/test_xml_namecheck_10.f90 delete mode 100644 3rdparty/quip/src/fox/common/test/test_xml_namecheck_10.out delete mode 100644 3rdparty/quip/src/fox/common/test/test_xml_namecheck_2.f90 delete mode 100644 3rdparty/quip/src/fox/common/test/test_xml_namecheck_2.out delete mode 100644 3rdparty/quip/src/fox/common/test/test_xml_namecheck_3.f90.fix delete mode 100644 3rdparty/quip/src/fox/common/test/test_xml_namecheck_3.out delete mode 100644 3rdparty/quip/src/fox/common/test/test_xml_namecheck_4.f90 delete mode 100644 3rdparty/quip/src/fox/common/test/test_xml_namecheck_4.out delete mode 100644 3rdparty/quip/src/fox/common/test/test_xml_namecheck_5.f90 delete mode 100644 3rdparty/quip/src/fox/common/test/test_xml_namecheck_5.out delete mode 100644 3rdparty/quip/src/fox/common/test/test_xml_namecheck_6.f90 delete mode 100644 3rdparty/quip/src/fox/common/test/test_xml_namecheck_6.out delete mode 100644 3rdparty/quip/src/fox/common/test/test_xml_namecheck_7.f90 delete mode 100644 3rdparty/quip/src/fox/common/test/test_xml_namecheck_7.out delete mode 100644 3rdparty/quip/src/fox/common/test/test_xml_namecheck_8.f90 delete mode 100644 3rdparty/quip/src/fox/common/test/test_xml_namecheck_8.out delete mode 100644 3rdparty/quip/src/fox/common/test/test_xml_namecheck_9.f90 delete mode 100644 3rdparty/quip/src/fox/common/test/test_xml_namecheck_9.out delete mode 100644 3rdparty/quip/src/fox/config/aclocal.m4 delete mode 100755 3rdparty/quip/src/fox/config/config.guess delete mode 100755 3rdparty/quip/src/fox/config/config.sub delete mode 100644 3rdparty/quip/src/fox/config/configure.ac delete mode 100755 3rdparty/quip/src/fox/config/install-sh delete mode 100644 3rdparty/quip/src/fox/config/m4/TW_CHECK_ASSOCIATED_BUG.m4 delete mode 100644 3rdparty/quip/src/fox/config/m4/TW_CHECK_FC_90.m4 delete mode 100644 3rdparty/quip/src/fox/config/m4/TW_CHECK_FC_95.m4 delete mode 100644 3rdparty/quip/src/fox/config/m4/TW_CHECK_FC_FPP.m4 delete mode 100644 3rdparty/quip/src/fox/config/m4/TW_CHECK_FC_FPP_90.m4 delete mode 100644 3rdparty/quip/src/fox/config/m4/TW_CHECK_FC_TR15580.m4 delete mode 100644 3rdparty/quip/src/fox/config/m4/TW_CHECK_FC_TR15581.m4 delete mode 100644 3rdparty/quip/src/fox/config/m4/TW_FC_CHECK_ABORT.m4 delete mode 100644 3rdparty/quip/src/fox/config/m4/TW_FC_CHECK_EOL.m4 delete mode 100644 3rdparty/quip/src/fox/config/m4/TW_FC_CHECK_FLUSH.m4 delete mode 100644 3rdparty/quip/src/fox/config/m4/TW_FC_ID.m4 delete mode 100644 3rdparty/quip/src/fox/config/m4/TW_FC_ID_FLAGS.m4 delete mode 100644 3rdparty/quip/src/fox/config/m4/TW_FC_KINDS.m4 delete mode 100644 3rdparty/quip/src/fox/config/m4/TW_PATH_NETCDF.m4 delete mode 100644 3rdparty/quip/src/fox/config/m4/TW_PROG_CYGPATH_W.m4 delete mode 100644 3rdparty/quip/src/fox/config/m4/fortran.m4 delete mode 100644 3rdparty/quip/src/fox/config/m4/lang.m4 delete mode 100644 3rdparty/quip/src/fox/config/makefile delete mode 100755 3rdparty/quip/src/fox/configure delete mode 100644 3rdparty/quip/src/fox/dom/CMakeLists.txt delete mode 100644 3rdparty/quip/src/fox/dom/FoX_dom.f90 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_attribute.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_character_data.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_common.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_configuration.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_document.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_document_type.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_dom.F90 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_dom.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_element.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_entity.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_error.f90 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_exception.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_extras.F90 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_extras.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_implementation.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_namednodemap.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_namespaces.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_node.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_nodelist.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_object.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_parse.f90 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_parse.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_processing_instruction.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_text.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_treewalk.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_types.m4 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_utils.f90 delete mode 100644 3rdparty/quip/src/fox/dom/m_dom_utils.m4 delete mode 100644 3rdparty/quip/src/fox/dom/makefile delete mode 100644 3rdparty/quip/src/fox/dom/test/Makefile delete mode 100755 3rdparty/quip/src/fox/dom/test/run_tests.sh delete mode 100755 3rdparty/quip/src/fox/dom/test/test.sh delete mode 100755 3rdparty/quip/src/fox/dom/test/test_dom_getTextContent.sh delete mode 100644 3rdparty/quip/src/fox/dom/test/test_dom_getTextContent_1.f90 delete mode 100644 3rdparty/quip/src/fox/dom/test/test_dom_getTextContent_1.out delete mode 100644 3rdparty/quip/src/fox/dom/test/test_dom_getTextContent_1.xml_in delete mode 100644 3rdparty/quip/src/fox/dom/test/test_dom_getTextContent_2.f90 delete mode 100644 3rdparty/quip/src/fox/dom/test/test_dom_getTextContent_2.out delete mode 100644 3rdparty/quip/src/fox/dom/test/test_dom_getTextContent_2.xml_in delete mode 100644 3rdparty/quip/src/fox/dom/test/test_dom_getTextContent_3.f90 delete mode 100644 3rdparty/quip/src/fox/dom/test/test_dom_getTextContent_3.out delete mode 100644 3rdparty/quip/src/fox/dom/test/test_dom_getTextContent_3.xml_in delete mode 100644 3rdparty/quip/src/fox/dom/test/test_dom_getTextContent_4.f90 delete mode 100644 3rdparty/quip/src/fox/dom/test/test_dom_getTextContent_4.out delete mode 100644 3rdparty/quip/src/fox/dom/test/test_dom_getTextContent_4.xml_in delete mode 100644 3rdparty/quip/src/fox/dom/test/test_dom_getTextContent_5.f90 delete mode 100644 3rdparty/quip/src/fox/dom/test/test_dom_getTextContent_5.out delete mode 100644 3rdparty/quip/src/fox/dom/test/test_dom_getTextContent_5.xml_in delete mode 100755 3rdparty/quip/src/fox/dom/test/test_dom_parseString.sh delete mode 100644 3rdparty/quip/src/fox/dom/test/test_dom_parseString_1.f90 delete mode 100644 3rdparty/quip/src/fox/dom/test/test_dom_parseString_1.out delete mode 100755 3rdparty/quip/src/fox/dom/test/test_dom_serialize.sh delete mode 100644 3rdparty/quip/src/fox/dom/test/test_dom_serialize_1.f90 delete mode 100644 3rdparty/quip/src/fox/dom/test/test_dom_serialize_1.xml delete mode 100644 3rdparty/quip/src/fox/dom/test/test_dom_serialize_2.f90 delete mode 100644 3rdparty/quip/src/fox/dom/test/test_dom_serialize_2.xml delete mode 100644 3rdparty/quip/src/fox/examples/CMakeLists.txt delete mode 100644 3rdparty/quip/src/fox/examples/Makefile delete mode 100644 3rdparty/quip/src/fox/examples/dom_canonicalize.ns.no.f90 delete mode 100644 3rdparty/quip/src/fox/examples/dom_canonicalize.ns.yes.f90 delete mode 100644 3rdparty/quip/src/fox/examples/dom_configuration.f90 delete mode 100644 3rdparty/quip/src/fox/examples/dom_example_2.f90 delete mode 100644 3rdparty/quip/src/fox/examples/dom_example_3.f90 delete mode 100644 3rdparty/quip/src/fox/examples/h2o.xml delete mode 100644 3rdparty/quip/src/fox/examples/sax_example.f90 delete mode 100644 3rdparty/quip/src/fox/examples/sax_example_2.f90 delete mode 100644 3rdparty/quip/src/fox/examples/staffNS.dtd delete mode 100644 3rdparty/quip/src/fox/examples/staffNS.xml delete mode 100644 3rdparty/quip/src/fox/examples/wcml_example.f90 delete mode 100644 3rdparty/quip/src/fox/examples/wkml_example.f90 delete mode 100644 3rdparty/quip/src/fox/examples/wkml_example_2.f90 delete mode 100644 3rdparty/quip/src/fox/examples/wkml_example_input.txt delete mode 100644 3rdparty/quip/src/fox/examples/wxml_example.f90 delete mode 100644 3rdparty/quip/src/fox/examples/xml_output_module.f90 delete mode 100644 3rdparty/quip/src/fox/examples/xml_output_program.f90 delete mode 100644 3rdparty/quip/src/fox/fsys/CMakeLists.txt delete mode 100644 3rdparty/quip/src/fox/fsys/fox_m_fsys_abort_flush.F90 delete mode 100644 3rdparty/quip/src/fox/fsys/fox_m_fsys_array_str.F90 delete mode 100644 3rdparty/quip/src/fox/fsys/fox_m_fsys_count_parse_input.F90 delete mode 100644 3rdparty/quip/src/fox/fsys/fox_m_fsys_count_parse_input.m4 delete mode 100644 3rdparty/quip/src/fox/fsys/fox_m_fsys_format.F90 delete mode 100644 3rdparty/quip/src/fox/fsys/fox_m_fsys_parse_input.F90 delete mode 100644 3rdparty/quip/src/fox/fsys/fox_m_fsys_parse_input.m4 delete mode 100644 3rdparty/quip/src/fox/fsys/fox_m_fsys_realtypes.f90 delete mode 100644 3rdparty/quip/src/fox/fsys/fox_m_fsys_string.F90 delete mode 100644 3rdparty/quip/src/fox/fsys/fox_m_fsys_string_list.F90 delete mode 100644 3rdparty/quip/src/fox/fsys/fox_m_fsys_varstr.F90 delete mode 100644 3rdparty/quip/src/fox/fsys/m_ieee.f90 delete mode 100644 3rdparty/quip/src/fox/fsys/makefile delete mode 100644 3rdparty/quip/src/fox/m4/common.m4 delete mode 100644 3rdparty/quip/src/fox/m4/datatypes.m4 delete mode 100644 3rdparty/quip/src/fox/m4/foreach.m4 delete mode 100644 3rdparty/quip/src/fox/m4/quantity.m4 delete mode 100755 3rdparty/quip/src/fox/release.sh delete mode 100644 3rdparty/quip/src/fox/sax/CMakeLists.txt delete mode 100644 3rdparty/quip/src/fox/sax/ChangeLog delete mode 100644 3rdparty/quip/src/fox/sax/FoX_sax.f90 delete mode 100644 3rdparty/quip/src/fox/sax/m_sax_operate.F90 delete mode 100644 3rdparty/quip/src/fox/sax/m_sax_parser.F90 delete mode 100644 3rdparty/quip/src/fox/sax/m_sax_reader.F90 delete mode 100644 3rdparty/quip/src/fox/sax/m_sax_tokenizer.F90 delete mode 100644 3rdparty/quip/src/fox/sax/m_sax_types.F90 delete mode 100644 3rdparty/quip/src/fox/sax/m_sax_xml_source.F90 delete mode 100644 3rdparty/quip/src/fox/sax/makefile delete mode 100644 3rdparty/quip/src/fox/sax/test/Makefile delete mode 100644 3rdparty/quip/src/fox/sax/test/SAX_test.xml delete mode 100644 3rdparty/quip/src/fox/sax/test/input_1.xml delete mode 100644 3rdparty/quip/src/fox/sax/test/input_2.xml delete mode 100644 3rdparty/quip/src/fox/sax/test/input_3.xml delete mode 100644 3rdparty/quip/src/fox/sax/test/m_canonicalize.f90 delete mode 100644 3rdparty/quip/src/fox/sax/test/m_handlers.f90 delete mode 100755 3rdparty/quip/src/fox/sax/test/passed.sh delete mode 100755 3rdparty/quip/src/fox/sax/test/run_tests.sh delete mode 100644 3rdparty/quip/src/fox/sax/test/sax_valid.ns.no.f90 delete mode 100644 3rdparty/quip/src/fox/sax/test/sax_valid.ns.yes.f90 delete mode 100644 3rdparty/quip/src/fox/sax/test/sax_well_formed.ns.no.f90 delete mode 100644 3rdparty/quip/src/fox/sax/test/sax_well_formed.ns.yes.f90 delete mode 120000 3rdparty/quip/src/fox/sax/test/test.sh delete mode 100644 3rdparty/quip/src/fox/sax/test/test2.xml delete mode 100644 3rdparty/quip/src/fox/sax/test/test_sax_fsm_1.in delete mode 100755 3rdparty/quip/src/fox/sax/test/test_sax_parser.sh delete mode 100644 3rdparty/quip/src/fox/sax/test/test_sax_parser_1.f90 delete mode 100644 3rdparty/quip/src/fox/sax/test/test_sax_parser_1.out delete mode 100644 3rdparty/quip/src/fox/sax/test/test_sax_parser_2.f90 delete mode 100644 3rdparty/quip/src/fox/sax/test/test_sax_parser_2.out delete mode 100644 3rdparty/quip/src/fox/sax/test/test_sax_parser_3.f90 delete mode 100644 3rdparty/quip/src/fox/sax/test/test_sax_parser_3.out delete mode 100644 3rdparty/quip/src/fox/sax/test/test_sax_parser_4.f90 delete mode 100644 3rdparty/quip/src/fox/sax/test/test_sax_parser_4.out delete mode 100644 3rdparty/quip/src/fox/sax/test/test_sax_parser_5.f90 delete mode 100644 3rdparty/quip/src/fox/sax/test/test_sax_parser_5.out delete mode 100755 3rdparty/quip/src/fox/sax/test/test_sax_reader.sh delete mode 100644 3rdparty/quip/src/fox/sax/test/test_sax_reader_1.f90 delete mode 100644 3rdparty/quip/src/fox/sax/test/test_sax_reader_1.in delete mode 100644 3rdparty/quip/src/fox/sax/test/test_sax_reader_1.out delete mode 100644 3rdparty/quip/src/fox/sax/test/testin.xml delete mode 100644 3rdparty/quip/src/fox/utils/CMakeLists.txt delete mode 100644 3rdparty/quip/src/fox/utils/FoX_utils.f90 delete mode 100644 3rdparty/quip/src/fox/utils/fox_m_utils_mtprng.F90 delete mode 100644 3rdparty/quip/src/fox/utils/fox_m_utils_uri.F90 delete mode 100644 3rdparty/quip/src/fox/utils/fox_m_utils_uuid.F90 delete mode 100644 3rdparty/quip/src/fox/utils/makefile delete mode 100644 3rdparty/quip/src/fox/utils/test/Makefile delete mode 100755 3rdparty/quip/src/fox/utils/test/run_tests.sh delete mode 100755 3rdparty/quip/src/fox/utils/test/test.sh delete mode 100644 3rdparty/quip/src/fox/utils/test/test_URI.f90 delete mode 100644 3rdparty/quip/src/fox/utils/test/test_URI.out delete mode 100644 3rdparty/quip/src/fox/utils/test/test_UUID.f90 delete mode 100644 3rdparty/quip/src/fox/utils/test/test_UUID.out delete mode 100644 3rdparty/quip/src/fox/utils/test/test_baseURI.f90 delete mode 100644 3rdparty/quip/src/fox/utils/test/test_baseURI.out delete mode 100644 3rdparty/quip/src/fox/utils/test/test_nullURI.f90 delete mode 100644 3rdparty/quip/src/fox/utils/test/test_nullURI.out delete mode 100644 3rdparty/quip/src/fox/utils/test/test_rfc2396.f90 delete mode 100644 3rdparty/quip/src/fox/utils/test/test_rfc2396.out delete mode 100644 3rdparty/quip/src/fox/utils/test/test_rfc2396b.f90 delete mode 100644 3rdparty/quip/src/fox/utils/test/test_rfc2396b.out delete mode 100644 3rdparty/quip/src/fox/wcml/CMakeLists.txt delete mode 100644 3rdparty/quip/src/fox/wcml/FoX_wcml.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/m_wcml_coma.F90 delete mode 100644 3rdparty/quip/src/fox/wcml/m_wcml_coma.m4 delete mode 100644 3rdparty/quip/src/fox/wcml/m_wcml_core.F90 delete mode 100644 3rdparty/quip/src/fox/wcml/m_wcml_geometry.F90 delete mode 100644 3rdparty/quip/src/fox/wcml/m_wcml_geometry.m4 delete mode 100644 3rdparty/quip/src/fox/wcml/m_wcml_inputdec.F90 delete mode 100644 3rdparty/quip/src/fox/wcml/m_wcml_lattice.F90 delete mode 100644 3rdparty/quip/src/fox/wcml/m_wcml_lattice.m4 delete mode 100644 3rdparty/quip/src/fox/wcml/m_wcml_lists.F90 delete mode 100644 3rdparty/quip/src/fox/wcml/m_wcml_lists.m4 delete mode 100644 3rdparty/quip/src/fox/wcml/m_wcml_metadata.F90 delete mode 100644 3rdparty/quip/src/fox/wcml/m_wcml_molecule.F90 delete mode 100644 3rdparty/quip/src/fox/wcml/m_wcml_molecule.m4 delete mode 100644 3rdparty/quip/src/fox/wcml/m_wcml_parameter.F90 delete mode 100644 3rdparty/quip/src/fox/wcml/m_wcml_parameter.m4 delete mode 100644 3rdparty/quip/src/fox/wcml/m_wcml_property.F90 delete mode 100644 3rdparty/quip/src/fox/wcml/m_wcml_property.m4 delete mode 100644 3rdparty/quip/src/fox/wcml/m_wcml_stml.F90 delete mode 100644 3rdparty/quip/src/fox/wcml/m_wcml_stml.m4 delete mode 100644 3rdparty/quip/src/fox/wcml/makefile delete mode 100644 3rdparty/quip/src/fox/wcml/test/Makefile delete mode 100755 3rdparty/quip/src/fox/wcml/test/passed.sh delete mode 100755 3rdparty/quip/src/fox/wcml/test/run_tests.sh delete mode 120000 3rdparty/quip/src/fox/wcml/test/test.sh delete mode 100755 3rdparty/quip/src/fox/wcml/test/test_cml.sh delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlAddBandList.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddBandList_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddBandList_1.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddBandList_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddBandList_2.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddBandList_3.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddBandList_3.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddBandList_4.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddBandList_4.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlAddCrystal.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddCrystal_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddCrystal_1.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddCrystal_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddCrystal_2.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlAddEigenValue.sh delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlAddEigenValueVector.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddEigenValueVector_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddEigenValueVector_1.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddEigenValueVector_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddEigenValueVector_2.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddEigenValueVector_3.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddEigenValueVector_3.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddEigenValueVector_4.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddEigenValueVector_4.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddEigenValue_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddEigenValue_1.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddEigenValue_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddEigenValue_2.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlAddKpoint.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddKpoint_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddKpoint_1.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddKpoint_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddKpoint_2.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddKpoint_3.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddKpoint_3.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddKpoint_4.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddKpoint_4.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlAddLattice.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddLattice_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddLattice_1.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddLattice_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddLattice_2.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlAddMetadata.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMetadata_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMetadata_1.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_1.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_10.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_10.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_11.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_11.out delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_12.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_12.out delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_13.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_13.out delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_14.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_14.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_15.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_15.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_16.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_16.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_2.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_3.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_3.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_4.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_4.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_5.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_5.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_6.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_6.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_7.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_7.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_8.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_8.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_9.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddMolecule_9.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlAddNamespace.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddNamespace_0.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddNamespace_0.out delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddNamespace_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddNamespace_1.out delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddNamespace_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddNamespace_2.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddNamespace_3.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddNamespace_3.out delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_1.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_10.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_10.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_11.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_11.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_12.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_12.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_13.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_13.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_14.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_14.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_15.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_15.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_16.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_16.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_17.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_17.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_18.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_18.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_19.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_19.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_2.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_20.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_20.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_21.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_21.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_22.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_22.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_23.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_23.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_24.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_24.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_25.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_25.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_3.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_3.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_4.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_4.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_5.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_5.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_6.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_6.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_7.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_7.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_8.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_8.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_9.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddParameter_9.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_1.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_10.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_10.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_11.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_11.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_12.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_12.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_13.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_13.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_14.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_14.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_15.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_15.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_16.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_16.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_17.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_17.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_18.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_18.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_19.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_19.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_2.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_20.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_20.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_21.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_21.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_3.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_3.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_4.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_4.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_5.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_5.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_6.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_6.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_7.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_7.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_8.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_8.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_9.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddProperty_9.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlAddSymmetry.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddSymmetry_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddSymmetry_1.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddSymmetry_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddSymmetry_2.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddSymmetry_3.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddSymmetry_3.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddSymmetry_4.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlAddSymmetry_4.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlBeginFile.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlBeginFile_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlBeginFile_1.out delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlBeginFile_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlBeginFile_2.out delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlDumpDec.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlDumpDec_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlDumpDec_1.input delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlDumpDec_1.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlDumpDec_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlDumpDec_2.out delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlDumpDec_3.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlDumpDec_3.out delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlDumpDec_4.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlDumpDec_4.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlDumpDec_4a.in delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlDumpDec_4b.in delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlEndBand.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndBand_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndBand_1.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlEndCml.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndCml_0.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndCml_0.out delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndCml_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndCml_1.out delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndCml_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndCml_2.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlEndKpoint.sh delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlEndKpointList.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndKpointList_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndKpointList_1.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndKpoint_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndKpoint_1.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlEndMetadataList.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndMetadataList_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndMetadataList_1.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlEndModule.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndModule_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndModule_1.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlEndParameterList.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndParameterList_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndParameterList_1.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlEndPropertyList.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndPropertyList_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndPropertyList_1.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlEndStep.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndStep_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlEndStep_1.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlFinishFile.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlFinishFile_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlFinishFile_1.out delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlFinishFile_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlFinishFile_2.out delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlFinishFile_3.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlFinishFile_3.out delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlStartBand.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartBand_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartBand_1.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartBand_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartBand_2.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartBand_3.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartBand_3.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartBand_4.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartBand_4.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlStartCml.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartCml_0.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartCml_0.out delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartCml_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartCml_1.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartCml_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartCml_2.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartCml_3.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartCml_3.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartCml_4.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartCml_4.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlStartKpoint.sh delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlStartKpointList.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartKpointList_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartKpointList_1.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartKpoint_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartKpoint_1.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartKpoint_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartKpoint_2.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartKpoint_3.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartKpoint_3.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartKpoint_4.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartKpoint_4.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlStartMetadataList.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartMetadataList_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartMetadataList_1.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartMetadataList_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartMetadataList_2.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartMetadataList_3.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartMetadataList_3.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlStartModule.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartModule_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartModule_1.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartModule_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartModule_2.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartModule_3.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartModule_3.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlStartParameterList.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartParameterList_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartParameterList_1.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartParameterList_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartParameterList_2.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartParameterList_3.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartParameterList_3.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlStartPropertyList.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartPropertyList_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartPropertyList_1.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartPropertyList_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartPropertyList_2.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartPropertyList_3.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartPropertyList_3.xml delete mode 120000 3rdparty/quip/src/fox/wcml/test/test_cmlStartStep.sh delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartStep_1.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartStep_1.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartStep_2.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartStep_2.xml delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartStep_3.f90 delete mode 100644 3rdparty/quip/src/fox/wcml/test/test_cmlStartStep_3.xml delete mode 100644 3rdparty/quip/src/fox/wkml/CMakeLists.txt delete mode 100644 3rdparty/quip/src/fox/wkml/FoX_wkml.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/m_contours.F90 delete mode 100644 3rdparty/quip/src/fox/wkml/m_wkml_chart.F90 delete mode 100644 3rdparty/quip/src/fox/wkml/m_wkml_color.F90 delete mode 100644 3rdparty/quip/src/fox/wkml/m_wkml_color_def.F90 delete mode 100644 3rdparty/quip/src/fox/wkml/m_wkml_contours.F90 delete mode 100644 3rdparty/quip/src/fox/wkml/m_wkml_core.F90 delete mode 100644 3rdparty/quip/src/fox/wkml/m_wkml_coverage.F90 delete mode 100644 3rdparty/quip/src/fox/wkml/m_wkml_coverage.m4 delete mode 100644 3rdparty/quip/src/fox/wkml/m_wkml_features.F90 delete mode 100644 3rdparty/quip/src/fox/wkml/m_wkml_lowlevel.F90 delete mode 100644 3rdparty/quip/src/fox/wkml/m_wkml_styling.F90 delete mode 100644 3rdparty/quip/src/fox/wkml/makefile delete mode 100644 3rdparty/quip/src/fox/wkml/rgb.txt delete mode 100644 3rdparty/quip/src/fox/wkml/rgb2wkml.py delete mode 100644 3rdparty/quip/src/fox/wkml/test/Makefile delete mode 100644 3rdparty/quip/src/fox/wkml/test/m_contours_test_data_sp.f90 delete mode 100755 3rdparty/quip/src/fox/wkml/test/passed.sh delete mode 100755 3rdparty/quip/src/fox/wkml/test/run_tests.sh delete mode 100755 3rdparty/quip/src/fox/wkml/test/test.sh delete mode 100755 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary.sh delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_0.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_0.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_1.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_1.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_10.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_10.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_11.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_11.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_12.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_12.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_13.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_13.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_14.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_14.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_15.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_15.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_16.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_16.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_17.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_17.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_18.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_18.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_2.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_2.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_3.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_3.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_4.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_4.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_5.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_5.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_6.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_6.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_7.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_7.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_8.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_8.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_9.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlAddInnerBoundary_9.xml delete mode 100755 3rdparty/quip/src/fox/wkml/test/test_kmlColorMap.sh delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlColorMap_1.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlColorMap_1.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlColorMap_2.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlColorMap_2.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlColorMap_3.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlColorMap_3.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlColorMap_4.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlColorMap_4.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlColorMap_5.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlColorMap_5.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlColorMap_6.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlColorMap_6.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlColorMap_7.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlColorMap_7.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlColorMap_8.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlColorMap_8.out delete mode 100755 3rdparty/quip/src/fox/wkml/test/test_kmlContours.sh delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlContours_1.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlContours_1.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlContours_2.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlContours_2.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlContours_3.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlContours_3.xml delete mode 100755 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine.sh delete mode 100755 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle.sh delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_0.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_0.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_1.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_1.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_10.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_10.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_11.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_11.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_12.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_12.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_2.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_2.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_3.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_3.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_4.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_4.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_5.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_5.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_6.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_6.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_7.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_7.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_8.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_8.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_9.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLineStyle_9.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_1.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_1.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_10.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_10.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_11.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_11.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_12.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_12.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_13.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_13.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_14.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_14.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_15.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_15.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_16.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_16.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_17.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_17.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_18.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_18.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_19.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_19.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_2.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_2.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_20.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_20.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_3.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_3.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_4.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_4.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_5.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_5.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_6.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_6.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_7.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_7.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_8.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_8.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_9.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreateLine_9.xml delete mode 100755 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle.sh delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_0.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_0.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_1.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_1.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_10.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_10.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_11.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_11.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_12.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_12.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_13.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_13.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_14.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_14.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_15.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_15.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_16.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_16.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_17.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_17.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_18.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_18.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_19.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_19.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_2.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_2.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_20.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_20.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_21.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_21.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_3.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_3.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_4.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_4.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_5.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_5.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_6.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_6.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_7.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_7.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_8.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_8.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_9.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePointStyle_9.xml delete mode 100755 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePoints.sh delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePoints_1.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePoints_1.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePoints_10.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePoints_10.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePoints_11.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePoints_11.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePoints_12.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePoints_12.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePoints_2.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePoints_2.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePoints_3.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePoints_3.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePoints_4.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePoints_4.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePoints_5.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePoints_5.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePoints_6.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePoints_6.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePoints_7.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePoints_7.xml delete mode 100755 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle.sh delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_1.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_1.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_10.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_10.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_11.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_11.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_12.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_12.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_2.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_2.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_3.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_3.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_4.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_4.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_5.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_5.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_6.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_6.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_7.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_7.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_8.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_8.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_9.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlCreatePolygonStyle_9.xml delete mode 100755 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseDocument.sh delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseDocument_1.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseDocument_1.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseDocument_2.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseDocument_2.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseDocument_3.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseDocument_3.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseDocument_4.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseDocument_4.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseDocument_5.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseDocument_5.xml delete mode 100755 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseFolder.sh delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseFolder_0.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseFolder_0.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseFolder_1.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseFolder_1.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseFolder_2.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseFolder_2.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseFolder_3.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseFolder_3.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseFolder_4.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseFolder_4.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseFolder_5.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlOpenCloseFolder_5.out delete mode 100755 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion.sh delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_0.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_0.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_1.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_1.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_10.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_10.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_11.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_11.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_12.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_12.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_13.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_13.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_14.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_14.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_15.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_15.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_16.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_16.out delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_2.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_2.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_3.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_3.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_4.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_4.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_5.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_5.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_6.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_6.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_7.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_7.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_8.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_8.xml delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_9.f90 delete mode 100644 3rdparty/quip/src/fox/wkml/test/test_kmlStartEndRegion_9.out delete mode 100644 3rdparty/quip/src/fox/wxml/CMakeLists.txt delete mode 100644 3rdparty/quip/src/fox/wxml/FoX_wxml.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/m_wxml_core.F90 delete mode 100644 3rdparty/quip/src/fox/wxml/m_wxml_escape.F90 delete mode 100644 3rdparty/quip/src/fox/wxml/m_wxml_overloads.F90 delete mode 100644 3rdparty/quip/src/fox/wxml/m_wxml_overloads.m4 delete mode 100644 3rdparty/quip/src/fox/wxml/makefile delete mode 100644 3rdparty/quip/src/fox/wxml/test/Makefile delete mode 100755 3rdparty/quip/src/fox/wxml/test/passed.sh delete mode 100755 3rdparty/quip/src/fox/wxml/test/run_tests.sh delete mode 120000 3rdparty/quip/src/fox/wxml/test/test.sh delete mode 100755 3rdparty/quip/src/fox/wxml/test/test_xml.sh delete mode 120000 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute.sh delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_0.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_0.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_1.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_1.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_2.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_2.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_3.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_3.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_4.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_4.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_5.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_5.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_6.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_6.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_7.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_7.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_8.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_8.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_1.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_1.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_10.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_10.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_11.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_11.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_12.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_12.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_13.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_13.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_14.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_14.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_15.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_15.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_16.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_16.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_17.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_17.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_18.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_18.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_19.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_19.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_2.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_2.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_20.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_20.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_3.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_3.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_4.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_4.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_5.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_5.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_6.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_6.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_7.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_7.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_8.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_8.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_9.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddAttribute_overload_9.xml delete mode 120000 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters.sh delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_0.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_0.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_1.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_1.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_2.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_2.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_3.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_3.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_4.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_4.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_5.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_5.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_1.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_1.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_10.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_10.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_11.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_11.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_12.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_12.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_13.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_13.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_14.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_14.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_15.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_15.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_16.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_16.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_17.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_17.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_18.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_18.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_19.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_19.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_2.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_2.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_20.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_20.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_3.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_3.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_4.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_4.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_5.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_5.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_6.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_6.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_7.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_7.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_8.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_8.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_9.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddCharacters_overload_9.xml delete mode 120000 3rdparty/quip/src/fox/wxml/test/test_xml_AddComment.sh delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddComment_0.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddComment_0.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddComment_1.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddComment_1.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddComment_2.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddComment_2.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddComment_3.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddComment_3.out delete mode 120000 3rdparty/quip/src/fox/wxml/test/test_xml_AddDOCTYPE.sh delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddDOCTYPE_0.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddDOCTYPE_0.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddDOCTYPE_1.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddDOCTYPE_1.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddDOCTYPE_2.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddDOCTYPE_2.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddDOCTYPE_3.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddDOCTYPE_3.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddDOCTYPE_4.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddDOCTYPE_4.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddDOCTYPE_5.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddDOCTYPE_5.out delete mode 120000 3rdparty/quip/src/fox/wxml/test/test_xml_AddExternalEntity.sh delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddExternalEntity_0.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddExternalEntity_0.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddExternalEntity_1.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddExternalEntity_1.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddExternalEntity_2.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddExternalEntity_2.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddExternalEntity_3.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddExternalEntity_3.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddExternalEntity_4.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddExternalEntity_4.xml delete mode 120000 3rdparty/quip/src/fox/wxml/test/test_xml_AddInternalEntity.sh delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddInternalEntity_0.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddInternalEntity_0.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddInternalEntity_1.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddInternalEntity_1.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddInternalEntity_2.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddInternalEntity_2.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddInternalEntity_3.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddInternalEntity_3.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddInternalEntity_4.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddInternalEntity_4.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddNewline_1.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddNewline_1.xml delete mode 120000 3rdparty/quip/src/fox/wxml/test/test_xml_AddNotation.sh delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddNotation_0.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddNotation_0.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddNotation_1.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddNotation_1.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddNotation_2.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddNotation_2.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddNotation_3.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddNotation_3.xml delete mode 120000 3rdparty/quip/src/fox/wxml/test/test_xml_AddParameterEntity.sh delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddParameterEntity_0.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddParameterEntity_0.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddParameterEntity_1.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddParameterEntity_1.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddParameterEntity_2.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddParameterEntity_2.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddParameterEntity_3.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddParameterEntity_3.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddParameterEntity_4.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddParameterEntity_4.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddParameterEntity_5.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddParameterEntity_5.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddParameterEntity_6.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddParameterEntity_6.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddParameterEntity_7.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddParameterEntity_7.xml delete mode 120000 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute.sh delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_0.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_0.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_1.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_1.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_2.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_2.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_3.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_3.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_4.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_4.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_5.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_5.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_1.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_1.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_10.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_10.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_11.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_11.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_12.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_12.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_13.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_13.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_14.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_14.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_15.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_15.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_16.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_16.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_17.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_17.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_18.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_18.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_19.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_19.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_2.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_2.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_20.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_20.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_3.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_3.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_4.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_4.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_5.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_5.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_6.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_6.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_7.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_7.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_8.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_8.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_9.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddPseudoAttribute_overload_9.xml delete mode 120000 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLDeclaration.sh delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLDeclaration_0.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLDeclaration_0.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLDeclaration_1.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLDeclaration_1.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLDeclaration_2.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLDeclaration_2.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLDeclaration_3.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLDeclaration_3.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLDeclaration_4.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLDeclaration_4.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLDeclaration_5.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLDeclaration_5.out delete mode 120000 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLPI.sh delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLPI_0.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLPI_0.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLPI_1.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLPI_1.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLPI_2.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLPI_2.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLPI_3.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLPI_3.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLPI_4.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLPI_4.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLPI_5.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLPI_5.out delete mode 120000 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLStylesheet.sh delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLStylesheet_0.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLStylesheet_0.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLStylesheet_1.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLStylesheet_1.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLStylesheet_2.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLStylesheet_2.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLStylesheet_3.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLStylesheet_3.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLStylesheet_4.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLStylesheet_4.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLStylesheet_5.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_AddXMLStylesheet_5.xml delete mode 120000 3rdparty/quip/src/fox/wxml/test/test_xml_Close.sh delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Close_1.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Close_1.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Close_2.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Close_2.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Close_3.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Close_3.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Close_4.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Close_4.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Close_5.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Close_5.xml delete mode 120000 3rdparty/quip/src/fox/wxml/test/test_xml_EndElement.sh delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_EndElement_0.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_EndElement_0.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_EndElement_1.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_EndElement_1.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_EndElement_2.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_EndElement_2.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_EndElement_3.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_EndElement_3.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_EndElement_4.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_EndElement_4.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_EndElement_5.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_EndElement_5.xml delete mode 120000 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces.sh delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_0.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_0.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_1.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_1.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_10.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_10.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_11.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_11.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_12.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_12.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_13.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_13.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_2.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_2.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_3.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_3.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_4.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_4.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_5.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_5.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_6.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_6.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_7.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_7.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_8.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_8.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_9.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Namespaces_9.out delete mode 120000 3rdparty/quip/src/fox/wxml/test/test_xml_NewElement.sh delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_NewElement_0.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_NewElement_0.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_NewElement_1.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_NewElement_1.xml delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_NewElement_2.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_NewElement_2.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_NewElement_3.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_NewElement_3.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_NewElement_4.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_NewElement_4.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_NewElement_5.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_NewElement_5.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_NewElement_6.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_NewElement_6.out delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_NewElement_7.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_NewElement_7.out delete mode 100755 3rdparty/quip/src/fox/wxml/test/test_xml_Openfile.sh delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Openfile_1.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Openfile_2.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Openfile_3.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Openfile_4.f90 delete mode 100644 3rdparty/quip/src/fox/wxml/test/test_xml_Openfile_4.out delete mode 100644 3rdparty/quip/src/libAtoms/Atoms.f95 delete mode 100644 3rdparty/quip/src/libAtoms/Atoms_ll.f95 delete mode 100644 3rdparty/quip/src/libAtoms/Atoms_types.f95 delete mode 100644 3rdparty/quip/src/libAtoms/Barostat.f95 delete mode 100644 3rdparty/quip/src/libAtoms/CInOutput.f95 delete mode 100644 3rdparty/quip/src/libAtoms/COPYRIGHT delete mode 100644 3rdparty/quip/src/libAtoms/Connection.f95 delete mode 100644 3rdparty/quip/src/libAtoms/Constraints.f95 delete mode 100644 3rdparty/quip/src/libAtoms/Dictionary.f95 delete mode 100644 3rdparty/quip/src/libAtoms/DomainDecomposition.f95 delete mode 100644 3rdparty/quip/src/libAtoms/DynamicalSystem.f95 delete mode 100644 3rdparty/quip/src/libAtoms/ExtendableStr.f95 delete mode 100644 3rdparty/quip/src/libAtoms/Group.f95 delete mode 100644 3rdparty/quip/src/libAtoms/LinkedList.f95 delete mode 100644 3rdparty/quip/src/libAtoms/MPI_context.f95 delete mode 100644 3rdparty/quip/src/libAtoms/Makefile delete mode 100644 3rdparty/quip/src/libAtoms/ParamReader.f95 delete mode 100644 3rdparty/quip/src/libAtoms/PeriodicTable.f95 delete mode 100644 3rdparty/quip/src/libAtoms/Quaternions.f95 delete mode 100644 3rdparty/quip/src/libAtoms/README delete mode 100644 3rdparty/quip/src/libAtoms/RigidBody.f95 delete mode 100644 3rdparty/quip/src/libAtoms/SocketTools.f95 delete mode 100644 3rdparty/quip/src/libAtoms/Sparse.f95 delete mode 100644 3rdparty/quip/src/libAtoms/Spline.f95 delete mode 100644 3rdparty/quip/src/libAtoms/Structures.f95 delete mode 100644 3rdparty/quip/src/libAtoms/System.f95 delete mode 100644 3rdparty/quip/src/libAtoms/Table.f95 delete mode 100644 3rdparty/quip/src/libAtoms/Thermostat.f95 delete mode 100644 3rdparty/quip/src/libAtoms/Topology.f95 delete mode 100644 3rdparty/quip/src/libAtoms/Units.f95 delete mode 100644 3rdparty/quip/src/libAtoms/alphashape.cpp delete mode 100644 3rdparty/quip/src/libAtoms/angular_functions.f95 delete mode 100644 3rdparty/quip/src/libAtoms/clusters.f95 delete mode 100644 3rdparty/quip/src/libAtoms/cutil.c delete mode 100644 3rdparty/quip/src/libAtoms/error.f95 delete mode 100644 3rdparty/quip/src/libAtoms/error.inc delete mode 100644 3rdparty/quip/src/libAtoms/find_surface_atoms.f95 delete mode 100644 3rdparty/quip/src/libAtoms/frametools.f95 delete mode 100644 3rdparty/quip/src/libAtoms/gamma_functions.f95 delete mode 100644 3rdparty/quip/src/libAtoms/histogram1d.f95 delete mode 100644 3rdparty/quip/src/libAtoms/histogram2d.f95 delete mode 100644 3rdparty/quip/src/libAtoms/intro.tex delete mode 100644 3rdparty/quip/src/libAtoms/k_means_clustering.f95 delete mode 100644 3rdparty/quip/src/libAtoms/lbfgs.f delete mode 100644 3rdparty/quip/src/libAtoms/libAtoms.f95 delete mode 100644 3rdparty/quip/src/libAtoms/libAtoms_misc_utils.f95 delete mode 100644 3rdparty/quip/src/libAtoms/libAtoms_utils_no_module.f95 delete mode 100644 3rdparty/quip/src/libAtoms/libatoms.h delete mode 100644 3rdparty/quip/src/libAtoms/linearalgebra.f95 delete mode 100644 3rdparty/quip/src/libAtoms/lobpcg.f95 delete mode 100755 3rdparty/quip/src/libAtoms/make_thermo_baro_algorithm_docs delete mode 100644 3rdparty/quip/src/libAtoms/malloc.c delete mode 100644 3rdparty/quip/src/libAtoms/minimal_md.f95 delete mode 100644 3rdparty/quip/src/libAtoms/minimization.f95 delete mode 100644 3rdparty/quip/src/libAtoms/netcdf.c delete mode 100644 3rdparty/quip/src/libAtoms/nye_tensor.f95 delete mode 100644 3rdparty/quip/src/libAtoms/partition.f95 delete mode 100644 3rdparty/quip/src/libAtoms/protein_res.CHARMM.lib delete mode 100644 3rdparty/quip/src/libAtoms/ringstat.f95 delete mode 100644 3rdparty/quip/src/libAtoms/sockets.c delete mode 100644 3rdparty/quip/src/libAtoms/statistics.f95 delete mode 100644 3rdparty/quip/src/libAtoms/steinhardt_nelson_qw.f95 delete mode 100644 3rdparty/quip/src/libAtoms/test_gamma.f95 delete mode 100755 3rdparty/quip/src/libAtoms/test_iostat_vals.f90 delete mode 100644 3rdparty/quip/src/libAtoms/thermo_baro_algorithm.tex delete mode 100644 3rdparty/quip/src/libAtoms/xyz.c delete mode 100644 3rdparty/quip/tests/GAP.xml delete mode 100644 3rdparty/quip/tests/GAP.xml.sparseX.GAP_2018_10_7_60_14_59_24_9701 delete mode 100644 3rdparty/quip/tests/GAP.xml.sparseX.GAP_2018_10_7_60_14_59_24_9702 delete mode 100644 3rdparty/quip/tests/GAP.xml.sparseX.GAP_2018_10_7_60_14_59_24_9703 delete mode 100644 3rdparty/quip/tests/Makefile delete mode 100644 3rdparty/quip/tests/SW_pot.xml delete mode 100755 3rdparty/quip/tests/do_not_run/test_md.sh delete mode 100755 3rdparty/quip/tests/do_not_run/test_md_velo.sh delete mode 100644 3rdparty/quip/tests/gap_sample.xyz delete mode 100644 3rdparty/quip/tests/old_test_elastic.py delete mode 100644 3rdparty/quip/tests/old_test_potential.py delete mode 100644 3rdparty/quip/tests/quippytest.py delete mode 100644 3rdparty/quip/tests/rules/py3_test.inc delete mode 100644 3rdparty/quip/tests/run_all.py delete mode 100644 3rdparty/quip/tests/test_descriptor.py delete mode 100644 3rdparty/quip/tests/test_dynamicalsystem.py delete mode 100644 3rdparty/quip/tests/test_filepot.py delete mode 100644 3rdparty/quip/tests/test_gappot.py delete mode 100644 3rdparty/quip/tests/test_pot.py delete mode 100644 3rdparty/quip/tests/test_potential_cell.py delete mode 100755 3rdparty/quip/tests/test_quip.sh delete mode 100644 3rdparty/quip/travis/Makefile.inc delete mode 100644 3rdparty/quip/travis/Makefile.nogap.inc delete mode 100755 3rdparty/quip/travis/trigger_gap_release.sh delete mode 100755 3rdparty/quip/travis/trigger_quip_docker.sh diff --git a/3rdparty/gap/.gitignore b/3rdparty/gap/.gitignore deleted file mode 100644 index b25c15b8..00000000 --- a/3rdparty/gap/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*~ diff --git a/3rdparty/gap/LICENSE.md b/3rdparty/gap/LICENSE.md deleted file mode 100644 index 39436d3a..00000000 --- a/3rdparty/gap/LICENSE.md +++ /dev/null @@ -1,96 +0,0 @@ -### GAP suite — Non-commercial License Agreement - -*Last updated: 19th April 2017* - -The GAP suite of programs, comprising the GAP-filler and GAP packages -(together “the Software”), written by Dr Gabor Csanyi and Dr Albert -Bartok-Partay of the University of Cambridge (the “Authors”) for -describing the chemical environments of atoms and molecules and -predicting potential energy surfaces, is copyrighted by the University -of Cambridge and the Authors. Users at non-commercial institutions may -obtain a copy for Non-commercial Purposes. "Non-commercial Purposes" -means use of the Software and/or any **Software-derived data (including -interatomic potentials)** for academic research or other not-for-profit -or scholarly purposes which are undertaken at an educational, -non-profit, charitable or governmental institution that does not -involve the production or manufacture of products for sale or the -performance of services for a fee or other non-monetary value. - -For commercial use of either or both the Software or any -Software-derived data, please contact Cambridge Enterprise Limited at -. - -1. This is a legal agreement between you (“USER”), and the Authors. By - accepting, receiving, and using this Software, you are agreeing to - be bound by the terms of this Agreement. -2. The Authors hereby grant to the USER a non-exclusive, - non-transferable personal licence to use the Software. -3. The licence granted under this Agreement shall only entitle the USER - to use the Software for Non-commercial Purposes. The use of the - Software, or any code which is a modification of, enhancement to, - derived from or based upon the Software, or Software-derived data, - either directly or indirectly for any commercial purpose whatsoever - is expressly forbidden. The USER may not sublicense, distribute or - copy (except for archival purposes) the Software or enhancements - thereto. -4. If any academic paper or publication by the USER includes any set of - interatomic potentials or other Software-derived data then the USER - must timeously publish their full GAP model and source data (i.e. - the underlying quantum mechanical data which were used as input to - the GAP-filler). Any publication of any GAP models, interatomic - potentials or other Software-derived data must specifically state - that such data is provided for non-commercial use only. -5. If any academic paper or publication by the USER is based wholly or - partially, directly or indirectly on the Software or any results - derived from the Software then that paper or publication must cite: - - A. P. Bartok et al. *Physical Review Letters* **104** - 136403 (2010) - - A. P. Bartok et al. *Physical Review B* **87** 184115 (2013) - - That this Software is available for non-commercial use from - `www.libatoms.org` -6. The Software is the subject of copyright. Unauthorised copying of - the Software is expressly forbidden. The University of Cambridge and - the Authors retain all the rights in and title to the Software. -7. The Software is provided "AS IS" and except as expressly provided in - this Agreement no warranty, condition, undertaking or term, express - or implied, statutory or otherwise, as to the condition, - performance, satisfactory quality or fitness for purpose of the - Software is given or assumed by the Authors or the University of - Cambridge, and all such warranties, conditions, undertakings and - terms are hereby excluded. -8. The limitations and exclusions in this Agreement shall not apply in - respect of claims for personal injury or death caused by negligence - or in respect of fraud or fraudulent misrepresentation. -9. EXCEPT AS PROVIDED BY CLAUSE 8, neither the AUTHORS nor the - University OF CAMBRIDGE or its employees or students shall be liable - for any damages or expenses of whatsoever nature and howsoever - arising (including without limitation in contract, tort, negligence - or for breach of statutory duty or misrepresentation) in connection - with any right or licence granted or use of the Software or - otherwise in connection with this Licence or any relationships - established by it. Without prejudice to the generality of the - foregoing, in the event that the AUTHORS, the University OF - CAMBRIDGE, its employees or students should be found liable, then - their aggregate liability for direct damages shall be limited to - £100; and none of them shall be liable for any indirect, incidental, - consequential or special damages including without limitation loss - of profits, revenue, or business opportunity, loss of goodwill, data - loss, business disruption or computer failure. -10. The USER shall indemnify the Authors, the University of Cambridge, - its employees and students in full against each and every claim made - against any of them by any third party (including without limitation - in contract, tort, negligence or for breach of statutory duty or - misrepresentation) arising out of or in connection with the USER's - use of the Software. -11. The Authors accept no obligation to provide maintenance nor do they - guarantee the expected functionality of the Software or of any part - of the Software. -12. This Agreement is effective until terminated. This Agreement will - terminate automatically on notice from the Authors if the USER fails - to comply with any provision of this Agreement. Upon termination the - USER shall immediately destroy all copies of the Software. -13. This Agreement and any matters relating to it shall be governed and - construed in accordance with the laws of England and Wales and - Authors and the USER hereby irrevocably submit to the exclusive - jurisdiction of the English Courts. - diff --git a/3rdparty/gap/Makefile b/3rdparty/gap/Makefile deleted file mode 100644 index 9ad91944..00000000 --- a/3rdparty/gap/Makefile +++ /dev/null @@ -1,112 +0,0 @@ -# HND XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -# HND X -# HND X libAtoms+QUIP: atomistic simulation library -# HND X -# HND X Portions of this code were written by -# HND X Albert Bartok-Partay, Silvia Cereda, Gabor Csanyi, James Kermode, -# HND X Ivan Solt, Wojciech Szlachta, Csilla Varnai, Steven Winfield. -# HND X -# HND X Copyright 2006-2010. -# HND X -# HND X Not for distribution -# HND X -# HND X Portions of this code were written by Noam Bernstein as part of -# HND X his employment for the U.S. Government, and are not subject -# HND X to copyright in the USA. -# HND X -# HND X When using this software, please cite the following reference: -# HND X -# HND X http://www.libatoms.org -# HND X -# HND X Additional contributions by -# HND X Alessio Comisso, Chiara Gattinoni, and Gianpietro Moras -# HND X -# HND XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - - - -ifeq (${QUIP_ARCH},) - include Makefile.arch -else - include Makefile.${QUIP_ARCH} -endif -include Makefile.inc -include Makefile.rules - -GAP1_F95_FILES = make_permutations_v2 descriptors gp_predict descriptors_wrapper clustering -GAP1_F95_SOURCES = ${addsuffix .f95, ${GAP1_F95_FILES}} -GAP1_F95_OBJS = ${addsuffix .o, ${GAP1_F95_FILES}} - -GAP2_F95_FILES = gp_fit gap_fit_module -GAP2_F95_SOURCES = ${addsuffix .f95, ${GAP2_F95_FILES}} -GAP2_F95_OBJS = ${addsuffix .o, ${GAP2_F95_FILES}} - -default: ${GAP_LIBFILE} - - - -ifeq (${USE_MAKEDEP},1) -GAP1_F95_FPP_FILES = ${addsuffix .fpp, ${GAP1_F95_FILES}} -GAP2_F95_FPP_FILES = ${addsuffix .fpp, ${GAP2_F95_FILES}} -GAP1.depend: ${GAP1_F95_FPP_FILES} - ${SCRIPT_PATH}/${MAKEDEP} ${MAKEDEP_ARGS} -- ${addprefix ../../src/GAP/,${GAP1_F95_SOURCES}} > GAP1.depend -GAP2.depend: ${GAP2_F95_FPP_FILES} ${GAP1_F95_FPP_FILES} - ${SCRIPT_PATH}/${MAKEDEP} ${MAKEDEP_ARGS} -- ${addprefix ../../src/GAP/,${GAP2_F95_SOURCES}} > GAP2.depend - --include GAP1.depend --include GAP2.depend -endif - - -PROGRAMS = gap_fit - -LIBS = -L. -lquiputils -lquip_core -lgap -latoms -ifeq (${HAVE_THIRDPARTY},1) - LIBS += -lthirdparty -endif -LIBFILES = libatoms.a ${GAP_LIBFILE} libquip_core.a libquiputils.a - -.PHONY : clean allclean depend doc install - -Programs: ${PROGRAMS} - cp ${QUIP_ROOT}/src/GAP/teach_sparse . - -${PROGRAMS}: % : ${LIBFILES} ${GAP2_F95_OBJS} ${GAPFIT_LIBFILE} %.o - $(LINKER) $(LINKFLAGS) -o $@ ${F90OPTS} $@.o ${GAPFIT_LIBFILE} ${LIBS} ${LINKOPTS} - - - -${GAP_LIBFILE}: ${GAP1_F95_OBJS} -ifneq (${LIBTOOL},) - ${LIBTOOL} -o ${GAP_LIBFILE} ${GAP1_F95_OBJS} -else - ${AR} ${AR_ADD} ${GAP_LIBFILE} $? -endif - -${GAPFIT_LIBFILE}: ${GAP2_F95_OBJS} -ifneq (${LIBTOOL},) - ${LIBTOOL} -o ${GAPFIT_LIBFILE} ${GAP2_F95_OBJS} -else - ${AR} ${AR_ADD} ${GAPFIT_LIBFILE} $? -endif - - - - -install: - @if [ ! -d ${QUIP_INSTALLDIR} ]; then \ - echo "make install: QUIP_INSTALLDIR '${QUIP_INSTALLDIR}' doesn't exist or isn't a directory"; \ - exit 1; \ - else \ - for f in ${PROGRAMS} ; do \ - echo "Copying $$f to ${QUIP_INSTALLDIR}/$${f}${QUIP_MPI_SUFFIX}" ; \ - cp $$f ${QUIP_INSTALLDIR}/$${f}${QUIP_MPI_SUFFIX} ; \ - done ;\ - cp ${QUIP_ROOT}/src/GAP/teach_sparse ${QUIP_INSTALLDIR}; \ - fi - - -clean: - rm -f *.o *.mod *.mod.save ${GAP_LIBFILE} ${GAPFIT_LIBFILE} ${PROGRAMS} GAP1.depend GAP2.depend - - diff --git a/3rdparty/gap/clustering.f95 b/3rdparty/gap/clustering.f95 deleted file mode 100644 index 026fe3eb..00000000 --- a/3rdparty/gap/clustering.f95 +++ /dev/null @@ -1,928 +0,0 @@ -! HND XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -! HND X -! HND X libAtoms+QUIP: atomistic simulation library -! HND X -! HND X Portions of this code were written by -! HND X Albert Bartok-Partay, Silvia Cereda, Gabor Csanyi, James Kermode, -! HND X Ivan Solt, Wojciech Szlachta, Csilla Varnai, Steven Winfield. -! HND X -! HND X Copyright 2006-2010. -! HND X -! HND X Not for distribution -! HND X -! HND X Portions of this code were written by Noam Bernstein as part of -! HND X his employment for the U.S. Government, and are not subject -! HND X to copyright in the USA. -! HND X -! HND X When using this software, please cite the following reference: -! HND X -! HND X http://www.libatoms.org -! HND X -! HND X Additional contributions by -! HND X Alessio Comisso, Chiara Gattinoni, and Gianpietro Moras -! HND X -! HND XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - -#include "error.inc" - -module clustering_module - - ! use libatoms_module - use error_module - use system_module ! , only : dp, optional_default, ran_uniform, reallocate - use linearalgebra_module - - implicit none - private - - public :: pivot, bisect_kmedoids, cluster_kmeans, select_uniform, cluster_fuzzy_cmeans, cur_decomposition - - integer, parameter :: n_trial = 10 - integer, parameter :: n_trial_k_med = 100 - real(dp), parameter :: cluster_jitter = 1.0e-7_dp - real(dp), parameter :: KMEANS_THRESHOLD = 1.0e-6_dp - - type lst - integer, dimension(:), allocatable :: object - integer :: medoid - real(dp) :: sse - integer :: N - endtype lst - - type clstr - type(lst), dimension(:), allocatable :: cluster - real(dp), dimension(:,:), pointer :: dm - integer :: N - endtype clstr - - contains - - subroutine distance_matrix(x,dm,theta_fac,theta) - real(dp), dimension(:,:), intent(in) :: x - real(dp), dimension(:,:), intent(out) :: dm - real(dp), intent(in), optional :: theta_fac - real(dp), dimension(:), intent(in), target, optional :: theta - - real(dp), dimension(:), pointer :: my_theta => null() - real(dp) :: my_theta_fac - integer :: i, j, d, n - - my_theta_fac = optional_default(1.0_dp, theta_fac) - d = size(x,1) - n = size(x,2) - - if( present(theta) ) then - if( size(theta) == d) then - my_theta => theta - else - allocate(my_theta(d)) - my_theta = theta(1) - endif - else - allocate(my_theta(d)) - - do i = 1, d - my_theta(i) = ( maxval(x(i,:)) - minval(x(i,:)) ) - ! theta(i) = sqrt( & !take square root - ! & sum( x(i,:)**2 ) / size(x(i,:)) - & - ! & (sum( x(i,:) ) / size(x(i,:)))**2 ) - if( my_theta(i) .feq. 0.0_dp ) my_theta(i) = 1.0_dp - enddo - my_theta = my_theta * my_theta_fac - endif - - do i = 1, n - do j = i + 1, n - dm(j,i) = cluster_jitter*ran_uniform() - enddo - dm(i,i) = 0.0_dp - enddo - -!$omp parallel do default(none) shared(dm,n,x,my_theta) private(i,j) schedule(dynamic) - do i = 1, n - do j = i + 1, n - dm(j,i) = dm(j,i) + sqrt( sum( ( (x(:,j) - x(:,i)) / my_theta )**2 ) ) - dm(i,j) = dm(j,i) - enddo - enddo -!$omp end parallel do - - do i = 1, n - do j = i + 1, n - dm(i,j) = dm(j,i) - enddo - enddo - - if( present(theta) ) then - my_theta => null() - else - deallocate(my_theta) - endif - - endsubroutine distance_matrix - - subroutine pca(x,x_mean,v) - - real(dp), dimension(:,:), intent(in) :: x - real(dp), dimension(:), intent(out) :: x_mean - real(dp), dimension(:,:), intent(out) :: v - - real(dp), dimension(:), allocatable :: diag_c - real(dp), dimension(:,:), allocatable :: cov - integer :: i, j, d, n - - d = size(x,1) - n = size(x,2) - allocate(cov(d,d),diag_c(d)) - - x_mean = sum(x,dim=2) / n ! empirical mean - - do i = 1, d - do j = 1, d - cov(j,i) = dot_product(x(i,:),x(j,:)) / n - x_mean(i)*x_mean(j) - enddo - enddo - - call diagonalise(cov,diag_c, evects=v) - - deallocate(cov, diag_c) - - endsubroutine pca - - subroutine pivot(x,pivout,theta_fac,theta) - real(dp), dimension(:,:), intent(in) :: x - integer, dimension(:), intent(out) :: pivout - real(dp), intent(in), optional :: theta_fac - real(dp), dimension(:), intent(in), optional :: theta - - real(dp), dimension(:,:), allocatable :: knn - real(dp), dimension(:), allocatable :: ktmp - integer, dimension(:), allocatable :: pivin - - integer :: stat, i, j, k, d, m, n, jtmp, jmax - real(dp) :: dmax - - d = size(x,1) - n = size(x,2) - - m = size(pivout) - - if( m > n ) call system_abort('pivot: required number of changes ('//m//') greater than possible number of changes ('//n//')') - - allocate(knn(n,n),stat=stat) - if(stat /=0 ) call system_abort('pivot: could not allocate knn matrix.') - - allocate(pivin(n),ktmp(n)) - - call distance_matrix(x,knn,theta_fac=theta_fac,theta=theta) - do i = 1, n - do j = 1, n - knn(j,i) = exp(-0.5_dp*knn(j,i)) - enddo - enddo - - pivin = (/ (i, i=1,n) /) - - do k = 1, m - dmax = 0.0_dp - do j = k, n - if( dmax < knn(j,j) ) then - jmax = j - dmax = knn(j,j) - endif - enddo - if( jmax /= k ) then - jtmp = pivin(jmax) - pivin(jmax) = pivin(k) - pivin(k) = jtmp - - ktmp = knn(k,:) - knn(k,:) = knn(jmax,:) - knn(jmax,:) = ktmp - - ktmp = knn(:,k) - knn(:,k) = knn(:,jmax) - knn(:,jmax) = ktmp - endif - - knn(k,k) = sqrt(knn(k,k)) - - knn(k+1:n,k) = knn(k+1:n,k)/knn(k,k) - do j = k+1, n - knn(j:n,j) = knn(j:n,j) - knn(j:n,k)*knn(j,k) - enddo - - do j = 1, n - do i = j+1,n - knn(j,i) = knn(i,j) - enddo - enddo - enddo - - pivout = pivin(1:m) - - deallocate(knn,pivin,ktmp) - - endsubroutine pivot - - subroutine bisect_kmedoids(dat,n_clusters_in, c,med, theta_fac,theta, is_distance_matrix) - real(dp), dimension(:,:), intent(in), target :: dat - integer, intent(in) :: n_clusters_in - integer, dimension(:), intent(out),optional :: c, med - real(dp), intent(in), optional :: theta_fac - real(dp), dimension(:), intent(in), optional :: theta - logical, intent(in), optional :: is_distance_matrix - - type(clstr) :: my_cluster, tmp - - logical :: must_calculate_distance - real(dp), dimension(:,:), allocatable, target :: dm - - real(dp), dimension(:), allocatable :: dv - real(dp) :: max_sse, min_sse, sse - - integer, dimension(:), allocatable :: sub_cluster1, sub_cluster2, sub_cluster1_min, sub_cluster2_min - integer, dimension(1) :: ml - integer :: stat, i, j, k, km, m, n, nc, & - lo_med, hi_med, lo_med_new, hi_med_new, lo_med_min, hi_med_min, n1, n2, n1_min, n2_min, iter - - must_calculate_distance = .not. optional_default(.true., is_distance_matrix) - - n = size(dat,2) - if (.not. must_calculate_distance) then - if (size(dat,1) /= n) call system_abort('is_distance_matrix but not square') - endif - - if( n_clusters_in > n ) call system_abort('bisect_kmedoids: required number of cluster greater than total number of data points') - - if(present(c) ) c = 0 - - if (must_calculate_distance) then - allocate(dm(n,n), stat=stat) - if(stat /=0 ) call system_abort('bisect_kmedoids: could not allocate dm matrix.') - - call print('Started distance matrix calculation', verbosity=PRINT_NERD) - call distance_matrix(dat, dm, theta_fac=theta_fac,theta=theta) - call print('Finished distance matrix calculation', verbosity=PRINT_NERD) - my_cluster%dm => dm - else - my_cluster%dm => dat - endif - - ! start clustering - my_cluster%N = 1 ! start with one big cluster - allocate( my_cluster%cluster(1) ) - my_cluster%cluster(1)%N = n ! put every object in the initial cluster - allocate( my_cluster%cluster(1)%object(n) ) - my_cluster%cluster(1)%object = (/(i,i=1,n)/) - - allocate(dv(n)) ! distance vector, the sum of square of distances of points from central object - dv = sum(my_cluster%dm,dim=1) - my_cluster%cluster(1)%sse = minval( dv ) ! determine initial medoid, the object that is the - ml = minloc( dv ) ! closest to any other object in cluster - my_cluster%cluster(1)%medoid = ml(1) - deallocate(dv) - - ! main loop starts here, bisects initial clusters until desired number of - ! clusters are found - - iter = 0 - do - iter = iter + 1 - call print("Starting iteration "//iter,verbosity=PRINT_NERD) - - if( my_cluster%N == n_clusters_in ) exit - max_sse = -1.0_dp ! select cluster with greatest sse - do j = 1, my_cluster%N - if( max_sse < my_cluster%cluster(j)%sse ) then - i = j - max_sse = my_cluster%cluster(j)%sse - endif - enddo - nc = my_cluster%cluster(i)%N - if( nc==1 ) cycle - allocate( sub_cluster1(nc), sub_cluster2(nc), sub_cluster1_min(nc),sub_cluster2_min(nc) ) - - min_sse = huge(1.0_dp) - do j = 1, n_trial - m = ceiling( ran_uniform()*(nc-1) ) ! choose a bisecting point randomly - ml = minloc( sum( my_cluster%dm( my_cluster%cluster(i)%object(:m), my_cluster%cluster(i)%object(:m) ), dim=1) ) - lo_med_new = my_cluster%cluster(i)%object(ml(1)) - - ml = minloc( sum( my_cluster%dm( my_cluster%cluster(i)%object(m+1:), my_cluster%cluster(i)%object(m+1:) ), dim=1) ) - - hi_med_new = my_cluster%cluster(i)%object(ml(1) + m) - - ! the median of the 2 subclusters determined - lo_med = 0 - hi_med = 0 - - ! perform k-medoid clustering on the two subclusters - do km = 1, n_trial_k_med - if( (lo_med_new == lo_med) .and. (hi_med_new == hi_med) ) exit - lo_med = lo_med_new - hi_med = hi_med_new - n1 = 0 - n2 = 0 - !n1 = 1 - !n2 = 1 - !sub_cluster1(n1) = lo_med - !sub_cluster1(n2) = hi_med - - do k = 1, my_cluster%cluster(i)%N - if( my_cluster%dm(lo_med,my_cluster%cluster(i)%object(k)) < & - & my_cluster%dm(hi_med,my_cluster%cluster(i)%object(k)) ) then - n1 = n1 + 1 - sub_cluster1(n1) = my_cluster%cluster(i)%object(k) - else - n2 = n2 + 1 - sub_cluster2(n2) = my_cluster%cluster(i)%object(k) - endif - enddo - - ml = minloc( sum( my_cluster%dm( sub_cluster1(:n1), sub_cluster1(:n1) ), dim=1) ) - lo_med_new = sub_cluster1(ml(1)) - ml = minloc( sum( my_cluster%dm( sub_cluster2(:n2), sub_cluster2(:n2) ), dim=1) ) - hi_med_new = sub_cluster2(ml(1)) - enddo - sse = sum( my_cluster%dm(lo_med_new,sub_cluster1(:n1)) ) + sum( my_cluster%dm(hi_med_new,sub_cluster2(:n2)) ) - - ! choose the clustering that resulted the smallest sse - if( sse < min_sse ) then - min_sse = sse - sub_cluster1_min = sub_cluster1 - sub_cluster2_min = sub_cluster2 - n1_min = n1 - n2_min = n2 - lo_med_min = lo_med_new - hi_med_min = hi_med_new - endif - enddo - - ! now update the the clusters with the two new subclusters - tmp = my_cluster - - do j = 1, my_cluster%N - deallocate( my_cluster%cluster(j)%object ) - enddo - deallocate( my_cluster%cluster ) - my_cluster%N = my_cluster%N + 1 - allocate( my_cluster%cluster( my_cluster%N ) ) - - do j = 1, my_cluster%N - 1 - if( i == j ) then - allocate( my_cluster%cluster(j)%object(n1_min) ) - my_cluster%cluster(j)%N = n1_min - my_cluster%cluster(j)%object = sub_cluster1_min(:n1_min) - my_cluster%cluster(j)%sse = sum( my_cluster%dm(lo_med_min,sub_cluster1_min(:n1_min)) ) - my_cluster%cluster(j)%medoid = lo_med_min - else - my_cluster%cluster(j) = tmp%cluster(j) - endif - enddo - allocate( my_cluster%cluster(my_cluster%N)%object(n2_min) ) - my_cluster%cluster(my_cluster%N)%N = n2_min - my_cluster%cluster(my_cluster%N)%object = sub_cluster2_min(:n2_min) - my_cluster%cluster(my_cluster%N)%sse = sum( my_cluster%dm(hi_med_min,sub_cluster2_min(:n2_min)) ) - my_cluster%cluster(my_cluster%N)%medoid = hi_med_min - - do j = 1, tmp%N - deallocate( tmp%cluster(j)%object ) - enddo - deallocate( tmp%cluster, sub_cluster1, sub_cluster2, sub_cluster1_min, sub_cluster2_min ) - - call kmedoid(my_cluster) - enddo - - if( present(c) ) then - do j = 1, my_cluster%N - do k = 1, my_cluster%cluster(j)%N - i = my_cluster%cluster(j)%object(k) - c(i) = j - enddo - enddo - endif - - if( present(med) ) then - do j = 1, my_cluster%N - med(j) = my_cluster%cluster(j)%medoid - enddo - endif - - do j = 1, my_cluster%N - deallocate( my_cluster%cluster(j)%object ) - enddo - deallocate(my_cluster%cluster) - if (allocated(dm)) deallocate(dm) - - endsubroutine bisect_kmedoids - - subroutine kmedoid(this) - type(clstr), intent(inout) :: this - - type(clstr) :: tmp - integer, dimension(:), allocatable :: medoids - integer, dimension(1) :: ml - integer :: n, j, k - logical :: refined - - ! k-medoid-refinement - n = size(this%dm,1) - ! n: total number of objects - - tmp%N = this%N - allocate( tmp%cluster(tmp%N), medoids(tmp%N) ) - do j = 1, tmp%N - allocate( tmp%cluster(j)%object(n) ) - medoids(j) = this%cluster(j)%medoid - enddo - - ! main loop starts here, perfom k-medoid clustering until medoids don't - ! change anymore - do - do j = 1, tmp%N - tmp%cluster(j)%N = 0 - enddo - do j = 1, n - ml = minloc( this%dm(j,medoids) ) ! determine to which medoid each object belongs - k = ml(1) - tmp%cluster(k)%N = tmp%cluster(k)%N + 1 - tmp%cluster(k)%object(tmp%cluster(k)%N) = j - enddo - - ! re-determine the medoid in each cluster - do j = 1, tmp%N - ml = minloc( sum( this%dm( tmp%cluster(j)%object(:tmp%cluster(j)%N), & - & tmp%cluster(j)%object(:tmp%cluster(j)%N) ), dim=1) ) - tmp%cluster(j)%medoid = tmp%cluster(j)%object(ml(1)) - enddo - - refined = .true. - - ! check whether medoids have changed - do j = 1, tmp%N - refined = refined .and. (tmp%cluster(j)%medoid == medoids(j)) - medoids(j) = tmp%cluster(j)%medoid - enddo - if(refined) exit - enddo - - ! write results - do j = 1, tmp%N - deallocate( this%cluster(j)%object ) - allocate( this%cluster(j)%object( tmp%cluster(j)%N ) ) - this%cluster(j)%object = tmp%cluster(j)%object(:tmp%cluster(j)%N) - this%cluster(j)%N = tmp%cluster(j)%N - this%cluster(j)%medoid = tmp%cluster(j)%medoid - this%cluster(j)%sse = sum( this%dm(this%cluster(j)%medoid,& - & this%cluster(j)%object ) ) - - deallocate( tmp%cluster(j)%object ) - enddo - deallocate( tmp%cluster, medoids ) - - endsubroutine kmedoid - - subroutine cluster_kmeans(x,cluster_index,theta_fac,theta) - real(dp), dimension(:,:), intent(in) :: x - integer, dimension(:), intent(out) :: cluster_index - real(dp), intent(in), optional :: theta_fac - real(dp), dimension(:), intent(in), target, optional :: theta - - real(dp), dimension(:), pointer :: my_theta => null() - real(dp) :: my_theta_fac, d_min, d_ij, d_total, d_total_prev - - real(dp), dimension(:,:), allocatable :: cluster_centre - integer, dimension(:), allocatable :: cluster_info - integer :: d, n, m, i, j, k, cluster_info_old, iter, n_points_cluster_j - logical :: cluster_same - - d = size(x,1) - n = size(x,2) - m = size(cluster_index) - if( m > n ) call system_abort('cluster_kmeans: required number of clusters ('//m//') greater than total number of points ('//n//')') - - my_theta_fac = optional_default(1.0_dp, theta_fac) - if( present(theta) ) then - if( size(theta) == d) then - my_theta => theta - else - allocate(my_theta(d)) - my_theta = theta(1) - endif - else - allocate(my_theta(d)) - do i = 1, d - my_theta(i) = ( maxval(x(i,:)) - minval(x(i,:)) ) - if( my_theta(i) .feq. 0.0_dp ) my_theta(i) = 1.0_dp - enddo - my_theta = my_theta * my_theta_fac - endif - - allocate(cluster_centre(d,m),cluster_info(n)) - - call fill_random_integer(cluster_index, n) !choose random points as cluster centres. - - cluster_centre = x(:,cluster_index) - cluster_info = 0 - - iter = 0 - d_total = huge(1.0_dp) - do - iter = iter + 1 - call print("iteration: "//iter,verbosity=PRINT_NERD) - cluster_same = .true. - - d_total_prev = d_total - d_total = 0.0_dp -!$omp parallel do default(none) shared(n,m,x,cluster_info,cluster_centre,my_theta) & -!$omp reduction(.and.:cluster_same) & -!$omp private(i,j,d_min,d_ij,cluster_info_old) reduction(+:d_total) - do i = 1, n - d_min = huge(0.0_dp) - cluster_info_old = cluster_info(i) - do j = 1, m - d_ij = sum(( (cluster_centre(:,j) - x(:,i))/my_theta )**2) - if( d_ij < d_min ) then - d_min = d_ij - cluster_info(i) = j - endif - enddo - if( cluster_info_old /= cluster_info(i) ) cluster_same = cluster_same .and. .false. - d_total = d_total + d_min - enddo -!$omp end parallel do - call print("cluster_kmeans iteration="//iter//" d_total="//d_total) - -!$omp parallel do default(none) shared(x,cluster_centre,cluster_info,m,d,n) private(j,k,n_points_cluster_j) - do j = 1, m - n_points_cluster_j = count(cluster_info==j) - if( n_points_cluster_j == 0 ) then - cluster_centre(:,j) = x(:,ceiling(ran_uniform()*n)) - else - do k = 1, d - cluster_centre(k,j) = sum(x(k,:),mask=(cluster_info==j)) / n_points_cluster_j - enddo - endif - enddo -!$omp end parallel do - if( cluster_same ) exit - if( abs(d_total - d_total_prev) < KMEANS_THRESHOLD * d_total ) exit - enddo - - do j = 1, m - d_min = huge(0.0_dp) - do i = 1, n - d_ij = sum(( (cluster_centre(:,j) - x(:,i))/my_theta )**2) - if( d_ij < d_min ) then - d_min = d_ij - cluster_index(j) = i - endif - enddo - enddo - - deallocate(cluster_centre, cluster_info) - - if(present(theta)) then - my_theta => null() - else - deallocate(my_theta) - endif - - endsubroutine cluster_kmeans - - ! https://sites.google.com/site/dataclusteringalgorithms/fuzzy-c-means-clustering-algorithm - subroutine cluster_fuzzy_cmeans(x,cluster_index,theta_fac,theta,fuzziness) - real(dp), dimension(:,:), intent(in) :: x - integer, dimension(:), intent(out) :: cluster_index - real(dp), intent(in), optional :: theta_fac - real(dp), dimension(:), intent(in), target, optional :: theta - real(dp), intent(in), optional :: fuzziness - - real(dp), dimension(:), pointer :: my_theta => null() - real(dp) :: my_theta_fac, d_min, d_ij, d_total, d_total_prev - - real(dp), dimension(:,:), allocatable :: cluster_centre - real(dp), dimension(:,:), allocatable :: w - real(dp), dimension(:), allocatable, save :: wx_j, d_i - real(dp) :: w_j, w_old, my_fuzziness, alpha - integer :: d, n, m, i, j, iter - logical :: cluster_same -!$omp threadprivate(d_i, wx_j) - - d = size(x,1) - n = size(x,2) - m = size(cluster_index) - if( m > n ) call system_abort('cluster_fuzzy_cmeans: required number of clusters ('//m//') greater than total number of points ('//n//')') - - my_theta_fac = optional_default(1.0_dp, theta_fac) - my_fuzziness = optional_default(4.0_dp, fuzziness) - if( present(theta) ) then - if( size(theta) == d) then - my_theta => theta - else - allocate(my_theta(d)) - my_theta = theta(1) - endif - else - allocate(my_theta(d)) - do i = 1, d - my_theta(i) = ( maxval(x(i,:)) - minval(x(i,:)) ) - if( my_theta(i) .feq. 0.0_dp ) my_theta(i) = 1.0_dp - enddo - my_theta = my_theta * my_theta_fac - endif - - allocate(cluster_centre(d,m), w(n,m)) -!$omp parallel - allocate(d_i(m), wx_j(d)) -!$omp end parallel - - call fill_random_integer(cluster_index, n) !choose random points as cluster centres. - - cluster_centre = x(:,cluster_index) - do i = 1, m - do j = 1, d - cluster_centre(j,i) = cluster_centre(j,i) + ( ran_uniform() - 0.5_dp ) * cluster_jitter - enddo - enddo - - w = 0.0_dp - - iter = 0 - d_total = huge(1.0_dp) - do - iter = iter + 1 - call print("iteration: "//iter,verbosity=PRINT_NERD) - cluster_same = .true. - - d_total_prev = d_total - d_total = 0.0_dp - ! Calculate fuzzy membership -!$omp parallel do default(none) shared(n,m,my_theta,my_fuzziness,w,x,cluster_centre) & -!$omp private(i,j,alpha,w_old) reduction(.and.:cluster_same) reduction(+:d_total) - do i = 1, n - alpha = 0.0_dp - do j = 1, m - d_i(j) = sqrt(sum(( (cluster_centre(:,j) - x(:,i))/my_theta )**2)) - alpha = alpha + 1.0_dp / d_i(j)**(2.0_dp / (my_fuzziness - 1.0_dp)) - enddo - - do j = 1, m - w_old = w(i,j) - w(i,j) = 0.0_dp - - w(i,j) = 1.0_dp / d_i(j)**(2.0_dp / (my_fuzziness - 1.0_dp)) / alpha - if( w_old .fne. w(i,j) ) cluster_same = cluster_same .and. .false. - - d_total = d_total + d_i(j)**2 * w(i,j)**my_fuzziness - enddo - enddo -!$omp end parallel do - call print("cluster_fuzzy_cmeans iteration="//iter//" d_total="//d_total) - - ! Calculate fuzzy centres -!$omp parallel do default(none) shared(m,n,w,x,my_fuzziness,cluster_centre) & -!$omp private(i,j,w_j) - do j = 1, m - w_j = 0.0_dp - wx_j = 0.0_dp - - do i = 1, n - w_j = w_j + w(i,j)**my_fuzziness - wx_j = wx_j + x(:,i) * w(i,j)**my_fuzziness - enddo - - cluster_centre(:,j) = wx_j / w_j - enddo -!$omp end parallel do - - call print("cluster_same: "//cluster_same,verbosity=PRINT_NERD) - call print("d_total: "//d_total,verbosity=PRINT_NERD) - call print("d_total_prev: "//d_total_prev,verbosity=PRINT_NERD) - call print("d_total-d_total_prev: "//(d_total-d_total_prev),verbosity=PRINT_NERD) - - if( cluster_same ) exit - if( abs(d_total - d_total_prev) < KMEANS_THRESHOLD * d_total ) exit - enddo - - ! Allocate cluster centres to nearest points - do j = 1, m - d_min = huge(0.0_dp) - do i = 1, n - d_ij = sum(( (cluster_centre(:,j) - x(:,i))/my_theta )**2) - if( d_ij < d_min ) then - d_min = d_ij - cluster_index(j) = i - endif - enddo - enddo - - deallocate(cluster_centre, w) -!$omp parallel - if(allocated(d_i)) deallocate(d_i) - if(allocated(wx_j)) deallocate(wx_j) -!$omp end parallel - - if(present(theta)) then - my_theta => null() - else - deallocate(my_theta) - endif - - endsubroutine cluster_fuzzy_cmeans - - subroutine select_uniform(x,index_out) - real(dp), dimension(:,:), intent(in) :: x - integer, dimension(:), intent(out) :: index_out - - integer :: i, j, d, n, m, n_grid, i_global, i_index_out - integer, dimension(:), allocatable :: p_grid, i_hist, histogram, x_histogram, index_out_histogram - real(dp), dimension(:), allocatable :: lower_bound, upper_bound, x_range - - d = size(x,1) - n = size(x,2) - m = size(index_out) - - if( n < m ) call system_abort('select_uniform: n = '//n//' < m = '//m) - - allocate(lower_bound(d), upper_bound(d), x_range(d), p_grid(d), i_hist(d)) - - lower_bound = minval(x,dim=2) - upper_bound = maxval(x,dim=2) - x_range = upper_bound - lower_bound - - n_grid = ceiling( real(m,kind=dp)**(1.0_dp/real(d,kind=dp)) ) - p_grid = (/ ( n_grid**(i-1), i = 1, d ) /) - - allocate(histogram(n_grid**d)) - allocate(x_histogram(n),index_out_histogram(m)) - - histogram = 0 - - do i = 1, n - ! for each datapoint x(:,i) compute the bin index in each d direction - i_hist = nint( ( x(:,i) - lower_bound ) / x_range * (n_grid-1) ) + 1 - - ! map the bin index to a flat histogram bin index - i_global = sum((i_hist-1)*p_grid)+1 - histogram(i_global) = histogram(i_global) + 1 - - ! the i-th datapoint belongs to the i_global-th index in the histogram - x_histogram(i) = i_global - enddo - - index_out = 0 - i_index_out = 0 - - ! To monitor which bins the sparse points belong to. - index_out_histogram = 0 - - do i = 1, n - ! That's the exit condition if all sparse points are assigned before we - ! finish with the data points - if( all(index_out /= 0) ) exit - - if( all(x_histogram(i) /= index_out_histogram) ) then - ! We have just found a point which belongs to a bin that we haven't - ! selected yet in the sparse points - i_index_out = i_index_out + 1 - index_out(i_index_out) = i - index_out_histogram(i_index_out) = x_histogram(i) - endif - enddo - - do while ( any(index_out == 0) ) - ! We haven't yet assigned all sparse points. - - ! Select a bin randomly - i_global = ceiling( ran_uniform() * size(histogram) ) - - ! cycle if the bin is empty - if( histogram(i_global) == 0 ) cycle - - ! check if there are points belonging to this bin which we haven't - ! selected yet - if( count(x_histogram == i_global) == count(index_out_histogram == i_global) ) cycle - - do while (.true.) - ! select a point from x which belongs to that bin and add it to - ! the output. - i = ceiling( ran_uniform() * n ) - if( x_histogram(i) /= i_global .or. any(index_out == i) ) then - cycle - else - i_index_out = i_index_out + 1 - index_out(i_index_out) = i - index_out_histogram(i_index_out) = x_histogram(i) - exit - endif - enddo - enddo - - deallocate(lower_bound, upper_bound, x_range, p_grid, i_hist, histogram, x_histogram,index_out_histogram) - - if (.not. all(index_out /= 0)) call system_abort('select_uniform: could not assign all sparse points') - - endsubroutine select_uniform - - subroutine cur_decomposition(this, index_out, rank, n_iter) - ! based on 10.1073/pnas.0803205106 - - real(dp), intent(in), dimension(:,:) :: this - integer, dimension(:), intent(out) :: index_out - integer, intent(in), optional :: rank, n_iter - - integer :: n - integer :: expected_columns - integer :: my_n_iter, my_rank - type(LA_Matrix) :: LA_this - real(dp), allocatable, dimension(:) :: p, s, p_minus_ran_uniform - real(dp), allocatable, dimension(:,:) :: v - integer :: j, l - integer, allocatable, dimension(:), target :: p_index - integer, pointer, dimension(:) :: tmp_index_out => null() - real(dp), allocatable, dimension(:,:) :: C, Cp - real(dp) :: err, min_err - integer :: error - - expected_columns = size(index_out) - - if( expected_columns <= 0 ) then - call print_warning("cur_decomposition: called with expected_columns "//expected_columns//", can't be zero or less") - return - endif - - call initialise(LA_this,this) - - my_n_iter = optional_default(1, n_iter) - - if (present(rank)) then - call LA_Matrix_SVD_Allocate(LA_this,v=v,error=error) - HANDLE_ERROR(error) - call LA_Matrix_SVD(LA_this,v=v,error=error) - HANDLE_ERROR(error) - my_rank = rank - else - call LA_Matrix_SVD_Allocate(LA_this,s=s,v=v,error=error) - HANDLE_ERROR(error) - call LA_Matrix_SVD(LA_this,s=s,v=v,error=error) - HANDLE_ERROR(error) - my_rank = count(s > TOL_SVD) / 2 - endif - - n = size(v,1) - allocate(p(n), p_minus_ran_uniform(n), p_index(n)) - allocate( C(size(this,1),expected_columns), Cp(expected_columns,size(this,1)) ) - - p = sum(v(:,1:my_rank)**2, dim=2) - p = p * expected_columns - p = p / my_rank - p = min(p,1.0_dp) - - if(my_n_iter <= 0) then ! do not do probabilistic selection of columns - p_index = (/(j, j=1,n )/) - p_minus_ran_uniform = -p - call heap_sort(p_minus_ran_uniform,i_data=p_index) - index_out = p_index(1:expected_columns) - else - min_err = huge(1.0_dp) - do l = 1, my_n_iter - - ! randomly select columns according to the probabilities - do j = 1, n - p_minus_ran_uniform(j) = ran_uniform() - p(j) - p_index(j) = j ! initialise index array - end do - - call heap_sort(p_minus_ran_uniform,i_data=p_index) - tmp_index_out => p_index(1:expected_columns) - - C = this(:,tmp_index_out) - ! pinv: Moore-Penrose pseudo-inverse - call pseudo_inverse(C,Cp) - err = sum( (this - ( C .mult. Cp .mult. this))**2 ) - - call print("cur_decomposition: iteration: "//l//", error: "//err) - if(err < min_err) then ! this happens at least once - index_out = tmp_index_out - min_err = err - endif - - end do - endif - - call finalise(LA_this) - - tmp_index_out => null() - if(allocated(s)) deallocate(s) - if(allocated(v)) deallocate(v) - if(allocated(p)) deallocate(p) - if(allocated(p_minus_ran_uniform)) deallocate(p_minus_ran_uniform) - if(allocated(p_index)) deallocate(p_index) - if(allocated(C)) deallocate(C) - if(allocated(Cp)) deallocate(Cp) - - end subroutine cur_decomposition - -endmodule clustering_module diff --git a/3rdparty/gap/descriptors.f95 b/3rdparty/gap/descriptors.f95 deleted file mode 100644 index 927a0b7f..00000000 --- a/3rdparty/gap/descriptors.f95 +++ /dev/null @@ -1,15880 +0,0 @@ -! HND XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -! HND X -! HND X libAtoms+QUIP: atomistic simulation library -! HND X -! HND X Portions of this code were written by -! HND X Albert Bartok-Partay, Silvia Cereda, Gabor Csanyi, James Kermode, -! HND X Ivan Solt, Wojciech Szlachta, Csilla Varnai, Steven Winfield. -! HND X -! HND X Copyright 2006-2010. -! HND X -! HND X Not for distribution -! HND X -! HND X Portions of this code were written by Noam Bernstein as part of -! HND X his employment for the U.S. Government, and are not subject -! HND X to copyright in the USA. -! HND X -! HND X When using this software, please cite the following reference: -! HND X -! HND X http://www.libatoms.org -! HND X -! HND X Additional contributions by -! HND X Alessio Comisso, Chiara Gattinoni, and Gianpietro Moras -! HND X -! HND XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - -#include "error.inc" - -module descriptors_module - - use error_module - use system_module, only : dp, print, optional_default, system_timer, operator(//), split_string, string_to_int, split_string_simple, inoutput, OUTPUT, PRINT_VERBOSE, PRINT_NERD - use linkedlist_module - use units_module - use periodictable_module - use linearalgebra_module - use dictionary_module - use paramreader_module - use atoms_module - use atoms_types_module - use topology_module - use mpi_context_module - use table_module - use permutation_maker_module - use CInOutput_module - use clusters_module - use connection_module - use angular_functions_module - - implicit none - - private -#ifdef GAP_VERSION - integer, parameter :: gap_version = GAP_VERSION -#else - integer, parameter :: gap_version = 0 -#endif - - - integer, parameter, public :: DT_NONE = 0 - integer, parameter, public :: DT_BISPECTRUM_SO4 = 1 - integer, parameter, public :: DT_BISPECTRUM_SO3 = 2 - integer, parameter, public :: DT_BEHLER = 3 - integer, parameter, public :: DT_DISTANCE_2B = 4 - integer, parameter, public :: DT_COORDINATION = 5 - integer, parameter, public :: DT_ANGLE_3B = 6 - integer, parameter, public :: DT_CO_ANGLE_3B = 7 - integer, parameter, public :: DT_CO_DISTANCE_2B = 8 - integer, parameter, public :: DT_COSNX = 9 - integer, parameter, public :: DT_TRIHIS = 10 - integer, parameter, public :: DT_WATER_MONOMER = 11 - integer, parameter, public :: DT_WATER_DIMER = 12 - integer, parameter, public :: DT_A2_DIMER = 13 - integer, parameter, public :: DT_AB_DIMER = 14 - integer, parameter, public :: DT_BOND_REAL_SPACE = 15 - integer, parameter, public :: DT_ATOM_REAL_SPACE = 16 - integer, parameter, public :: DT_POWER_SO3 = 17 - integer, parameter, public :: DT_POWER_SO4 = 18 - integer, parameter, public :: DT_SOAP = 19 - integer, parameter, public :: DT_AN_MONOMER = 20 - integer, parameter, public :: DT_GENERAL_MONOMER = 21 - integer, parameter, public :: DT_GENERAL_DIMER = 22 - integer, parameter, public :: DT_GENERAL_TRIMER = 23 - integer, parameter, public :: DT_RDF = 24 - integer, parameter, public :: DT_AS_DISTANCE_2B = 25 - integer, parameter, public :: DT_MOLECULE_LO_D = 26 - integer, parameter, public :: DT_alex = 27 - integer, parameter, public :: DT_COM_DIMER = 28 - integer, parameter, public :: DT_DISTANCE_NB = 29 - integer, parameter, public :: DT_SOAP_EXPRESS = 30 - - integer, parameter :: NP_WATER_DIMER = 8 - integer, parameter :: NP_A2_DIMER = 8 - integer, parameter :: NP_AB_DIMER = 2 - - type transfer_parameters_type - logical :: do_transfer - real(dp) :: factor, r0, width - endtype transfer_parameters_type - - type descriptor_data_mono - real(dp), dimension(:), allocatable :: data - real(dp), dimension(:,:,:), allocatable :: grad_data - ! ci : atom indices amongst which to distribute energy of descriptor - ! ii : all atoms involved in descriptor (for partial derivatives) - integer, dimension(:), allocatable :: ci, ii - real(dp), dimension(:,:), allocatable :: pos - logical :: has_data - logical, dimension(:), allocatable :: has_grad_data - - real(dp) :: covariance_cutoff = 1.0_dp - real(dp), dimension(:,:), allocatable :: grad_covariance_cutoff - endtype descriptor_data_mono - - type cplx_2d - complex(dp), dimension(:,:), allocatable :: mm - endtype cplx_2d - - type real_2d - real(dp), dimension(:,:), allocatable :: mm - endtype real_2d - - type cplx_3d - complex(dp), dimension(:,:,:), allocatable :: mm - endtype cplx_3d - - type RadialFunction_type - integer :: n_max - real(dp) :: cutoff, min_cutoff - real(dp), dimension(:,:), allocatable :: RadialTransform - real(dp), dimension(:), allocatable :: NormFunction - - logical :: initialised = .false. - endtype RadialFunction_type - - type fourier_SO4_type - real(dp) :: cutoff - real(dp) :: z0_ratio - real(dp) :: z0 - integer :: j_max, Z - integer, dimension(:), allocatable :: species_Z - real(dp), dimension(:), allocatable :: w - - logical :: initialised = .false. - endtype fourier_SO4_type - - type bispectrum_SO4 - real(dp), pointer :: cutoff - integer, pointer :: j_max, Z - real(dp), pointer :: z0_ratio - real(dp), pointer :: z0 - - integer, dimension(:), pointer :: species_Z - real(dp), dimension(:), pointer :: w - - type(fourier_SO4_type) :: fourier_SO4 - - logical :: initialised = .false. - - endtype bispectrum_SO4 - - type bispectrum_SO3 - - integer :: l_max, n_max, Z - real(dp) :: cutoff, min_cutoff - - type(RadialFunction_type) :: radial - - integer, dimension(:), allocatable :: species_Z - real(dp), dimension(:), allocatable :: w - - logical :: initialised = .false. - - endtype bispectrum_SO3 - - type behler_g2 - real(dp) :: eta - real(dp) :: rs - real(dp) :: rc - endtype behler_g2 - - type behler_g3 - real(dp) :: eta - real(dp) :: lambda - real(dp) :: zeta - real(dp) :: rc - endtype behler_g3 - - type behler - - real(dp) :: cutoff = 0.0_dp - logical :: initialised = .false. - - integer :: n_g2, n_g3 - type(behler_g2), dimension(:), allocatable :: g2 - type(behler_g3), dimension(:), allocatable :: g3 - - endtype behler - - type distance_2b - real(dp) :: cutoff - real(dp) :: cutoff_transition_width - integer :: Z1, Z2 - character(STRING_LENGTH) :: resid_name - logical :: only_intra, only_inter - - integer :: n_exponents, tail_exponent - real(dp) :: tail_range - integer, dimension(:), allocatable :: exponents - - logical :: has_tail - logical :: initialised = .false. - - endtype distance_2b - - type coordination - real(dp) :: cutoff - real(dp) :: transition_width - integer :: Z - - logical :: initialised = .false. - - endtype coordination - - type angle_3b - real(dp) :: cutoff - real(dp) :: cutoff_transition_width - integer :: Z, Z1, Z2 - - logical :: initialised = .false. - - endtype angle_3b - - type co_angle_3b - real(dp) :: cutoff - real(dp) :: coordination_cutoff - real(dp) :: coordination_transition_width - integer :: Z, Z1, Z2 - - logical :: initialised = .false. - - endtype co_angle_3b - - type co_distance_2b - real(dp) :: cutoff - real(dp) :: transition_width - real(dp) :: coordination_cutoff - real(dp) :: coordination_transition_width - integer :: Z1, Z2 - - logical :: initialised = .false. - - endtype co_distance_2b - - type cosnx - - integer :: l_max, n_max, Z - real(dp) :: cutoff, min_cutoff - - type(RadialFunction_type) :: radial - - integer, dimension(:), allocatable :: species_Z - real(dp), dimension(:), allocatable :: w - - logical :: initialised = .false. - - endtype cosnx - - type trihis - real(dp) :: cutoff - integer :: n_gauss - - real(dp), dimension(:,:), allocatable :: gauss_centre - real(dp), dimension(:,:), allocatable :: gauss_width - - logical :: initialised = .false. - - endtype trihis - - type water_monomer - real(dp) :: cutoff - - logical :: initialised = .false. - - endtype water_monomer - - type water_dimer - real(dp) :: cutoff, cutoff_transition_width - real(dp) :: monomer_cutoff - logical :: OHH_ordercheck - real(dp) :: power - - logical :: initialised = .false. - - endtype water_dimer - - type A2_dimer - real(dp) :: cutoff - real(dp) :: monomer_cutoff - integer :: atomic_number - - logical :: initialised = .false. - - endtype A2_dimer - - type AB_dimer - real(dp) :: cutoff - real(dp) :: monomer_cutoff - integer :: atomic_number1, atomic_number2 - - logical :: initialised = .false. - - endtype AB_dimer - - type bond_real_space - real(dp) :: bond_cutoff - real(dp) :: bond_transition_width - real(dp) :: cutoff - real(dp) :: transition_width - real(dp) :: atom_sigma - integer :: max_neighbours - - logical :: initialised = .false. - - endtype bond_real_space - - type atom_real_space - real(dp) :: cutoff - real(dp) :: cutoff_transition_width - integer :: l_max - real(dp) :: alpha - real(dp) :: zeta - - logical :: initialised = .false. - - endtype atom_real_space - - type power_so3 - integer :: l_max, n_max, Z - real(dp) :: cutoff, min_cutoff - - type(RadialFunction_type) :: radial - - integer, dimension(:), allocatable :: species_Z - real(dp), dimension(:), allocatable :: w - - logical :: initialised = .false. - endtype power_so3 - - type power_SO4 - real(dp), pointer :: cutoff - integer, pointer :: j_max, Z - real(dp), pointer :: z0_ratio - real(dp), pointer :: z0 - - integer, dimension(:), pointer :: species_Z - real(dp), dimension(:), pointer :: w - - type(fourier_SO4_type) :: fourier_SO4 - - logical :: initialised = .false. - - endtype power_SO4 - - type soap - real(dp) :: cutoff - real(dp) :: cutoff_transition_width - real(dp) :: alpha, atom_sigma, covariance_sigma0, central_weight - - integer :: cutoff_dexp - real(dp) :: cutoff_scale - real(dp) :: cutoff_rate - integer :: l_max, n_max, n_Z, n_species - integer, dimension(:), allocatable :: species_Z, Z - real(dp), dimension(:), allocatable :: r_basis - real(dp), dimension(:,:), allocatable :: transform_basis,cholesky_overlap_basis - - logical :: global = .false. - logical :: central_reference_all_species = .false. - logical :: diagonal_radial = .false. - logical :: normalise = .true. - logical :: initialised = .false. - endtype soap - public :: soap - - type AN_monomer - real(dp) :: cutoff - integer :: atomic_number - integer :: N - - logical :: initialised = .false. - logical :: do_atomic = .false. - - endtype AN_monomer - - type general_monomer - type(permutation_data_type) :: permutation_data - integer, dimension(:), allocatable :: signature - real(dp) :: cutoff, cutoff_transition_width - logical :: atom_ordercheck, internal_swaps_only - logical :: strict - real(dp) :: power - logical :: initialised = .false. - endtype general_monomer - public :: general_monomer - - type general_dimer - type(permutation_data_type) :: permutation_data - integer, dimension(:), allocatable :: signature_one, signature_two - integer, dimension(:,:), allocatable :: component_atoms - real(dp) :: cutoff, cutoff_transition_width, monomer_one_cutoff, monomer_two_cutoff - logical :: atom_ordercheck, internal_swaps_only, use_smooth_cutoff, monomers_identical,double_count - logical :: strict, use_com, mpifind, strict_mask - type(transfer_parameters_type) :: transfer_parameters - logical :: initialised = .false. - logical, dimension(:), allocatable :: is_intermolecular, cutoff_contributor - real(dp) :: power - endtype general_dimer - - type general_trimer - type(permutation_data_type) :: permutation_data - integer, dimension(:), allocatable :: signature_one, signature_two, signature_three - integer, dimension(:,:), allocatable :: component_atoms - real(dp) :: cutoff, cutoff_transition_width, monomer_one_cutoff, monomer_two_cutoff, monomer_three_cutoff - logical :: atom_ordercheck, internal_swaps_only, use_smooth_cutoff, one_two_identical, one_three_identical, two_three_identical - logical :: strict, use_com, mpifind - logical :: initialised = .false. - logical, dimension(:), allocatable :: is_intermolecular, cutoff_contributor - real(dp) :: power - endtype general_trimer - - type rdf - real(dp) :: cutoff - real(dp) :: transition_width, w_gauss - integer :: Z, n_gauss - real(dp), dimension(:), allocatable :: r_gauss - - logical :: initialised = .false. - - endtype rdf - - type as_distance_2b - real(dp) :: min_cutoff, max_cutoff, as_cutoff, overlap_alpha - real(dp) :: min_transition_width, max_transition_width, as_transition_width - real(dp) :: coordination_cutoff - real(dp) :: coordination_transition_width - integer :: Z1, Z2 - - logical :: initialised = .false. - - endtype as_distance_2b - - type molecule_lo_d - type(permutation_data_type) :: permutation_data - type(Atoms) :: template_atoms - integer :: n_atoms, max_dimension ! max_dimension is descriptor dimension if include all interatomic distances - integer, dimension(:), allocatable :: signature, included_components - integer, dimension(:,:), allocatable :: component_atoms - real(dp) :: cutoff, cutoff_transition_width - integer :: neighbour_graph_depth - logical :: atom_ordercheck, use_smooth_cutoff - logical :: initialised = .false. - type(Table) :: bonds, atom_pairs - integer :: desctype - endtype molecule_lo_d - - type alex - - integer :: Z, power_min, power_max - real(dp) :: cutoff - - integer :: n_species - integer, dimension(:), allocatable :: species_Z - - logical :: initialised = .false. - endtype alex - - type com_dimer - integer, dimension(:), allocatable :: signature_one, signature_two - real(dp) :: cutoff, cutoff_transition_width, monomer_one_cutoff, monomer_two_cutoff - logical :: atom_ordercheck, use_smooth_cutoff, monomers_identical - logical :: strict, mpifind - type(transfer_parameters_type) :: transfer_parameters - logical :: initialised = .false. - logical, dimension(:), allocatable :: is_intermolecular, cutoff_contributor - endtype com_dimer - - type distance_Nb - real(dp) :: cutoff - real(dp) :: cutoff_transition_width - integer :: order - integer, dimension(:), allocatable :: Z - integer :: n_permutations - integer, dimension(:,:), allocatable :: permutations - logical, dimension(:,:,:), allocatable :: monomerConnectivities - logical :: compact_clusters = .false. - logical :: initialised = .false. - endtype distance_Nb - - type soap_express - ! User controllable parameters - real(dp) :: cutoff - real(dp) :: cutoff_transition_width - integer :: cutoff_decay_rate - - real(dp) :: atom_sigma_radial, atom_sigma_angular, central_weight, covariance_sigma0, & - atom_sigma_scaling_radial, atom_sigma_scaling_angular, amplitude_scaling - - integer :: l_max, n_max - - ! Internal pre-initialised variables - real(dp), dimension(:,:), allocatable :: basis_transformation_coefficients, & - overlap - real(dp), dimension(:), allocatable :: semifactorial_table, Y_lm_prefactor - - integer :: angular_array_size - - logical :: initialised = .false. - endtype soap_express - - type descriptor - integer :: descriptor_type = DT_NONE - - type(bispectrum_SO4) :: descriptor_bispectrum_SO4 - type(bispectrum_SO3) :: descriptor_bispectrum_SO3 - type(behler) :: descriptor_behler - type(distance_2b) :: descriptor_distance_2b - type(coordination) :: descriptor_coordination - type(angle_3b) :: descriptor_angle_3b - type(co_angle_3b) :: descriptor_co_angle_3b - type(co_distance_2b) :: descriptor_co_distance_2b - type(cosnx) :: descriptor_cosnx - type(trihis) :: descriptor_trihis - type(water_monomer) :: descriptor_water_monomer - type(water_dimer) :: descriptor_water_dimer - type(A2_dimer) :: descriptor_A2_dimer - type(AB_dimer) :: descriptor_AB_dimer - type(bond_real_space) :: descriptor_bond_real_space - type(atom_real_space) :: descriptor_atom_real_space - type(power_so3) :: descriptor_power_so3 - type(power_SO4) :: descriptor_power_SO4 - type(soap) :: descriptor_soap - type(AN_monomer) :: descriptor_AN_monomer - type(general_monomer) :: descriptor_general_monomer - type(general_dimer) :: descriptor_general_dimer - type(general_trimer) :: descriptor_general_trimer - type(rdf) :: descriptor_rdf - type(as_distance_2b) :: descriptor_as_distance_2b - type(molecule_lo_d) :: descriptor_molecule_lo_d - type(alex) :: descriptor_alex - type(com_dimer) :: descriptor_com_dimer - type(distance_Nb) :: descriptor_distance_Nb - type(soap_express) :: descriptor_soap_express - endtype - - type descriptor_data - type(descriptor_data_mono), dimension(:), allocatable :: x - endtype descriptor_data - - type cplx_1d - complex(dp), dimension(:), allocatable :: m - endtype cplx_1d - - type real_1d - real(dp), dimension(:), allocatable :: m - endtype real_1d - - type spherical_harmonics_type - type(cplx_1d), dimension(:), allocatable :: spherical_harmonics - type(cplx_2d), dimension(:), allocatable :: grad_spherical_harmonics - real(dp) :: r - real(dp), dimension(3) :: u - endtype spherical_harmonics_type - - type neighbour_type - type(spherical_harmonics_type), dimension(:), allocatable :: neighbour - endtype neighbour_type - - type grad_spherical_harmonics_overlap_type - type(cplx_3d), dimension(:), allocatable :: grad_integral - endtype grad_spherical_harmonics_overlap_type - - public :: neighbour_type, real_space_fourier_coefficients, real_space_covariance_coefficient - public :: SphericalYCartesian - - interface initialise - module procedure descriptor_initialise, RadialFunction_initialise, fourier_so4_initialise, & - bispectrum_SO4_initialise, bispectrum_SO3_initialise, behler_initialise, distance_2b_initialise, & - coordination_initialise, angle_3b_initialise, co_angle_3b_initialise, co_distance_2b_initialise, cosnx_initialise, trihis_initialise, & - water_monomer_initialise, water_dimer_initialise, A2_dimer_initialise, AB_dimer_initialise, & - bond_real_space_initialise, atom_real_space_initialise, power_so3_initialise, power_SO4_initialise, soap_initialise, AN_monomer_initialise, & - general_monomer_initialise, general_dimer_initialise, general_trimer_initialise, rdf_initialise, as_distance_2b_initialise, molecule_lo_d_initialise, alex_initialise, & - transfer_initialise, com_dimer_initialise, distance_Nb_initialise, soap_express_initialise - endinterface initialise - public :: initialise - - interface finalise - module procedure descriptor_finalise, descriptor_data_finalise, RadialFunction_finalise, fourier_so4_finalise, cplx_2d_array1_finalise, cplx_3d_array2_finalise, & - bispectrum_SO4_finalise, bispectrum_SO3_finalise, behler_finalise, distance_2b_finalise, coordination_finalise, angle_3b_finalise, co_angle_3b_finalise, & - co_distance_2b_finalise, cosnx_finalise, trihis_finalise, water_monomer_finalise, water_dimer_finalise, & - A2_dimer_finalise, AB_dimer_finalise, bond_real_space_finalise, atom_real_space_finalise, power_so3_finalise, power_SO4_finalise, soap_finalise, & - AN_monomer_finalise, general_monomer_finalise, general_dimer_finalise, general_trimer_finalise, rdf_finalise, as_distance_2b_finalise, molecule_lo_d_finalise, alex_finalise, com_dimer_finalise, & - distance_Nb_finalise, soap_express_finalise - endinterface finalise - public :: finalise - - interface calc - module procedure descriptor_calc, descriptor_calc_array, bispectrum_SO4_calc, bispectrum_SO3_calc, behler_calc, distance_2b_calc, coordination_calc, angle_3b_calc, co_angle_3b_calc, & - co_distance_2b_calc, cosnx_calc, trihis_calc, water_monomer_calc, water_dimer_calc, A2_dimer_calc, AB_dimer_calc, bond_real_space_calc, atom_real_space_calc, & - power_so3_calc, power_SO4_calc, soap_calc, AN_monomer_calc, general_monomer_calc, general_dimer_calc, general_trimer_calc, rdf_calc, as_distance_2b_calc, molecule_lo_d_calc, alex_calc, com_dimer_calc, & - distance_Nb_calc, soap_express_calc - endinterface calc - public :: calc - - interface cutoff - module procedure descriptor_cutoff, bispectrum_SO4_cutoff, bispectrum_SO3_cutoff, behler_cutoff, distance_2b_cutoff, coordination_cutoff, angle_3b_cutoff, co_angle_3b_cutoff, & - co_distance_2b_cutoff, cosnx_cutoff, trihis_cutoff, water_monomer_cutoff, water_dimer_cutoff, A2_dimer_cutoff, AB_dimer_cutoff, bond_real_space_cutoff, atom_real_space_cutoff, & - power_so3_cutoff, power_SO4_cutoff, soap_cutoff, AN_monomer_cutoff, general_monomer_cutoff, general_dimer_cutoff, general_trimer_cutoff, rdf_cutoff, as_distance_2b_cutoff, & - molecule_lo_d_cutoff, alex_cutoff, com_dimer_cutoff, distance_Nb_cutoff, soap_express_cutoff - endinterface cutoff - public :: cutoff - - interface descriptor_sizes - module procedure descriptor_sizes, bispectrum_SO4_sizes, bispectrum_SO3_sizes, behler_sizes, distance_2b_sizes, coordination_sizes, angle_3b_sizes, co_angle_3b_sizes, & - co_distance_2b_sizes, cosnx_sizes, trihis_sizes, water_monomer_sizes, water_dimer_sizes, A2_dimer_sizes, AB_dimer_sizes, bond_real_space_sizes, atom_real_space_sizes, & - power_so3_sizes, power_SO4_sizes, soap_sizes, AN_monomer_sizes, general_monomer_sizes, general_dimer_sizes, general_trimer_sizes, rdf_sizes, as_distance_2b_sizes, & - molecule_lo_d_sizes, alex_sizes, com_dimer_sizes, distance_Nb_sizes, soap_express_sizes - endinterface descriptor_sizes - public :: descriptor_sizes - - public :: descriptor_MPI_setup - - public :: descriptor, descriptor_data, descriptor_dimensions, descriptor_n_permutations, descriptor_permutations, descriptor_str_add_species - public :: real_space_covariance - public :: cplx_1d, cplx_2d - - ! for quippy3 to compile, not needed for GAP functionality. - ! TODO: exclude the ones not necessary or sole it in some dofferent way on the QUIP side - public :: bispectrum_so4, bispectrum_so3, behler, distance_2b, coordination, angle_3b, co_angle_3b, co_distance_2b, cosnx, trihis, water_monomer, & - water_dimer, a2_dimer, bond_real_space, power_so3, power_so4, an_monomer, general_dimer, general_trimer, rdf, & - as_distance_2b, molecule_lo_d, alex, com_dimer, distance_nb, descriptor_data_mono, & - fourier_so4_type, radialfunction_type, transfer_parameters_type, ab_dimer, atom_real_space, spherical_harmonics_type, & - behler_g2, behler_g3, soap_express - - contains - - function get_descriptor_type(args_str,error) - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - integer :: get_descriptor_type - - type(Dictionary) :: params - logical :: is_bispectrum_so4, is_bispectrum_so3, is_behler, is_distance_2b, is_coordination, is_angle_3b, & - is_co_angle_3b, is_co_distance_2b, is_cosnx, is_trihis, is_water_monomer, is_water_dimer, is_A2_dimer, & - is_AB_dimer, is_bond_real_space, is_atom_real_space, is_power_so3, is_power_so4, is_soap, & - is_AN_monomer, is_general_monomer, is_general_dimer, is_general_trimer, is_rdf, is_as_distance_2b, & - is_molecule_lo_d, is_alex, is_com_dimer, is_distance_Nb, is_soap_express - - INIT_ERROR(error) - - call initialise(params) - call param_register(params, 'bispectrum_so4', 'false', is_bispectrum_so4, help_string="Type of descriptor is bispectrum_so4.") - call param_register(params, 'bispectrum_so3', 'false', is_bispectrum_so3, help_string="Type of descriptor is bispectrum_so3.") - call param_register(params, 'behler', 'false', is_behler, help_string="Type of descriptor is behler.") - call param_register(params, 'distance_2b', 'false', is_distance_2b, help_string="Type of descriptor is distance_2b.") - call param_register(params, 'coordination', 'false', is_coordination, help_string="Type of descriptor is coordination.") - call param_register(params, 'angle_3b', 'false', is_angle_3b, help_string="Type of descriptor is angle_3b.") - call param_register(params, 'co_angle_3b', 'false', is_co_angle_3b, help_string="Type of descriptor is co_angle_3b.") - call param_register(params, 'co_distance_2b', 'false', is_co_distance_2b, help_string="Type of descriptor is co_distance_2b.") - call param_register(params, 'cosnx', 'false', is_cosnx, help_string="Type of descriptor is cosnx.") - call param_register(params, 'trihis', 'false', is_trihis, help_string="Type of descriptor is trihis.") - call param_register(params, 'water_monomer', 'false', is_water_monomer, help_string="Type of descriptor is water_monomer.") - call param_register(params, 'water_dimer', 'false', is_water_dimer, help_string="Type of descriptor is water_dimer.") - call param_register(params, 'A2_dimer', 'false', is_A2_dimer, help_string="Type of descriptor is A2_dimer.") - call param_register(params, 'AB_dimer', 'false', is_AB_dimer, help_string="Type of descriptor is AB_dimer.") - call param_register(params, 'bond_real_space', 'false', is_bond_real_space, help_string="Type of descriptor is bond_real_space.") - call param_register(params, 'atom_real_space', 'false', is_atom_real_space, help_string="Type of descriptor is atom_real_space.") - call param_register(params, 'power_so3', 'false', is_power_so3, help_string="Type of descriptor is power_so3.") - call param_register(params, 'power_so4', 'false', is_power_so4, help_string="Type of descriptor is power_so4.") - call param_register(params, 'soap', 'false', is_soap, help_string="Type of descriptor is soap.") - call param_register(params, 'AN_monomer', 'false', is_AN_monomer, help_string="Type of descriptor is AN_monomer.") - call param_register(params, 'general_monomer', 'false', is_general_monomer, help_string="Type of descriptor is general_monomer.") - call param_register(params, 'general_dimer', 'false', is_general_dimer, help_string="Type of descriptor is general_dimer.") - call param_register(params, 'general_trimer', 'false', is_general_trimer, help_string="Type of descriptor is general_trimer.") - call param_register(params, 'rdf', 'false', is_rdf, help_string="Type of descriptor is rdf.") - call param_register(params, 'as_distance_2b', 'false', is_as_distance_2b, help_string="Type of descriptor is as_distance_2b.") - call param_register(params, 'molecule_lo_d', 'false', is_molecule_lo_d, help_string="Type of descriptor is molecule_lo_d.") - call param_register(params, 'alex', 'false', is_alex, help_string="Type of descriptor is alex.") - call param_register(params, 'com_dimer', 'false', is_com_dimer, help_string="Type of descriptor is com_dimer.") - call param_register(params, 'distance_Nb', 'false', is_distance_Nb, help_string="Type of descriptor is distance_Nb.") - call param_register(params, 'soap_express', 'false', is_soap_express, help_string="Type of descriptor is soap_express.") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='descriptor_initialise args_str')) then - RAISE_ERROR("descriptor_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - if (count( (/is_bispectrum_so4, is_bispectrum_so3, is_behler, is_distance_2b, is_coordination, is_angle_3b, is_co_angle_3b, is_co_distance_2b, & - is_cosnx, is_trihis, is_water_monomer, is_water_dimer, is_A2_dimer, is_AB_dimer, is_bond_real_space, is_atom_real_space, is_power_so3, is_power_so4, & - is_soap, is_AN_monomer, is_general_monomer, is_general_dimer, is_general_trimer, is_rdf, is_as_distance_2b, is_molecule_lo_d, is_alex, is_com_dimer, & - is_distance_Nb, is_soap_express /) ) /= 1) then - RAISE_ERROR("descriptor_initialise found too few or too many IP Model types args_str='"//trim(args_str)//"'", error) - endif - - get_descriptor_type = DT_NONE - - if( is_bispectrum_so4 ) then - get_descriptor_type = DT_BISPECTRUM_SO4 - elseif( is_bispectrum_so3 ) then - get_descriptor_type = DT_BISPECTRUM_SO3 - elseif( is_behler ) then - get_descriptor_type = DT_BEHLER - elseif( is_distance_2b ) then - get_descriptor_type = DT_DISTANCE_2B - elseif( is_coordination ) then - get_descriptor_type = DT_COORDINATION - elseif( is_angle_3b ) then - get_descriptor_type = DT_ANGLE_3B - elseif( is_co_angle_3b ) then - get_descriptor_type = DT_CO_ANGLE_3B - elseif( is_co_distance_2b ) then - get_descriptor_type = DT_CO_DISTANCE_2B - elseif( is_cosnx ) then - get_descriptor_type = DT_COSNX - elseif( is_trihis ) then - get_descriptor_type = DT_TRIHIS - elseif( is_water_monomer ) then - get_descriptor_type = DT_WATER_MONOMER - elseif( is_water_dimer ) then - get_descriptor_type = DT_WATER_DIMER - elseif( is_A2_dimer ) then - get_descriptor_type = DT_A2_DIMER - elseif( is_AB_dimer ) then - get_descriptor_type = DT_AB_DIMER - elseif( is_bond_real_space ) then - get_descriptor_type = DT_BOND_REAL_SPACE - elseif( is_atom_real_space ) then - get_descriptor_type = DT_ATOM_REAL_SPACE - elseif( is_power_so3 ) then - get_descriptor_type = DT_POWER_SO3 - elseif( is_power_so4 ) then - get_descriptor_type = DT_POWER_SO4 - elseif( is_soap ) then - get_descriptor_type = DT_SOAP - elseif( is_AN_monomer ) then - get_descriptor_type = DT_AN_MONOMER - elseif( is_general_monomer ) then - get_descriptor_type = DT_GENERAL_MONOMER - elseif( is_general_dimer ) then - get_descriptor_type = DT_GENERAL_DIMER - elseif( is_general_trimer ) then - get_descriptor_type = DT_GENERAL_TRIMER - elseif( is_rdf ) then - get_descriptor_type = DT_RDF - elseif( is_as_distance_2b ) then - get_descriptor_type = DT_AS_DISTANCE_2B - elseif( is_molecule_lo_d ) then - get_descriptor_type = DT_MOLECULE_LO_D - elseif( is_alex ) then - get_descriptor_type = DT_ALEX - elseif( is_com_dimer ) then - get_descriptor_type = DT_COM_DIMER - elseif( is_distance_Nb ) then - get_descriptor_type = DT_DISTANCE_NB - elseif( is_soap_express ) then - get_descriptor_type = DT_SOAP_EXPRESS - endif - - endfunction get_descriptor_type - - subroutine descriptor_initialise(this,args_str,error) - type(descriptor), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - call finalise(this) - - this%descriptor_type = get_descriptor_type(args_str,error) - - select case(this%descriptor_type) - case(DT_BISPECTRUM_SO4) - call initialise(this%descriptor_bispectrum_SO4,args_str,error) - case(DT_BISPECTRUM_SO3) - call initialise(this%descriptor_bispectrum_SO3,args_str,error) - case(DT_BEHLER) - call initialise(this%descriptor_behler,args_str,error) - case(DT_DISTANCE_2B) - call initialise(this%descriptor_distance_2b,args_str,error) - case(DT_COORDINATION) - call initialise(this%descriptor_coordination,args_str,error) - case(DT_ANGLE_3B) - call initialise(this%descriptor_angle_3b,args_str,error) - case(DT_CO_ANGLE_3B) - call initialise(this%descriptor_co_angle_3b,args_str,error) - case(DT_CO_DISTANCE_2B) - call initialise(this%descriptor_co_distance_2b,args_str,error) - case(DT_COSNX) - call initialise(this%descriptor_cosnx,args_str,error) - case(DT_TRIHIS) - call initialise(this%descriptor_trihis,args_str,error) - case(DT_WATER_MONOMER) - call initialise(this%descriptor_water_monomer,args_str,error) - case(DT_WATER_DIMER) - call initialise(this%descriptor_water_dimer,args_str,error) - case(DT_A2_DIMER) - call initialise(this%descriptor_A2_dimer,args_str,error) - case(DT_AB_DIMER) - call initialise(this%descriptor_AB_dimer,args_str,error) - case(DT_BOND_REAL_SPACE) - call initialise(this%descriptor_bond_real_space,args_str,error) - case(DT_ATOM_REAL_SPACE) - call initialise(this%descriptor_atom_real_space,args_str,error) - case(DT_POWER_SO3) - call initialise(this%descriptor_power_so3,args_str,error) - case(DT_POWER_SO4) - call initialise(this%descriptor_power_so4,args_str,error) - case(DT_SOAP) - call initialise(this%descriptor_soap,args_str,error) - case(DT_AN_MONOMER) - call initialise(this%descriptor_AN_monomer,args_str,error) - case(DT_GENERAL_MONOMER) - call initialise(this%descriptor_general_monomer,args_str,error) - case(DT_GENERAL_DIMER) - call initialise(this%descriptor_general_dimer,args_str,error) - case(DT_GENERAL_TRIMER) - call initialise(this%descriptor_general_trimer,args_str,error) - case(DT_RDF) - call initialise(this%descriptor_rdf,args_str,error) - case(DT_AS_DISTANCE_2B) - call initialise(this%descriptor_as_distance_2b,args_str,error) - case(DT_MOLECULE_LO_D) - call initialise(this%descriptor_molecule_lo_d,args_str,error) - case(DT_ALEX) - call initialise(this%descriptor_alex,args_str,error) - case(DT_COM_DIMER) - call initialise(this%descriptor_com_dimer,args_str,error) - case(DT_DISTANCE_NB) - call initialise(this%descriptor_distance_Nb,args_str,error) - case(DT_SOAP_EXPRESS) - call initialise(this%descriptor_soap_express,args_str,error) - endselect - - endsubroutine descriptor_initialise - - subroutine descriptor_finalise(this,error) - type(descriptor), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - selectcase(this%descriptor_type) - case(DT_BISPECTRUM_SO4) - call finalise(this%descriptor_bispectrum_SO4,error) - case(DT_BISPECTRUM_SO3) - call finalise(this%descriptor_bispectrum_SO3,error) - case(DT_BEHLER) - call finalise(this%descriptor_behler,error) - case(DT_DISTANCE_2b) - call finalise(this%descriptor_distance_2b,error) - case(DT_COORDINATION) - call finalise(this%descriptor_coordination,error) - case(DT_ANGLE_3B) - call finalise(this%descriptor_angle_3b,error) - case(DT_CO_ANGLE_3B) - call finalise(this%descriptor_co_angle_3b,error) - case(DT_CO_DISTANCE_2b) - call finalise(this%descriptor_co_distance_2b,error) - case(DT_COSNX) - call finalise(this%descriptor_cosnx,error) - case(DT_TRIHIS) - call finalise(this%descriptor_trihis,error) - case(DT_WATER_MONOMER) - call finalise(this%descriptor_water_monomer,error) - case(DT_WATER_DIMER) - call finalise(this%descriptor_water_dimer,error) - case(DT_A2_dimer) - call finalise(this%descriptor_A2_dimer,error) - case(DT_AB_dimer) - call finalise(this%descriptor_AB_dimer,error) - case(DT_BOND_REAL_SPACE) - call finalise(this%descriptor_bond_real_space,error) - case(DT_ATOM_REAL_SPACE) - call finalise(this%descriptor_atom_real_space,error) - case(DT_POWER_SO3) - call finalise(this%descriptor_power_so3,error) - case(DT_POWER_SO4) - call finalise(this%descriptor_power_so4,error) - case(DT_SOAP) - call finalise(this%descriptor_soap,error) - case(DT_GENERAL_MONOMER) - call finalise(this%descriptor_general_monomer,error) - case(DT_GENERAL_DIMER) - call finalise(this%descriptor_general_dimer,error) - case(DT_GENERAL_TRIMER) - call finalise(this%descriptor_general_trimer,error) - case(DT_RDF) - call finalise(this%descriptor_rdf,error) - case(DT_AS_DISTANCE_2b) - call finalise(this%descriptor_as_distance_2b,error) - case(DT_MOLECULE_LO_D) - call finalise(this%descriptor_molecule_lo_d,error) - case(DT_ALEX) - call finalise(this%descriptor_alex,error) - case(DT_COM_DIMER) - call finalise(this%descriptor_com_dimer,error) - case(DT_DISTANCE_Nb) - call finalise(this%descriptor_distance_Nb,error) - case(DT_SOAP_EXPRESS) - call finalise(this%descriptor_soap_express,error) - endselect - - this%descriptor_type = DT_NONE - - endsubroutine descriptor_finalise - - subroutine descriptor_MPI_setup(this,at,mpi,mpi_mask,error) - type(descriptor), intent(in) :: this - type(atoms), intent(in) :: at - type(MPI_Context), intent(in) :: mpi - logical, dimension(:), intent(out) :: mpi_mask - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(mpi%active) then - select case(this%descriptor_type) - case(DT_BISPECTRUM_SO4) - call descriptor_atomic_MPI_setup(at,mpi,mpi_mask,error) - case(DT_BISPECTRUM_SO3) - RAISE_ERROR("descriptor_MPI_setup: bispectrum_so3 not MPI ready.", error) - case(DT_BEHLER) - call descriptor_atomic_MPI_setup(at,mpi,mpi_mask,error) - case(DT_DISTANCE_2B) - call descriptor_atomic_MPI_setup(at,mpi,mpi_mask,error) - case(DT_COORDINATION) - call descriptor_atomic_MPI_setup(at,mpi,mpi_mask,error) - case(DT_ANGLE_3B) - RAISE_ERROR("descriptor_MPI_setup: angle_3b not MPI ready.", error) - case(DT_CO_ANGLE_3B) - RAISE_ERROR("descriptor_MPI_setup: co_angle_3b not MPI ready.", error) - case(DT_CO_DISTANCE_2B) - RAISE_ERROR("descriptor_MPI_setup: co_distance_2b not MPI ready.", error) - case(DT_COSNX) - call descriptor_atomic_MPI_setup(at,mpi,mpi_mask,error) - case(DT_TRIHIS) - RAISE_ERROR("descriptor_MPI_setup: trihis not MPI ready.", error) - case(DT_WATER_MONOMER) - call descriptor_water_monomer_dimer_MPI_setup(at,mpi,mpi_mask,error) - case(DT_WATER_DIMER) - call descriptor_water_monomer_dimer_MPI_setup(at,mpi,mpi_mask,error) - case(DT_A2_DIMER) - RAISE_ERROR("descriptor_MPI_setup: A2_dimer not MPI ready.", error) - case(DT_AB_DIMER) - RAISE_ERROR("descriptor_MPI_setup: AB_dimer not MPI ready.", error) - case(DT_BOND_REAL_SPACE) - RAISE_ERROR("descriptor_MPI_setup: bond_real_space not MPI ready.", error) - case(DT_ATOM_REAL_SPACE) - RAISE_ERROR("descriptor_MPI_setup: atom_real_space not MPI ready.", error) - case(DT_POWER_SO3) - call descriptor_atomic_MPI_setup(at,mpi,mpi_mask,error) - case(DT_POWER_SO4) - RAISE_ERROR("descriptor_MPI_setup: power_SO4 not MPI ready.", error) - case(DT_SOAP) - call descriptor_atomic_MPI_setup(at,mpi,mpi_mask,error) - case(DT_AN_MONOMER) - RAISE_ERROR("descriptor_MPI_setup: AN_monomer not MPI ready.", error) - case(DT_GENERAL_MONOMER) - call descriptor_general_monomer_nmer_MPI_setup(this,at,mpi,mpi_mask,error) - case(DT_GENERAL_DIMER) - call descriptor_general_monomer_nmer_MPI_setup(this,at,mpi,mpi_mask,error) - case(DT_GENERAL_TRIMER) - call descriptor_general_monomer_nmer_MPI_setup(this,at,mpi,mpi_mask,error) - case(DT_RDF) - call descriptor_atomic_MPI_setup(at,mpi,mpi_mask,error) - case(DT_AS_DISTANCE_2B) - RAISE_ERROR("descriptor_MPI_setup: as_distance_2b not MPI ready.", error) - case(DT_MOLECULE_LO_D) - RAISE_ERROR("descriptor_MPI_setup: molecule_lo_d not MPI ready.", error) - case(DT_ALEX) - call descriptor_atomic_MPI_setup(at,mpi,mpi_mask,error) - case(DT_COM_DIMER) - call descriptor_general_monomer_nmer_MPI_setup(this,at,mpi,mpi_mask,error) - case(DT_DISTANCE_NB) - call descriptor_atomic_MPI_setup(at,mpi,mpi_mask,error) - case(DT_SOAP_EXPRESS) - call descriptor_atomic_MPI_setup(at,mpi,mpi_mask,error) - case default - RAISE_ERROR("descriptor_MPI_setup: descriptor type "//this%descriptor_type//" not recognised.",error) - endselect - else - mpi_mask = .true. - endif - - endsubroutine descriptor_MPI_setup - - subroutine descriptor_atomic_MPI_setup(at,mpi,mpi_mask,error) - type(atoms), intent(in) :: at - type(MPI_Context), intent(in) :: mpi - logical, dimension(:), intent(out) :: mpi_mask - integer, optional, intent(out) :: error - - integer :: i - - INIT_ERROR(error) - - mpi_mask = .false. - do i = 1, at%N - if( mod(i-1, mpi%n_procs) == mpi%my_proc ) mpi_mask(i) = .true. - enddo - - endsubroutine descriptor_atomic_MPI_setup - - subroutine descriptor_water_monomer_dimer_MPI_setup(at,mpi,mpi_mask,error) - type(atoms), intent(in) :: at - type(MPI_Context), intent(in) :: mpi - logical, dimension(:), intent(out) :: mpi_mask - integer, optional, intent(out) :: error - - integer :: i - - INIT_ERROR(error) - - mpi_mask = .false. - do i = 1, at%N - if( at%Z(i) == 8 .and. mod(i-1, mpi%n_procs) == mpi%my_proc ) mpi_mask(i) = .true. - enddo - - endsubroutine descriptor_water_monomer_dimer_MPI_setup - - subroutine descriptor_general_monomer_nmer_MPI_setup(this,at,mpi,mpi_mask,error) - type(descriptor), intent(in) :: this - type(atoms), intent(in) :: at - type(MPI_Context), intent(in) :: mpi - logical, dimension(:), intent(out) :: mpi_mask - integer, optional, intent(out) :: error - - integer, dimension(:,:), allocatable :: monomer_index - logical, dimension(at%N) :: associated_to_monomer - integer :: n_monomer - - integer :: i - - INIT_ERROR(error) - - associated_to_monomer = .false. - select case(this%descriptor_type) - case(DT_GENERAL_MONOMER) - call find_general_monomer(at,monomer_index,this%descriptor_general_monomer%signature,associated_to_monomer,this%descriptor_general_monomer%cutoff,this%descriptor_general_monomer%atom_ordercheck,error) - case(DT_GENERAL_DIMER) - call find_general_monomer(at,monomer_index,this%descriptor_general_dimer%signature_one,associated_to_monomer,this%descriptor_general_dimer%monomer_one_cutoff,this%descriptor_general_dimer%atom_ordercheck,error) - case(DT_GENERAL_TRIMER) - call find_general_monomer(at,monomer_index,this%descriptor_general_trimer%signature_one,associated_to_monomer,this%descriptor_general_trimer%monomer_one_cutoff,this%descriptor_general_trimer%atom_ordercheck,error) - case(DT_COM_DIMER) - call find_general_monomer(at,monomer_index,this%descriptor_com_dimer%signature_one,associated_to_monomer,this%descriptor_com_dimer%monomer_one_cutoff,this%descriptor_com_dimer%atom_ordercheck,error) - case default - RAISE_ERROR("descriptor_general_monomer_nmer_MPI_setup: descriptor type "//this%descriptor_type//" not recognised.",error) - endselect - - n_monomer = size(monomer_index,2) - - mpi_mask = .false. - do i = 1, n_monomer ! for dimer, trimer this is the first monomer (signature_one) - if( mod(i-1, mpi%n_procs) == mpi%my_proc ) then - mpi_mask(monomer_index(:,i)) = .true. - endif - enddo - - deallocate(monomer_index) - - endsubroutine descriptor_general_monomer_nmer_MPI_setup - - subroutine descriptor_data_finalise(this,error) - type(descriptor_data), intent(inout) :: this - integer, optional, intent(out) :: error - - integer :: i - - INIT_ERROR(error) - - if(allocated(this%x)) then - do i = 1, size(this%x) - if(allocated(this%x(i)%data)) deallocate(this%x(i)%data) - if(allocated(this%x(i)%grad_data)) deallocate(this%x(i)%grad_data) - if(allocated(this%x(i)%ci)) deallocate(this%x(i)%ci) - if(allocated(this%x(i)%ii)) deallocate(this%x(i)%ii) - if(allocated(this%x(i)%pos)) deallocate(this%x(i)%pos) - if(allocated(this%x(i)%has_grad_data)) deallocate(this%x(i)%has_grad_data) - if(allocated(this%x(i)%grad_covariance_cutoff)) deallocate(this%x(i)%grad_covariance_cutoff) - enddo - deallocate(this%x) - endif - - endsubroutine descriptor_data_finalise - - subroutine RadialFunction_initialise(this,n_max,cutoff, min_cutoff,error) - type(RadialFunction_type), intent(inout) :: this - integer, intent(in) :: n_max - real(dp), intent(in) :: cutoff, min_cutoff - integer, optional, intent(out) :: error - - real(dp), dimension(:,:), allocatable :: S, vS - real(dp), dimension(:), allocatable :: eS - integer :: i, j - - INIT_ERROR(error) - - call finalise(this) - - this%n_max = n_max - this%cutoff = cutoff - this%min_cutoff = min_cutoff - - allocate(this%RadialTransform(this%n_max,this%n_max),this%NormFunction(this%n_max)) - allocate(S(this%n_max,this%n_max), vS(this%n_max,this%n_max), eS(this%n_max)) - - do i = 1, this%n_max - this%NormFunction(i) = sqrt(this%cutoff**(2.0_dp*i+5.0_dp)/(2.0_dp*i+5.0_dp)) - do j = 1, this%n_max - S(j,i) = sqrt((2.0_dp*i+5)*(2.0_dp*j+5))/(i+j+5.0_dp) - enddo - enddo - - call diagonalise(S,eS,vS) - this%RadialTransform = matmul(matmul(vS,diag(1.0_dp/sqrt(eS))),transpose(vS)) - - if(allocated(S)) deallocate(S) - if(allocated(vS)) deallocate(vS) - if(allocated(eS)) deallocate(eS) - - this%initialised = .true. - - endsubroutine RadialFunction_initialise - - subroutine RadialFunction_finalise(this,error) - type(RadialFunction_type), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%cutoff = 0.0_dp - this%min_cutoff = 0.0_dp - this%n_max = 0 - - if(allocated(this%RadialTransform)) deallocate(this%RadialTransform) - if(allocated(this%NormFunction)) deallocate(this%NormFunction) - - this%initialised = .false. - - endsubroutine RadialFunction_finalise - - subroutine cplx_2d_array1_finalise(this) - type(cplx_2d), dimension(:), allocatable, intent(inout) :: this - integer :: j - - if(allocated(this)) then - do j = lbound(this,1), ubound(this,1) - if(allocated(this(j)%mm)) deallocate(this(j)%mm) - enddo - deallocate(this) - endif - endsubroutine cplx_2d_array1_finalise - - subroutine cplx_3d_array2_finalise(this) - type(cplx_3d), dimension(:,:), allocatable, intent(inout) :: this - integer :: i, j - - if(allocated(this)) then - do j = lbound(this,2), ubound(this,2) - do i = lbound(this,1), ubound(this,1) - if(allocated(this(i,j)%mm)) deallocate(this(i,j)%mm) - enddo - enddo - deallocate(this) - endif - - endsubroutine cplx_3d_array2_finalise - - subroutine fourier_SO4_calc(this,at,i,U,dU,args_str,error) - type(fourier_SO4_type), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(in) :: i - type(cplx_2d), dimension(:), allocatable, intent(inout) :: U - type(cplx_3d), dimension(:,:), allocatable, intent(inout), optional :: dU - integer, optional, intent(out) :: error - character(len=*), intent(in), optional :: args_str - - complex(dp), dimension(:,:), allocatable :: Uc, Up - complex(dp), dimension(:,:,:), allocatable :: dUc, dUp - complex(dp) :: z0_pls_Iz, z0_min_Iz, x_pls_Iy, x_min_Iy - complex(dp), dimension(3) :: dz0_pls_Iz, dz0_min_Iz, dx_pls_Iy, dx_min_Iy - real(dp), dimension(3) :: diff, u_ij, dfcut, dz0, dr0 - real(dp) :: r0, r, fcut, z0, theta0 - integer :: n, n_i, ji, j, m1, m2 - integer, dimension(total_elements) :: species_map - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR('fourier_SO4_calc: object not initialised',error) - endif - - species_map = 0 - do j = 1, size(this%species_Z) - if(this%species_Z(j) == 0) then - species_map = 1 - else - species_map(this%species_Z(j)) = j - endif - enddo - - - if(allocated(U)) then - if(lbound(U,1) /= 0 .or. ubound(U,1) /= this%j_max) call finalise(U) - endif - - if(.not.allocated(U)) then - allocate( U(0:this%j_max) ) - do j = 0, this%j_max - allocate( U(j)%mm(-j:j,-j:j) ) - U(j)%mm = CPLX_ZERO - enddo - endif - - do j = 0, this%j_max - U(j)%mm = CPLX_ZERO - do m1 = -j, j, 2 - U(j)%mm(m1,m1) = CPLX_ONE - enddo - enddo - - allocate( Uc(-this%j_max:this%j_max, -this%j_max:this%j_max), & - Up(-this%j_max:this%j_max, -this%j_max:this%j_max) ) - - Uc = CPLX_ZERO - Up = CPLX_ZERO - - if(present(dU)) then - if(allocated(dU)) call finalise(dU) - - ! dU is not allocated, allocate and zero it - allocate( dU(0:this%j_max,0:n_neighbours(at,i,max_dist=this%cutoff)) ) - do j = 0, this%j_max - allocate( dU(j,0)%mm(3,-j:j,-j:j) ) - dU(j,0)%mm = CPLX_ZERO - enddo - - allocate( dUc(3,-this%j_max:this%j_max, -this%j_max:this%j_max), & - dUp(3,-this%j_max:this%j_max, -this%j_max:this%j_max) ) - dUc = CPLX_ZERO - dUp = CPLX_ZERO - endif - - n_i = 0 - do n = 1, n_neighbours(at,i) - ji = neighbour(at, i, n, distance=r, diff=diff, cosines=u_ij) - if( r >= this%cutoff ) cycle - - n_i = n_i + 1 - - theta0 = r / this%z0 - z0 = r / tan( theta0 ) - r0 = sin( theta0 ) / r - - z0_pls_Iz = ( z0 + CPLX_IMAG*diff(3) ) * r0 - z0_min_Iz = ( z0 - CPLX_IMAG*diff(3) ) * r0 - x_pls_Iy = ( diff(1) + CPLX_IMAG*diff(2) ) * r0 - x_min_Iy = ( diff(1) - CPLX_IMAG*diff(2) ) * r0 - - fcut = cos_cutoff_function(r,this%cutoff) * this%w(species_map(at%Z(ji))) - - U(0)%mm(0,0) = U(0)%mm(0,0) + fcut - Up(0:0,0:0) = CPLX_ONE - - if(present(dU)) then - - dfcut = -dcos_cutoff_function(r,this%cutoff)*u_ij * this%w(species_map(at%Z(ji))) - dz0 = ( 1.0_dp / tan( theta0 ) - theta0 / sin(theta0)**2 ) * u_ij - dr0 = ( cos( theta0 ) / (r*this%z0) - r0 / r ) * u_ij - - dz0_pls_Iz = ( z0 + CPLX_IMAG*diff(3) )*dr0 + dz0*r0 - dz0_pls_Iz(3) = dz0_pls_Iz(3) + CPLX_IMAG*r0 - - dz0_min_Iz = ( z0 - CPLX_IMAG*diff(3) )*dr0 + dz0*r0 - dz0_min_Iz(3) = dz0_min_Iz(3) - CPLX_IMAG*r0 - - dx_pls_Iy = ( diff(1) + CPLX_IMAG*diff(2) )*dr0 - dx_pls_Iy(1) = dx_pls_Iy(1) + r0 - dx_pls_Iy(2) = dx_pls_Iy(2) + CPLX_IMAG*r0 - - dx_min_Iy = ( diff(1) - CPLX_IMAG*diff(2) )*dr0 - dx_min_Iy(1) = dx_min_Iy(1) + r0 - dx_min_Iy(2) = dx_min_Iy(2) - CPLX_IMAG*r0 - - dUc = CPLX_ZERO - dUp = CPLX_ZERO - - dU(0,0)%mm(:,0,0) = dU(0,0)%mm(:,0,0) + dfcut*CPLX_ONE - - allocate( dU(0,n_i)%mm(3,-0:0,-0:0) ) - - dU(0,n_i)%mm(:,0,0) = - dfcut*CPLX_ONE - endif - - do j = 1, this%j_max - Uc(-j:j,-j:j) = CPLX_ZERO - if(present(dU)) then - dUc(:,-j:j,-j:j) = CPLX_ZERO - allocate( dU(j,n_i)%mm(3,-j:j,-j:j) ) - dU(j,n_i)%mm = CPLX_ZERO - endif - - do m1 = -j, j-2, 2 - do m2 = -j, j, 2 - if( (j-m2) /= 0 ) then - Uc(m2,m1) = Uc(m2,m1) + & - sqrt( real(j-m2,dp)/real(j-m1,dp) ) * z0_pls_Iz * Up(m2+1,m1+1) - - if(present(dU)) dUc(:,m2,m1) = dUc(:,m2,m1) + & - sqrt( real(j-m2,dp)/real(j-m1,dp) ) * & - ( dz0_pls_Iz * Up(m2+1,m1+1) + z0_pls_Iz * dUp(:,m2+1,m1+1) ) - endif - - if( (j+m2) /= 0 ) then - Uc(m2,m1) = Uc(m2,m1) - & - CPLX_IMAG * sqrt( real(j+m2,dp)/real(j-m1,dp) ) * x_min_Iy * Up(m2-1,m1+1) - - if(present(dU)) dUc(:,m2,m1) = dUc(:,m2,m1) - & - CPLX_IMAG * sqrt( real(j+m2,dp)/real(j-m1,dp) ) * & - ( dx_min_Iy * Up(m2-1,m1+1) + x_min_Iy * dUp(:,m2-1,m1+1) ) - - endif - enddo - enddo - - m1 = j - do m2 = -j, j, 2 - if( (j+m2) /= 0 ) then - Uc(m2,m1) = Uc(m2,m1) + & - sqrt( real(j+m2,dp)/real(j+m1,dp) ) * z0_min_Iz * Up(m2-1,m1-1) - - if(present(dU)) dUc(:,m2,m1) = dUc(:,m2,m1) + & - sqrt( real(j+m2,dp)/real(j+m1,dp) ) * & - ( dz0_min_Iz * Up(m2-1,m1-1) + z0_min_Iz * dUp(:,m2-1,m1-1) ) - endif - - if( (j-m2) /= 0 ) then - Uc(m2,m1) = Uc(m2,m1) - & - CPLX_IMAG * sqrt( real(j-m2,dp)/real(j+m1,dp) ) * x_pls_Iy * Up(m2+1,m1-1) - - if(present(dU)) dUc(:,m2,m1) = dUc(:,m2,m1) - & - CPLX_IMAG * sqrt( real(j-m2,dp)/real(j+m1,dp) ) * & - ( dx_pls_Iy * Up(m2+1,m1-1) + x_pls_Iy * dUp(:,m2+1,m1-1) ) - endif - enddo - - U(j)%mm = U(j)%mm + Uc(-j:j,-j:j) * fcut - Up(-j:j,-j:j) = Uc(-j:j,-j:j) - if(present(dU)) then - dUp(:,-j:j,-j:j) = dUc(:,-j:j,-j:j) - dU(j,0)%mm = dU(j,0)%mm - dUc(:,-j:j,-j:j) * fcut - dU(j,n_i)%mm = dU(j,n_i)%mm + dUc(:,-j:j,-j:j) * fcut - do m1 = -j, j, 2 - do m2 = -j, j, 2 - dU(j,0)%mm(:,m2,m1) = dU(j,0)%mm(:,m2,m1) & - + Uc(m2,m1) * dfcut - dU(j,n_i)%mm(:,m2,m1) = dU(j,n_i)%mm(:,m2,m1) & - - Uc(m2,m1) * dfcut - enddo - enddo - endif - - enddo ! j - enddo ! n - - if(allocated(Up)) deallocate(Up) - if(allocated(Uc)) deallocate(Uc) - if(allocated(dUp)) deallocate(dUp) - if(allocated(dUc)) deallocate(dUc) - - endsubroutine fourier_SO4_calc - - subroutine fourier_so4_initialise(this,args_str,error) - type(fourier_SO4_type), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - integer :: n_species - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', '2.75', this%cutoff, help_string="Cutoff for SO4 bispectrum") - call param_register(params, 'z0_ratio', '0.0', this%z0_ratio, help_string="Ratio of radius of 4D projection sphere times PI and the cutoff.") - call param_register(params, 'j_max', '4', this%j_max, help_string="Max of expansion of bispectrum, i.e. resulution") - call param_register(params, 'Z', '0', this%Z, help_string="Atomic number of central atom") - call param_register(params, 'n_species', '1', n_species, help_string="Number of species for the descriptor") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='fourier_so4_initialise args_str')) then - RAISE_ERROR("fourier_so4_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - allocate(this%species_Z(n_species), this%w(n_species)) - - call initialise(params) - if( n_species == 1 ) then - call param_register(params, 'species_Z', '0', this%species_Z(1), help_string="Atomic number of species") - call param_register(params, 'w', '1.0', this%w(1), help_string="Weight associated to each atomic type") - else - call param_register(params, 'species_Z', PARAM_MANDATORY, this%species_Z, help_string="Atomic number of species") - call param_register(params, 'w', PARAM_MANDATORY, this%w, help_string="Weight associated to each atomic type") - endif - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='fourier_so4_initialise args_str')) then - RAISE_ERROR("fourier_so4_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - this%z0 = max(1.0_dp,this%z0_ratio) * this%cutoff/(PI-0.02_dp) - - this%initialised = .true. - - - endsubroutine fourier_so4_initialise - - subroutine fourier_so4_finalise(this,error) - type(fourier_so4_type), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - - this%cutoff = 0.0_dp - this%j_max = 0 - this%z0_ratio = 0.0_dp - this%z0 = 0.0_dp - this%Z = 0 - - if(allocated(this%species_Z)) deallocate(this%species_Z) - if(allocated(this%w)) deallocate(this%w) - - this%initialised = .false. - - endsubroutine fourier_so4_finalise - - subroutine bispectrum_so4_initialise(this,args_str,error) - type(bispectrum_so4), intent(inout), target :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - call finalise(this) - - call initialise(this%fourier_SO4,args_str,error) - - this%cutoff => this%fourier_SO4%cutoff - this%z0_ratio => this%fourier_SO4%z0_ratio - this%z0 => this%fourier_SO4%z0 - this%j_max => this%fourier_SO4%j_max - this%Z => this%fourier_SO4%Z - this%cutoff => this%fourier_SO4%cutoff - this%species_Z => this%fourier_SO4%species_Z - this%w => this%fourier_SO4%w - - this%initialised = .true. - - endsubroutine bispectrum_so4_initialise - - subroutine bispectrum_so4_finalise(this,error) - type(bispectrum_so4), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - - call finalise(this%fourier_SO4,error) - - this%cutoff => null() - this%z0_ratio => null() - this%z0 => null() - this%j_max => null() - this%Z => null() - this%cutoff => null() - this%species_Z => null() - this%w => null() - - this%initialised = .false. - - endsubroutine bispectrum_so4_finalise - - subroutine bispectrum_so3_initialise(this,args_str,error) - type(bispectrum_so3), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - integer :: n_species - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Cutoff for bispectrum_so3-type descriptors") - call param_register(params, 'min_cutoff', '0.00', this%min_cutoff, help_string="Cutoff for minimal distances in bispectrum_so3-type descriptors") - call param_register(params, 'l_max', '4', this%l_max, help_string="L_max for bispectrum_so3-type descriptors") - call param_register(params, 'n_max', '4', this%n_max, help_string="N_max for bispectrum_so3-type descriptors") - call param_register(params, 'Z', '0', this%Z, help_string="Atomic number of central atom") - call param_register(params, 'n_species', '1', n_species, help_string="Number of species for the descriptor") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='bispectrum_so3_initialise args_str')) then - RAISE_ERROR("bispectrum_so3_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - allocate(this%species_Z(n_species), this%w(n_species)) - - call initialise(params) - if( n_species == 1 ) then - call param_register(params, 'species_Z', '0', this%species_Z(1), help_string="Atomic number of species") - call param_register(params, 'w', '1.0', this%w(1), help_string="Weight associated to each atomic type") - else - call param_register(params, 'species_Z', PARAM_MANDATORY, this%species_Z, help_string="Atomic number of species") - call param_register(params, 'w', PARAM_MANDATORY, this%w, help_string="Weight associated to each atomic type") - endif - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='bispectrum_so3_initialise args_str')) then - RAISE_ERROR("bispectrum_so3_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - call initialise(this%Radial,this%n_max,this%cutoff,this%min_cutoff,error) - - this%initialised = .true. - - call print('Dimensions: '//bispectrum_so3_dimensions(this,error)) - - endsubroutine bispectrum_so3_initialise - - subroutine bispectrum_so3_finalise(this,error) - type(bispectrum_so3), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - - this%cutoff = 0.0_dp - this%min_cutoff = 0.0_dp - this%l_max = 0 - this%n_max = 0 - this%Z = 0 - - if(allocated(this%species_Z)) deallocate(this%species_Z) - if(allocated(this%w)) deallocate(this%w) - - call finalise(this%Radial) - - this%initialised = .false. - - endsubroutine bispectrum_so3_finalise - - subroutine behler_initialise(this,args_str,error) - type(behler), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - !call param_register(params, 'behler_cutoff', '2.75', this%cutoff, help_string="Cutoff for Behler-type descriptors") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='behler_initialise args_str')) then - RAISE_ERROR("behler_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - this%n_g2 = 8 - this%n_g3 = 43 - - allocate(this%g2(this%n_g2), this%g3(this%n_g3)) - - this%g2(1)%eta = 0.001_dp / BOHR**2; this%g2(1)%rs = 0.000_dp * BOHR; this%g2(1)%rc = 11.338_dp * BOHR - this%g2(2)%eta = 0.010_dp / BOHR**2; this%g2(2)%rs = 0.000_dp * BOHR; this%g2(2)%rc = 11.338_dp * BOHR - this%g2(3)%eta = 0.020_dp / BOHR**2; this%g2(3)%rs = 0.000_dp * BOHR; this%g2(3)%rc = 11.338_dp * BOHR - this%g2(4)%eta = 0.035_dp / BOHR**2; this%g2(4)%rs = 0.000_dp * BOHR; this%g2(4)%rc = 11.338_dp * BOHR - this%g2(5)%eta = 0.060_dp / BOHR**2; this%g2(5)%rs = 0.000_dp * BOHR; this%g2(5)%rc = 11.338_dp * BOHR - this%g2(6)%eta = 0.100_dp / BOHR**2; this%g2(6)%rs = 0.000_dp * BOHR; this%g2(6)%rc = 11.338_dp * BOHR - this%g2(7)%eta = 0.200_dp / BOHR**2; this%g2(7)%rs = 0.000_dp * BOHR; this%g2(7)%rc = 11.338_dp * BOHR - this%g2(8)%eta = 0.400_dp / BOHR**2; this%g2(8)%rs = 0.000_dp * BOHR; this%g2(8)%rc = 11.338_dp * BOHR - - this%g3( 1)%eta = 0.0001_dp / BOHR**2; this%g3( 1)%lambda = -1.000_dp; this%g3( 1)%zeta = 1.000_dp; this%g3( 1)%rc = 11.338_dp * BOHR - this%g3( 2)%eta = 0.0001_dp / BOHR**2; this%g3( 2)%lambda = 1.000_dp; this%g3( 2)%zeta = 1.000_dp; this%g3( 2)%rc = 11.338_dp * BOHR - this%g3( 3)%eta = 0.0001_dp / BOHR**2; this%g3( 3)%lambda = -1.000_dp; this%g3( 3)%zeta = 2.000_dp; this%g3( 3)%rc = 11.338_dp * BOHR - this%g3( 4)%eta = 0.0001_dp / BOHR**2; this%g3( 4)%lambda = 1.000_dp; this%g3( 4)%zeta = 2.000_dp; this%g3( 4)%rc = 11.338_dp * BOHR - this%g3( 5)%eta = 0.0030_dp / BOHR**2; this%g3( 5)%lambda = -1.000_dp; this%g3( 5)%zeta = 1.000_dp; this%g3( 5)%rc = 11.338_dp * BOHR - this%g3( 6)%eta = 0.0030_dp / BOHR**2; this%g3( 6)%lambda = 1.000_dp; this%g3( 6)%zeta = 1.000_dp; this%g3( 6)%rc = 11.338_dp * BOHR - this%g3( 7)%eta = 0.0030_dp / BOHR**2; this%g3( 7)%lambda = -1.000_dp; this%g3( 7)%zeta = 2.000_dp; this%g3( 7)%rc = 11.338_dp * BOHR - this%g3( 8)%eta = 0.0030_dp / BOHR**2; this%g3( 8)%lambda = 1.000_dp; this%g3( 8)%zeta = 2.000_dp; this%g3( 8)%rc = 11.338_dp * BOHR - this%g3( 9)%eta = 0.0080_dp / BOHR**2; this%g3( 9)%lambda = -1.000_dp; this%g3( 9)%zeta = 1.000_dp; this%g3( 9)%rc = 11.338_dp * BOHR - this%g3(10)%eta = 0.0080_dp / BOHR**2; this%g3(10)%lambda = 1.000_dp; this%g3(10)%zeta = 1.000_dp; this%g3(10)%rc = 11.338_dp * BOHR - this%g3(11)%eta = 0.0080_dp / BOHR**2; this%g3(11)%lambda = -1.000_dp; this%g3(11)%zeta = 2.000_dp; this%g3(11)%rc = 11.338_dp * BOHR - this%g3(12)%eta = 0.0080_dp / BOHR**2; this%g3(12)%lambda = 1.000_dp; this%g3(12)%zeta = 2.000_dp; this%g3(12)%rc = 11.338_dp * BOHR - this%g3(13)%eta = 0.0150_dp / BOHR**2; this%g3(13)%lambda = -1.000_dp; this%g3(13)%zeta = 1.000_dp; this%g3(13)%rc = 11.338_dp * BOHR - this%g3(14)%eta = 0.0150_dp / BOHR**2; this%g3(14)%lambda = 1.000_dp; this%g3(14)%zeta = 1.000_dp; this%g3(14)%rc = 11.338_dp * BOHR - this%g3(15)%eta = 0.0150_dp / BOHR**2; this%g3(15)%lambda = -1.000_dp; this%g3(15)%zeta = 2.000_dp; this%g3(15)%rc = 11.338_dp * BOHR - this%g3(16)%eta = 0.0150_dp / BOHR**2; this%g3(16)%lambda = 1.000_dp; this%g3(16)%zeta = 2.000_dp; this%g3(16)%rc = 11.338_dp * BOHR - this%g3(17)%eta = 0.0150_dp / BOHR**2; this%g3(17)%lambda = -1.000_dp; this%g3(17)%zeta = 4.000_dp; this%g3(17)%rc = 11.338_dp * BOHR - this%g3(18)%eta = 0.0150_dp / BOHR**2; this%g3(18)%lambda = 1.000_dp; this%g3(18)%zeta = 4.000_dp; this%g3(18)%rc = 11.338_dp * BOHR - this%g3(19)%eta = 0.0150_dp / BOHR**2; this%g3(19)%lambda = -1.000_dp; this%g3(19)%zeta = 16.000_dp; this%g3(19)%rc = 11.338_dp * BOHR - this%g3(20)%eta = 0.0150_dp / BOHR**2; this%g3(20)%lambda = 1.000_dp; this%g3(20)%zeta = 16.000_dp; this%g3(20)%rc = 11.338_dp * BOHR - this%g3(21)%eta = 0.0250_dp / BOHR**2; this%g3(21)%lambda = -1.000_dp; this%g3(21)%zeta = 1.000_dp; this%g3(21)%rc = 11.338_dp * BOHR - this%g3(22)%eta = 0.0250_dp / BOHR**2; this%g3(22)%lambda = 1.000_dp; this%g3(22)%zeta = 1.000_dp; this%g3(22)%rc = 11.338_dp * BOHR - this%g3(23)%eta = 0.0250_dp / BOHR**2; this%g3(23)%lambda = -1.000_dp; this%g3(23)%zeta = 2.000_dp; this%g3(23)%rc = 11.338_dp * BOHR - this%g3(24)%eta = 0.0250_dp / BOHR**2; this%g3(24)%lambda = 1.000_dp; this%g3(24)%zeta = 2.000_dp; this%g3(24)%rc = 11.338_dp * BOHR - this%g3(25)%eta = 0.0250_dp / BOHR**2; this%g3(25)%lambda = -1.000_dp; this%g3(25)%zeta = 4.000_dp; this%g3(25)%rc = 11.338_dp * BOHR - this%g3(26)%eta = 0.0250_dp / BOHR**2; this%g3(26)%lambda = 1.000_dp; this%g3(26)%zeta = 4.000_dp; this%g3(26)%rc = 11.338_dp * BOHR - this%g3(27)%eta = 0.0250_dp / BOHR**2; this%g3(27)%lambda = -1.000_dp; this%g3(27)%zeta = 16.000_dp; this%g3(27)%rc = 11.338_dp * BOHR - this%g3(28)%eta = 0.0250_dp / BOHR**2; this%g3(28)%lambda = 1.000_dp; this%g3(28)%zeta = 16.000_dp; this%g3(28)%rc = 11.338_dp * BOHR - this%g3(29)%eta = 0.0450_dp / BOHR**2; this%g3(29)%lambda = -1.000_dp; this%g3(29)%zeta = 1.000_dp; this%g3(29)%rc = 11.338_dp * BOHR - this%g3(30)%eta = 0.0450_dp / BOHR**2; this%g3(30)%lambda = 1.000_dp; this%g3(30)%zeta = 1.000_dp; this%g3(30)%rc = 11.338_dp * BOHR - this%g3(31)%eta = 0.0450_dp / BOHR**2; this%g3(31)%lambda = -1.000_dp; this%g3(31)%zeta = 2.000_dp; this%g3(31)%rc = 11.338_dp * BOHR - this%g3(32)%eta = 0.0450_dp / BOHR**2; this%g3(32)%lambda = 1.000_dp; this%g3(32)%zeta = 2.000_dp; this%g3(32)%rc = 11.338_dp * BOHR - this%g3(33)%eta = 0.0450_dp / BOHR**2; this%g3(33)%lambda = -1.000_dp; this%g3(33)%zeta = 4.000_dp; this%g3(33)%rc = 11.338_dp * BOHR - this%g3(34)%eta = 0.0450_dp / BOHR**2; this%g3(34)%lambda = 1.000_dp; this%g3(34)%zeta = 4.000_dp; this%g3(34)%rc = 11.338_dp * BOHR - this%g3(35)%eta = 0.0450_dp / BOHR**2; this%g3(35)%lambda = -1.000_dp; this%g3(35)%zeta = 16.000_dp; this%g3(35)%rc = 11.338_dp * BOHR - this%g3(36)%eta = 0.0450_dp / BOHR**2; this%g3(36)%lambda = 1.000_dp; this%g3(36)%zeta = 16.000_dp; this%g3(36)%rc = 11.338_dp * BOHR - this%g3(37)%eta = 0.0800_dp / BOHR**2; this%g3(37)%lambda = -1.000_dp; this%g3(37)%zeta = 1.000_dp; this%g3(37)%rc = 11.338_dp * BOHR - this%g3(38)%eta = 0.0800_dp / BOHR**2; this%g3(38)%lambda = 1.000_dp; this%g3(38)%zeta = 1.000_dp; this%g3(38)%rc = 11.338_dp * BOHR - this%g3(39)%eta = 0.0800_dp / BOHR**2; this%g3(39)%lambda = -1.000_dp; this%g3(39)%zeta = 2.000_dp; this%g3(39)%rc = 11.338_dp * BOHR - this%g3(40)%eta = 0.0800_dp / BOHR**2; this%g3(40)%lambda = 1.000_dp; this%g3(40)%zeta = 2.000_dp; this%g3(40)%rc = 11.338_dp * BOHR - this%g3(41)%eta = 0.0800_dp / BOHR**2; this%g3(41)%lambda = -1.000_dp; this%g3(41)%zeta = 4.000_dp; this%g3(41)%rc = 11.338_dp * BOHR - this%g3(42)%eta = 0.0800_dp / BOHR**2; this%g3(42)%lambda = 1.000_dp; this%g3(42)%zeta = 4.000_dp; this%g3(42)%rc = 11.338_dp * BOHR - this%g3(43)%eta = 0.0800_dp / BOHR**2; this%g3(43)%lambda = 1.000_dp; this%g3(43)%zeta = 16.000_dp; this%g3(43)%rc = 11.338_dp * BOHR - - this%cutoff = 11.338_dp * BOHR - - this%initialised = .true. - - endsubroutine behler_initialise - - subroutine behler_finalise(this,error) - type(behler), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - - this%cutoff = 0.0_dp - this%n_g2 = 0 - this%n_g3 = 0 - - if(allocated(this%g2)) deallocate(this%g2) - if(allocated(this%g3)) deallocate(this%g3) - - this%initialised = .false. - - endsubroutine behler_finalise - - subroutine distance_2b_initialise(this,args_str,error) - type(distance_2b), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - logical :: has_resid_name, has_exponents - integer :: i - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Cutoff for distance_2b-type descriptors") - call param_register(params, 'cutoff_transition_width', '0.5', this%cutoff_transition_width, help_string="Transition width of cutoff for distance_2b-type descriptors") - call param_register(params, 'Z1', '0', this%Z1, help_string="Atom type #1 in bond") - call param_register(params, 'Z2', '0', this%Z2, help_string="Atom type #2 in bond") - call param_register(params, 'resid_name', '', this%resid_name, has_value_target=has_resid_name, help_string="Name of an integer property in the atoms object giving the residue id of the molecule to which the atom belongs.") - call param_register(params, 'only_intra', 'F', this%only_intra, help_string="Only calculate INTRAmolecular pairs with equal residue ids (bonds)") - call param_register(params, 'only_inter', 'F', this%only_inter, help_string="Only apply to INTERmolecular pairs with different residue ids (non-bonded)") - - call param_register(params, 'n_exponents', '1', this%n_exponents, help_string="Number of exponents") - call param_register(params, 'tail_range', '1.0', this%tail_range, help_string="Tail order") - call param_register(params, 'tail_exponent', '0', this%tail_exponent, & - has_value_target = this%has_tail, help_string="Tail range") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='distance_2b_initialise args_str')) then - RAISE_ERROR("distance_2b_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - if (this%only_intra .and. this%only_inter) then - RAISE_ERROR("distance_2b_initialise: cannot specify both only_inter AND only_intra", error) - end if - if ((this%only_intra .or. this%only_inter) .and. (.not. has_resid_name)) then - RAISE_ERROR("distance_2b_initialise: only_intra and only_inter require resid_name to be given as well", error) - end if - - allocate(this%exponents(this%n_exponents)) - call initialise(params) - if( this%n_exponents == 1 ) then - call param_register(params, 'exponents',"1", this%exponents(1), & - has_value_target=has_exponents,help_string="Exponents") - else - call param_register(params, 'exponents',repeat(" 1 ",this%n_exponents), this%exponents, & - has_value_target=has_exponents,help_string="Exponents") - endif - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='distance_2b_initialise args_str')) then - RAISE_ERROR("distance_2b_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - if( .not. has_exponents .and. this%n_exponents > 1 ) then - do i = 1, this%n_exponents - this%exponents(i) = -i - enddo - endif - - this%initialised = .true. - - endsubroutine distance_2b_initialise - - subroutine distance_2b_finalise(this,error) - type(distance_2b), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%cutoff = 0.0_dp - this%cutoff_transition_width = 0.5_dp - this%Z1 = 0 - this%Z2 = 0 - - this%resid_name = '' - this%only_intra = .false. - this%only_inter = .false. - - this%tail_exponent = 0 - this%tail_range = 0.0_dp - this%has_tail = .false. - - this%n_exponents = 0 - if(allocated(this%exponents)) deallocate(this%exponents) - - this%initialised = .false. - - endsubroutine distance_2b_finalise - - subroutine coordination_initialise(this,args_str,error) - type(coordination), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - - INIT_ERROR(error) - - call finalise(this) - call initialise(params) - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Cutoff for coordination-type descriptors") - call param_register(params, 'transition_width', '0.20', this%transition_width, help_string="Width of transition region from 1 to 0") - call param_register(params, 'Z', '0', this%Z, help_string="Atomic number of central atom") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='coordination_initialise args_str')) then - RAISE_ERROR("coordination_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - this%initialised = .true. - - endsubroutine coordination_initialise - - subroutine coordination_finalise(this,error) - type(coordination), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%cutoff = 0.0_dp - this%transition_width = 0.0_dp - this%Z = 0 - - this%initialised = .false. - - endsubroutine coordination_finalise - - subroutine angle_3b_initialise(this,args_str,error) - type(angle_3b), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Cutoff for angle_3b-type descriptors") - call param_register(params, 'cutoff_transition_width', '0.50', this%cutoff_transition_width, help_string="Cutoff transition width for angle_3b-type descriptors") - call param_register(params, 'Z', '0', this%Z, help_string="Atomic number of central atom") - call param_register(params, 'Z1', '0', this%Z1, help_string="Atomic number of neighbour #1") - call param_register(params, 'Z2', '0', this%Z2, help_string="Atomic number of neighbour #2") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='angle_3b_initialise args_str')) then - RAISE_ERROR("angle_3b_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - this%initialised = .true. - - endsubroutine angle_3b_initialise - - subroutine angle_3b_finalise(this,error) - type(angle_3b), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%cutoff = 0.0_dp - this%Z = 0 - this%Z1 = 0 - this%Z2 = 0 - - this%initialised = .false. - - endsubroutine angle_3b_finalise - - subroutine co_angle_3b_initialise(this,args_str,error) - type(co_angle_3b), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Cutoff for co_angle_3b-type descriptors") - call param_register(params, 'coordination_cutoff', '0.00', this%coordination_cutoff, help_string="Cutoff for coordination function in co_angle_3b-type descriptors") - call param_register(params, 'coordination_transition_width', '0.00', this%coordination_transition_width, help_string="Transition width for co_angle_3b-type descriptors") - call param_register(params, 'Z', '0', this%Z, help_string="Atomic number of central atom") - call param_register(params, 'Z1', '0', this%Z1, help_string="Atomic number of neighbour #1") - call param_register(params, 'Z2', '0', this%Z2, help_string="Atomic number of neighbour #2") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='co_angle_3b_initialise args_str')) then - RAISE_ERROR("co_angle_3b_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - this%initialised = .true. - - endsubroutine co_angle_3b_initialise - - subroutine co_angle_3b_finalise(this,error) - type(co_angle_3b), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%cutoff = 0.0_dp - this%coordination_cutoff = 0.0_dp - this%coordination_transition_width = 0.0_dp - this%Z = 0 - this%Z1 = 0 - this%Z2 = 0 - - this%initialised = .false. - - endsubroutine co_angle_3b_finalise - - subroutine co_distance_2b_initialise(this,args_str,error) - type(co_distance_2b), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Cutoff for co_distance_2b-type descriptors") - call param_register(params, 'transition_width', '0.50', this%transition_width, help_string="Transition width of cutoff for co_distance_2b-type descriptors") - call param_register(params, 'coordination_cutoff', '0.00', this%coordination_cutoff, help_string="Cutoff for coordination function in co_distance_2b-type descriptors") - call param_register(params, 'coordination_transition_width', '0.00', this%coordination_transition_width, help_string="Transition width for co_distance_2b-type descriptors") - call param_register(params, 'Z1', '0', this%Z1, help_string="Atom type #1 in bond") - call param_register(params, 'Z2', '0', this%Z2, help_string="Atom type #2 in bond") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='co_distance_2b_initialise args_str')) then - RAISE_ERROR("co_distance_2b_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - this%initialised = .true. - - endsubroutine co_distance_2b_initialise - - subroutine co_distance_2b_finalise(this,error) - type(co_distance_2b), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%cutoff = 0.0_dp - this%coordination_cutoff = 0.0_dp - this%coordination_transition_width = 0.0_dp - this%Z1 = 0 - this%Z2 = 0 - - this%initialised = .false. - - endsubroutine co_distance_2b_finalise - - subroutine cosnx_initialise(this,args_str,error) - type(cosnx), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - integer :: n_species - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Cutoff for cosnx-type descriptors") - call param_register(params, 'min_cutoff', '0.00', this%min_cutoff, help_string="Cutoff for minimal distances in cosnx-type descriptors") - call param_register(params, 'l_max', '4', this%l_max, help_string="L_max for cosnx-type descriptors") - call param_register(params, 'n_max', '4', this%n_max, help_string="N_max for cosnx-type descriptors") - call param_register(params, 'Z', '0', this%Z, help_string="Atomic number of central atom") - call param_register(params, 'n_species', '1', n_species, help_string="Number of species for the descriptor") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='cosnx_initialise args_str')) then - RAISE_ERROR("cosnx_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - allocate(this%species_Z(n_species), this%w(n_species)) - - call initialise(params) - if( n_species == 1 ) then - call param_register(params, 'species_Z', '0', this%species_Z(1), help_string="Atomic number of species") - call param_register(params, 'w', '1.0', this%w(1), help_string="Weight associated to each atomic type") - else - call param_register(params, 'species_Z', PARAM_MANDATORY, this%species_Z, help_string="Atomic number of species") - call param_register(params, 'w', PARAM_MANDATORY, this%w, help_string="Weight associated to each atomic type") - endif - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='cosnx_initialise args_str')) then - RAISE_ERROR("cosnx_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - call initialise(this%Radial,this%n_max,this%cutoff,this%min_cutoff,error) - - this%initialised = .true. - - endsubroutine cosnx_initialise - - subroutine cosnx_finalise(this,error) - type(cosnx), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%cutoff = 0.0_dp - this%min_cutoff = 0.0_dp - this%l_max = 0 - this%n_max = 0 - - if(allocated(this%species_Z)) deallocate(this%species_Z) - if(allocated(this%w)) deallocate(this%w) - - call finalise(this%Radial) - - this%initialised = .false. - - endsubroutine cosnx_finalise - - subroutine trihis_initialise(this,args_str,error) - type(trihis), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - real(dp), dimension(:), allocatable :: gauss_centre1D, gauss_width1D - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Cutoff for trihis-type descriptors") - call param_register(params, 'n_gauss', '0', this%n_gauss, help_string="Number of Gaussians for trihis-type descriptors") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='trihis_initialise args_str')) then - RAISE_ERROR("trihis_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - allocate(gauss_centre1D(3*this%n_gauss),gauss_width1D(3*this%n_gauss)) - allocate(this%gauss_centre(3,this%n_gauss),this%gauss_width(3,this%n_gauss)) - - call initialise(params) - call param_register(params, 'trihis_gauss_centre', PARAM_MANDATORY, gauss_centre1D, help_string="Number of Gaussians for trihis-type descriptors") - call param_register(params, 'trihis_gauss_width', PARAM_MANDATORY, gauss_width1D, help_string="Number of Gaussians for trihis-type descriptors") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='trihis_initialise args_str')) then - RAISE_ERROR("trihis_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - this%gauss_centre = reshape(gauss_centre1D,(/3,this%n_gauss/)) - this%gauss_width = reshape(gauss_width1D,(/3,this%n_gauss/)) - - deallocate(gauss_centre1D,gauss_width1D) - - this%initialised = .true. - - endsubroutine trihis_initialise - - subroutine trihis_finalise(this,error) - type(trihis), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%cutoff = 0.0_dp - this%n_gauss = 0 - - if(allocated(this%gauss_centre)) deallocate(this%gauss_centre) - if(allocated(this%gauss_width)) deallocate(this%gauss_width) - - this%initialised = .false. - - endsubroutine trihis_finalise - - subroutine water_monomer_initialise(this,args_str,error) - type(water_monomer), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Cutoff for water_monomer-type descriptors") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='water_monomer_initialise args_str')) then - RAISE_ERROR("water_monomer_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - this%initialised = .true. - - endsubroutine water_monomer_initialise - - subroutine water_monomer_finalise(this,error) - type(water_monomer), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%cutoff = 0.0_dp - - this%initialised = .false. - - endsubroutine water_monomer_finalise - - subroutine water_dimer_initialise(this,args_str,error) - type(water_dimer), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Cutoff for water_dimer-type descriptors") - call param_register(params, 'cutoff_transition_width', '0.50', this%cutoff_transition_width, help_string="Width of smooth cutoff region for water_dimer-type descriptors") - call param_register(params, 'monomer_cutoff', '1.50', this%monomer_cutoff, help_string="Monomer cutoff for water_dimer-type descriptors") - call param_register(params, 'OHH_ordercheck', 'T', this%OHH_ordercheck, help_string="T: find water molecules. F: use default order OHH") - call param_register(params, 'power', '1.0', this%power, help_string="Power of distances to be used in the kernel") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='water_dimer_initialise args_str')) then - RAISE_ERROR("water_dimer_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - this%initialised = .true. - - endsubroutine water_dimer_initialise - - subroutine water_dimer_finalise(this,error) - type(water_dimer), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%cutoff = 0.0_dp - this%cutoff_transition_width = 0.0_dp - this%monomer_cutoff = 0.0_dp - this%OHH_ordercheck = .true. - this%power = 1.0_dp - - this%initialised = .false. - - endsubroutine water_dimer_finalise - - subroutine A2_dimer_initialise(this,args_str,error) - type(A2_dimer), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Cutoff for A2_dimer-type descriptors") - call param_register(params, 'monomer_cutoff', '1.50', this%monomer_cutoff, help_string="Monomer cutoff for A2_dimer-type descriptors") - call param_register(params, 'atomic_number', '1', this%atomic_number, help_string="Atomic number in A2_dimer-type descriptors") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='A2_dimer_initialise args_str')) then - RAISE_ERROR("A2_dimer_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - this%initialised = .true. - - endsubroutine A2_dimer_initialise - - subroutine A2_dimer_finalise(this,error) - type(A2_dimer), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%cutoff = 0.0_dp - this%monomer_cutoff = 0.0_dp - this%atomic_number = 0 - - this%initialised = .false. - - endsubroutine A2_dimer_finalise - - subroutine AB_dimer_initialise(this,args_str,error) - type(AB_dimer), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Cutoff for AB_dimer-type descriptors") - call param_register(params, 'monomer_cutoff', '1.50', this%monomer_cutoff, help_string="Monomer cutoff for AB_dimer-type descriptors") - call param_register(params, 'atomic_number1', '1', this%atomic_number1, help_string="Atomic number of atom 1 in AB_dimer-type descriptors") - call param_register(params, 'atomic_number2', '9', this%atomic_number2, help_string="Atomic number of atom 2 in AB_dimer-type descriptors") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='AB_dimer_initialise args_str')) then - RAISE_ERROR("AB_dimer_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - if( this%atomic_number1 == this%atomic_number2 ) then - RAISE_ERROR("AB_dimer_initialise: AB_dimer_atomic_number1 = AB_dimer_atomic_number2 = "//this%atomic_number1//" which would require addtional permutational symmetries. Use A2_dimer descriptor instead.",error) - endif - - this%initialised = .true. - - endsubroutine AB_dimer_initialise - - subroutine AB_dimer_finalise(this,error) - type(AB_dimer), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%cutoff = 0.0_dp - this%monomer_cutoff = 0.0_dp - this%atomic_number1 = 0 - this%atomic_number2 = 0 - - this%initialised = .false. - - endsubroutine AB_dimer_finalise - - subroutine bond_real_space_initialise(this,args_str,error) - type(bond_real_space), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'bond_cutoff', '0.00', this%bond_cutoff, help_string="Bond cutoff for bond_real_space-type descriptors") - call param_register(params, 'bond_transition_width', '0.00', this%bond_transition_width, help_string="Bond transition width for bond_real_space-type descriptors") - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Space cutoff for bond_real_space-type descriptors") - call param_register(params, 'transition_width', '0.00', this%transition_width, help_string="Space transition width for bond_real_space-type descriptors") - call param_register(params, 'atom_sigma', '0.00', this%atom_sigma, help_string="Atom sigma for bond_real_space-type descriptors") - call param_register(params, 'max_neighbours', '0', this%max_neighbours, help_string="Maximum number of neighbours") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='bond_real_space_initialise args_str')) then - RAISE_ERROR("bond_real_space_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - this%initialised = .true. - - endsubroutine bond_real_space_initialise - - subroutine bond_real_space_finalise(this,error) - type(bond_real_space), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%bond_cutoff = 0.0_dp - this%bond_transition_width = 0.0_dp - this%cutoff = 0.0_dp - this%transition_width = 0.0_dp - this%atom_sigma = 0.0_dp - this%max_neighbours = 0 - - this%initialised = .false. - - endsubroutine bond_real_space_finalise - - subroutine atom_real_space_initialise(this,args_str,error) - type(atom_real_space), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Space cutoff for atom_real_space-type descriptors") - call param_register(params, 'cutoff_transition_width', '0.00', this%cutoff_transition_width, help_string="Space transition width for atom_real_space-type descriptors") - call param_register(params, 'l_max', '0', this%l_max, help_string="Cutoff for spherical harmonics expansion") - call param_register(params, 'alpha', '1.0', this%alpha, help_string="Width of atomic Gaussians") - call param_register(params, 'zeta', '1.0', this%zeta, help_string="Exponent of covariance function") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='atom_real_space_initialise args_str')) then - RAISE_ERROR("atom_real_space_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - this%initialised = .true. - - endsubroutine atom_real_space_initialise - - subroutine atom_real_space_finalise(this,error) - type(atom_real_space), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%cutoff = 0.0_dp - this%cutoff_transition_width = 0.0_dp - this%l_max = 0 - this%alpha = 0.0_dp - this%zeta = 0.0_dp - - this%initialised = .false. - - endsubroutine atom_real_space_finalise - - subroutine power_so3_initialise(this,args_str,error) - type(power_so3), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - integer :: n_species - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Cutoff for power_so3-type descriptors") - call param_register(params, 'min_cutoff', '0.00', this%min_cutoff, help_string="Cutoff for minimal distances in power_so3-type descriptors") - call param_register(params, 'l_max', '4', this%l_max, help_string="L_max for power_so3-type descriptors") - call param_register(params, 'n_max', '4', this%n_max, help_string="N_max for power_so3-type descriptors") - call param_register(params, 'Z', '0', this%Z, help_string="Atomic number of central atom") - call param_register(params, 'n_species', '1', n_species, help_string="Number of species for the descriptor") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='power_so3_initialise args_str')) then - RAISE_ERROR("power_so3_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - allocate(this%species_Z(n_species), this%w(n_species)) - - call initialise(params) - if( n_species == 1 ) then - call param_register(params, 'species_Z', '0', this%species_Z(1), help_string="Atomic number of species") - call param_register(params, 'w', '1.0', this%w(1), help_string="Weight associated to each atomic type") - else - call param_register(params, 'species_Z', PARAM_MANDATORY, this%species_Z, help_string="Atomic number of species") - call param_register(params, 'w', PARAM_MANDATORY, this%w, help_string="Weight associated to each atomic type") - endif - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='power_so3_initialise args_str')) then - RAISE_ERROR("power_so3_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - call initialise(this%Radial,this%n_max,this%cutoff,this%min_cutoff,error) - - this%initialised = .true. - - endsubroutine power_so3_initialise - - subroutine power_so3_finalise(this,error) - type(power_so3), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%cutoff = 0.0_dp - this%min_cutoff = 0.0_dp - this%l_max = 0 - this%n_max = 0 - this%Z = 0 - - if(allocated(this%species_Z)) deallocate(this%species_Z) - if(allocated(this%w)) deallocate(this%w) - - call finalise(this%Radial) - - this%initialised = .false. - - endsubroutine power_so3_finalise - - subroutine power_so4_initialise(this,args_str,error) - type(power_so4), intent(inout), target :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - call finalise(this) - - call initialise(this%fourier_SO4,args_str,error) - - this%cutoff => this%fourier_SO4%cutoff - this%z0_ratio => this%fourier_SO4%z0_ratio - this%z0 => this%fourier_SO4%z0 - this%j_max => this%fourier_SO4%j_max - this%Z => this%fourier_SO4%Z - this%cutoff => this%fourier_SO4%cutoff - this%species_Z => this%fourier_SO4%species_Z - this%w => this%fourier_SO4%w - - this%initialised = .true. - - endsubroutine power_so4_initialise - - subroutine power_so4_finalise(this,error) - type(power_so4), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - - call finalise(this%fourier_SO4,error) - - this%cutoff => null() - this%z0_ratio => null() - this%z0 => null() - this%j_max => null() - this%Z => null() - this%cutoff => null() - this%species_Z => null() - this%w => null() - - this%initialised = .false. - - endsubroutine power_so4_finalise - - subroutine soap_initialise(this,args_str,error) - type(soap), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - real(dp) :: alpha_basis, spacing_basis, cutoff_basis, basis_error_exponent - real(dp), dimension(:,:), allocatable :: covariance_basis, overlap_basis, cholesky_overlap_basis - integer :: i, j, xml_version - - type(LA_Matrix) :: LA_covariance_basis, LA_overlap_basis - character(len=STRING_LENGTH) :: species_Z_str - logical :: has_n_species, has_species_Z, has_central_reference_all_species - - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', PARAM_MANDATORY, this%cutoff, help_string="Cutoff for soap-type descriptors") - call param_register(params, 'cutoff_transition_width', '0.50', this%cutoff_transition_width, help_string="Cutoff transition width for soap-type descriptors") - - call param_register(params, 'cutoff_dexp', '0', this%cutoff_dexp, help_string="Cutoff decay exponent") - call param_register(params, 'cutoff_scale', '1.0', this%cutoff_scale, help_string="Cutoff decay scale") - call param_register(params, 'cutoff_rate', '1.0', this%cutoff_rate, help_string="Inverse cutoff decay rate") - - call param_register(params, 'l_max', PARAM_MANDATORY, this%l_max, help_string="L_max (spherical harmonics basis band limit) for soap-type descriptors") - call param_register(params, 'n_max', PARAM_MANDATORY, this%n_max, help_string="N_max (number of radial basis functions) for soap-type descriptors") - call param_register(params, 'atom_sigma', PARAM_MANDATORY, this%atom_sigma, help_string="Width of atomic Gaussians for soap-type descriptors") - call param_register(params, 'central_weight', '1.0', this%central_weight, help_string="Weight of central atom in environment") - call param_register(params, 'central_reference_all_species', 'F', this%central_reference_all_species, has_value_target=has_central_reference_all_species, & - help_string="Place a Gaussian reference for all atom species densities."// & - "By default (F) only consider when neighbour is the same species as centre") - call param_register(params, 'average', 'F', this%global, help_string="Whether to calculate averaged SOAP - one descriptor per atoms object. If false (default) atomic SOAP is returned.") - call param_register(params, 'diagonal_radial', 'F', this%diagonal_radial, help_string="Only return the n1=n2 elements of the power spectrum.") - - call param_register(params, 'covariance_sigma0', '0.0', this%covariance_sigma0, help_string="sigma_0 parameter in polynomial covariance function") - call param_register(params, 'normalise', 'T', this%normalise, help_string="Normalise descriptor so magnitude is 1. In this case the kernel of two equivalent environments is 1.") - call param_register(params, 'basis_error_exponent', '10.0', basis_error_exponent, help_string="10^(-basis_error_exponent) is the max difference between the target and the expanded function") - - call param_register(params, 'n_Z', '1', this%n_Z, help_string="How many different types of central atoms to consider") - call param_register(params, 'n_species', '1', this%n_species, has_value_target=has_n_species, help_string="Number of species for the descriptor") - call param_register(params, 'species_Z', '', species_Z_str, has_value_target=has_species_Z, help_string="Atomic number of species") - call param_register(params, 'xml_version', '1426512068', xml_version, help_string="Version of GAP the XML potential file was created") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='soap_initialise args_str')) then - RAISE_ERROR("soap_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - ! backwards compatibility: the default used to be different before this version number - if( xml_version < 1426512068 ) this%central_reference_all_species = .true. - - allocate(this%species_Z(this%n_species)) - allocate(this%Z(this%n_Z)) - - if( has_species_Z .and. .not. has_n_species ) then - RAISE_ERROR("soap_initialise: is species_Z is present, n_species must be present, too.",error) - endif - - call initialise(params) - - if( this%cutoff_dexp < 0 ) then - RAISE_ERROR("soap_initialise: cutoff_dexp may not be less than 0",error) - endif - - if( this%cutoff_scale <= 0.0_dp ) then - RAISE_ERROR("soap_initialise: cutoff_scale must be greater than 0",error) - endif - - if( this%cutoff_rate < 0.0_dp ) then - RAISE_ERROR("soap_initialise: cutoff_rate may not be less than 0",error) - endif - - if( has_n_species ) then - if(this%n_species == 1) then - call param_register(params, 'species_Z', '0', this%species_Z(1), help_string="Atomic number of species") - else - call param_register(params, 'species_Z', '//MANDATORY//', this%species_Z, help_string="Atomic number of species") - endif - else - call param_register(params, 'species_Z', '0', this%species_Z(1), help_string="Atomic number of species") - endif - - if( .not. has_central_reference_all_species .and. this%n_species == 1 ) this%central_reference_all_species = .true. - - if( this%n_Z == 1 ) then - call param_register(params, 'Z', '0', this%Z(1), help_string="Atomic number of central atom, 0 is the wild-card") - else - call param_register(params, 'Z', '//MANDATORY//', this%Z, help_string="Atomic numbers to be considered for central atom, must be a list") - endif - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='soap_initialise args_str')) then - RAISE_ERROR("soap_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - this%alpha = 0.5_dp / this%atom_sigma**2 - - alpha_basis = this%alpha - cutoff_basis = this%cutoff + this%atom_sigma * sqrt(2.0_dp * basis_error_exponent * log(10.0_dp)) - spacing_basis = cutoff_basis / this%n_max - - allocate(this%r_basis(this%n_max), this%transform_basis(this%n_max,this%n_max), & - covariance_basis(this%n_max,this%n_max), overlap_basis(this%n_max,this%n_max), this%cholesky_overlap_basis(this%n_max,this%n_max)) - - !this%r_basis(this%n_max) = cutoff_basis - !do i = this%n_max-1, 1, -1 - ! this%r_basis(i) = this%r_basis(i+1) - spacing_basis - !enddo - - this%r_basis(1) = 0.0_dp - do i = 2, this%n_max - this%r_basis(i) = this%r_basis(i-1) + spacing_basis - enddo - - do i = 1, this%n_max - do j = 1, this%n_max - covariance_basis(j,i) = exp(-alpha_basis * (this%r_basis(i) - this%r_basis(j))**2) - !overlap_basis(j,i) = exp(-0.5_dp * alpha_basis* (this%r_basis(i) - this%r_basis(j))**2) * ( 1.0_dp + erf( sqrt(alpha_basis/2.0_dp) * (this%r_basis(i) + this%r_basis(j)) ) ) - !print*, 'A', exp( -alpha_basis*(this%r_basis(i)**2+this%r_basis(j)**2) ) - !print*, 'B', sqrt(2.0_dp) * alpha_basis**1.5_dp * (this%r_basis(i) + this%r_basis(j)) - !print*, 'C', alpha_basis*exp(0.5_dp * alpha_basis * (this%r_basis(i) + this%r_basis(j))**2)*sqrt(PI)*(1.0_dp + alpha_basis*(this%r_basis(i) + this%r_basis(j))**2 ) - !print*, 'D', ( 1.0_dp + erf( sqrt(alpha_basis/2.0_dp) * (this%r_basis(i) + this%r_basis(j)) ) ) - !overlap_basis(j,i) = exp( -alpha_basis*(this%r_basis(i)**2+this%r_basis(j)**2) ) * & - ! ( sqrt(2.0_dp) * alpha_basis**1.5_dp * (this%r_basis(i) + this%r_basis(j)) + & - ! alpha_basis*exp(0.5_dp * alpha_basis * (this%r_basis(i) + this%r_basis(j))**2)*sqrt(PI)*(1.0_dp + alpha_basis*(this%r_basis(i) + this%r_basis(j))**2 ) * & - ! ( 1.0_dp + erf( sqrt(alpha_basis/2.0_dp) * (this%r_basis(i) + this%r_basis(j)) ) ) ) - - overlap_basis(j,i) = ( exp( -alpha_basis*(this%r_basis(i)**2+this%r_basis(j)**2) ) * & - sqrt(2.0_dp) * alpha_basis**1.5_dp * (this%r_basis(i) + this%r_basis(j)) + & - alpha_basis*exp(-0.5_dp * alpha_basis * (this%r_basis(i) - this%r_basis(j))**2)*sqrt(PI)*(1.0_dp + alpha_basis*(this%r_basis(i) + this%r_basis(j))**2 ) * & - ( 1.0_dp + erf( sqrt(alpha_basis/2.0_dp) * (this%r_basis(i) + this%r_basis(j)) ) ) ) - enddo - enddo - - !overlap_basis = overlap_basis * sqrt(pi / ( 8.0_dp * alpha_basis ) ) - overlap_basis = overlap_basis / sqrt(128.0_dp * alpha_basis**5) - - call initialise(LA_covariance_basis,covariance_basis) - call initialise(LA_overlap_basis,overlap_basis) - call LA_Matrix_Factorise(LA_overlap_basis, this%cholesky_overlap_basis) - do i = 1, this%n_max - do j = 1, i-1 !i + 1, this%n_max - this%cholesky_overlap_basis(j,i) = 0.0_dp - enddo - enddo - - call Matrix_Solve(LA_covariance_basis,this%cholesky_overlap_basis,this%transform_basis) - - call finalise(LA_covariance_basis) - call finalise(LA_overlap_basis) - - if(allocated(covariance_basis)) deallocate(covariance_basis) - if(allocated(overlap_basis)) deallocate(overlap_basis) - if(allocated(cholesky_overlap_basis)) deallocate(cholesky_overlap_basis) - - this%initialised = .true. - - endsubroutine soap_initialise - - subroutine soap_finalise(this,error) - type(soap), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%cutoff_dexp = 0 - this%cutoff_scale = 1.0_dp - this%cutoff_rate = 1.0_dp - this%cutoff = 0.0_dp - this%cutoff_transition_width = 0.0_dp - this%l_max = 0 - this%alpha = 0.0_dp - this%central_weight = 0.0_dp - this%central_reference_all_species = .false. - this%global = .false. - this%diagonal_radial = .false. - this%covariance_sigma0 = 0.0_dp - this%normalise = .true. - - this%n_max = 0 - this%n_Z = 0 - this%n_species = 0 - - if(allocated(this%r_basis)) deallocate(this%r_basis) - if(allocated(this%transform_basis)) deallocate(this%transform_basis) - if(allocated(this%cholesky_overlap_basis)) deallocate(this%cholesky_overlap_basis) - if(allocated(this%species_Z)) deallocate(this%species_Z) - if(allocated(this%Z)) deallocate(this%Z) - - this%initialised = .false. - - endsubroutine soap_finalise - - subroutine AN_monomer_initialise(this,args_str,error) - type(AN_monomer), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Cutoff for AN_monomer-type descriptors") - call param_register(params, 'atomic_number', '1', this%atomic_number, help_string="Atomic number in AN_monomer-type descriptors") - call param_register(params, 'N', '4', this%N, help_string="Number of atoms in cluster") - call param_register(params, 'do_atomic', 'T', this%do_atomic, help_string="Descriptors are cluster based or atom-based") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='AN_monomer_initialise args_str')) then - RAISE_ERROR("AN_monomer_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - this%initialised = .true. - - endsubroutine AN_monomer_initialise - - subroutine AN_monomer_finalise(this,error) - type(AN_monomer), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%cutoff = 0.0_dp - this%atomic_number = 0 - this%N = 0 - - this%do_atomic = .false. - this%initialised = .false. - - endsubroutine AN_monomer_finalise - - subroutine general_monomer_initialise(this,args_str,error) - type(general_monomer), intent(inout) :: this - character(len=*), intent(in) :: args_str - character(len=STRING_LENGTH) :: signature_string - character(len=STRING_LENGTH), dimension(99) :: signature_fields - integer, optional, intent(out) :: error - integer :: i,n_atoms,j - - - type(Dictionary) :: params - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Cutoff for general_monomer-type descriptors") - call param_register(params, 'signature', PARAM_MANDATORY, signature_string, help_string="Atomic numbers of monomer one, format {Z1 Z2 Z3 ...}") - call param_register(params, 'atom_ordercheck', 'true', this%atom_ordercheck, help_string="T: find molecules. F: go by order of atoms") - call param_register(params, 'strict', 'true', this%strict, help_string="Raise error if not all atoms assigned to monomer") - call param_register(params, 'power', '1.0', this%power, help_string="Power of distances to be used in the kernel") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='general_monomer_initialise args_str')) then - RAISE_ERROR("general_monomer_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - call split_string(signature_string,' ','{}',signature_fields(:),n_atoms,matching=.true.) - allocate(this%signature(n_atoms)) - - do i=1,n_atoms - this%signature(i) = string_to_int(signature_fields(i)) - end do - - call permutation_data_initialise(this%permutation_data,signature_one=this%signature,error=error) - - this%initialised = .true. - - endsubroutine general_monomer_initialise - - subroutine general_monomer_finalise(this,error) - type(general_monomer), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - - this%cutoff = 0.0_dp - this%power = 1.0_dp - if(allocated(this%signature)) deallocate(this%signature) - - this%initialised = .false. - - endsubroutine general_monomer_finalise - - subroutine com_dimer_initialise(this,args_str,error) - type(com_dimer), intent(inout) :: this - character(len=*), intent(in) :: args_str - character(len=STRING_LENGTH) :: signature_one_string, signature_two_string - character(len=STRING_LENGTH), dimension(99) :: signature_one_fields, signature_two_fields - integer, optional, intent(out) :: error - integer :: i, n_atoms_one, n_atoms_two - - type(Dictionary) :: params - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Cutoff(intermolecular) for com_dimer-type descriptors") - call param_register(params, 'monomer_one_cutoff', '0.00', this%monomer_one_cutoff, help_string="Cutoff(mono1) for com_dimer-type descriptors") - call param_register(params, 'monomer_two_cutoff', '0.00', this%monomer_two_cutoff, help_string="Cutoff(mono2) for com_dimer-type descriptors") - call param_register(params, 'cutoff_transition_width', '0.50', this%cutoff_transition_width, help_string="Width of smooth cutoff region for com_dimer-type descriptors") - call param_register(params, 'atom_ordercheck', 'true', this%atom_ordercheck, help_string="T: find molecules. F: go by order of atoms") - call param_register(params, 'strict', 'true', this%strict, help_string="Raise error if not all atoms assigned to monomer or if no monomer pairs found") - call param_register(params, 'mpifind', 'false', this%mpifind, help_string="Use find_monomer_pairs_MPI") - call param_register(params, 'signature_one', PARAM_MANDATORY, signature_one_string, help_string="Atomic numbers of monomer one, format {Z1 Z2 Z3 ...}") - call param_register(params, 'signature_two', PARAM_MANDATORY, signature_two_string, help_string="Atomic numbers of monomer two, format {Z1 Z2 Z3 ...}") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='com_dimer_initialise args_str')) then - RAISE_ERROR("com_dimer_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - call initialise(this%transfer_parameters, args_str, error) - - call split_string(signature_one_string,' ','{}',signature_one_fields(:),n_atoms_one,matching=.true.) - call split_string(signature_two_string,' ','{}',signature_two_fields(:),n_atoms_two,matching=.true.) - allocate(this%signature_one(n_atoms_one)) - allocate(this%signature_two(n_atoms_two)) - - do i=1,n_atoms_one - this%signature_one(i) = string_to_int(signature_one_fields(i)) - end do - do i=1,n_atoms_two - this%signature_two(i) = string_to_int(signature_two_fields(i)) - end do - - this%monomers_identical=.False. - if (size(this%signature_one) == size(this%signature_two)) then - if (all(this%signature_one == this%signature_two)) then - this%monomers_identical = .True. - end if - end if - - this%initialised = .true. - endsubroutine com_dimer_initialise - - subroutine com_dimer_finalise(this,error) - type(com_dimer), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - if(.not. this%initialised) return - - this%cutoff = 0.0_dp - this%cutoff_transition_width = 0.0_dp - this%monomer_one_cutoff = 0.0_dp - this%monomer_two_cutoff = 0.0_dp - this%atom_ordercheck = .true. - this%use_smooth_cutoff = .false. - if(allocated(this%signature_one)) deallocate(this%signature_one) - if(allocated(this%signature_two)) deallocate(this%signature_two) - - this%initialised = .false. - - endsubroutine com_dimer_finalise - - subroutine general_dimer_initialise(this,args_str,error) - type(general_dimer), intent(inout) :: this - character(len=*), intent(in) :: args_str - character(len=STRING_LENGTH) :: signature_one_string, signature_two_string - character(len=STRING_LENGTH), dimension(99) :: signature_one_fields, signature_two_fields - integer, optional, intent(out) :: error - integer :: i,j, n_atoms_one, n_atoms_two, dimer_size, start, finish, d - logical, dimension(:,:), allocatable :: intermolecular - integer, dimension(:), allocatable :: signature - - type(Dictionary) :: params - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Cutoff(intermolecular) for general_dimer-type descriptors") - call param_register(params, 'monomer_one_cutoff', '0.00', this%monomer_one_cutoff, help_string="Cutoff(mono1) for general_dimer-type descriptors") - call param_register(params, 'monomer_two_cutoff', '0.00', this%monomer_two_cutoff, help_string="Cutoff(mono2) for general_dimer-type descriptors") - call param_register(params, 'cutoff_transition_width', '0.50', this%cutoff_transition_width, help_string="Width of smooth cutoff region for general_dimer-type descriptors") - call param_register(params, 'internal_swaps_only', 'true', this%internal_swaps_only, help_string="F: energies will be symmetrised over swaps of nuclei between monomers") - call param_register(params, 'atom_ordercheck', 'true', this%atom_ordercheck, help_string="T: find molecules. F: go by order of atoms") - call param_register(params, 'double_count', 'false', this%double_count, help_string="T: double count when constructing the dimers, for compatibility with water dimer descriptor, default False") - call param_register(params, 'strict', 'true', this%strict, help_string="Raise error if not all atoms assigned to monomer or if no monomer pairs found") - call param_register(params, 'strict_mask', 'true', this%strict_mask, help_string="Raise error if atom mask includes only part of a monomer") - call param_register(params, 'use_com', 'false', this%use_com, help_string="Use COM instead of COG") - call param_register(params, 'mpifind', 'false', this%mpifind, help_string="Use find_monomer_pairs_MPI") - call param_register(params, 'signature_one', PARAM_MANDATORY, signature_one_string, help_string="Atomic numbers of monomer one, format {Z1 Z2 Z3 ...}") - call param_register(params, 'signature_two', PARAM_MANDATORY, signature_two_string, help_string="Atomic numbers of monomer two, format {Z1 Z2 Z3 ...}") - call param_register(params, 'power', '1.00', this%power, help_string="Power of interatomic distances to be used in the kernel.") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='general_dimer_initialise args_str')) then - RAISE_ERROR("general_dimer_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - call initialise(this%transfer_parameters, args_str, error) - - call split_string(signature_one_string,' ','{}',signature_one_fields(:),n_atoms_one,matching=.true.) - call split_string(signature_two_string,' ','{}',signature_two_fields(:),n_atoms_two,matching=.true.) - allocate(this%signature_one(n_atoms_one)) - allocate(this%signature_two(n_atoms_two)) - - do i=1,n_atoms_one - this%signature_one(i) = string_to_int(signature_one_fields(i)) - end do - do i=1,n_atoms_two - this%signature_two(i) = string_to_int(signature_two_fields(i)) - end do - - this%monomers_identical=.False. - if (size(this%signature_one) == size(this%signature_two)) then - if (all(this%signature_one == this%signature_two)) then - this%monomers_identical = .True. - end if - end if - - call permutation_data_initialise(this%permutation_data,signature_one=this%signature_one,signature_two=this%signature_two,internal_swaps_only=this%internal_swaps_only,error=error) - - dimer_size=n_atoms_one + n_atoms_two - d=dimer_size*(dimer_size-1)/2 - - allocate(signature(dimer_size)) - allocate(intermolecular(dimer_size,dimer_size)) - allocate(this%is_intermolecular(d)) - allocate(this%cutoff_contributor(d)) - allocate(this%component_atoms(d,2)) - - signature(1:n_atoms_one) = this%signature_one - signature(1+n_atoms_one:dimer_size) = this%signature_two - intermolecular = .false. - this%cutoff_contributor=.false. - - do i=1,n_atoms_one - do j=1+n_atoms_one,dimer_size - intermolecular(i,j)=.true. - end do - end do - - start = 0 - finish=dimer_size-1 - do i=1,dimer_size - do j=1,finish-start - this%is_intermolecular(start+j) = intermolecular(i,i+j) - this%component_atoms(start+j,:) = (/ i, i+j /) - end do - start = finish - finish=finish + dimer_size-i-1 - end do - - - do i=1,d - if (this%is_intermolecular(i)) then - if (.not. signature(this%component_atoms(i,1))==1 ) then - if (.not. signature(this%component_atoms(i,2))==1 ) then - this%cutoff_contributor(i)=.true. - end if - end if - end if - end do - - this%initialised = .true. - - deallocate(signature) - deallocate(intermolecular) - endsubroutine general_dimer_initialise - - subroutine general_dimer_finalise(this,error) - type(general_dimer), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - if(.not. this%initialised) return - - this%cutoff = 0.0_dp - this%cutoff_transition_width = 0.0_dp - this%monomer_one_cutoff = 0.0_dp - this%monomer_two_cutoff = 0.0_dp - this%atom_ordercheck = .true. - this%internal_swaps_only = .true. - this%use_smooth_cutoff = .false. - this%power = 1.0_dp - if(allocated(this%signature_one)) deallocate(this%signature_one) - if(allocated(this%signature_two)) deallocate(this%signature_two) - if(allocated(this%is_intermolecular)) deallocate(this%is_intermolecular) - if(allocated(this%component_atoms)) deallocate(this%component_atoms) - if(allocated(this%cutoff_contributor)) deallocate(this%cutoff_contributor) - - this%initialised = .false. - - endsubroutine general_dimer_finalise - - subroutine general_trimer_initialise(this,args_str,error) - type(general_trimer), intent(inout) :: this - character(len=*), intent(in) :: args_str - character(len=STRING_LENGTH) :: signature_one_string, signature_two_string, signature_three_string - character(len=STRING_LENGTH), dimension(99) :: signature_one_fields, signature_two_fields, signature_three_fields - integer, optional, intent(out) :: error - integer :: i,j, n_atoms_one, n_atoms_two, n_atoms_three, trimer_size, start, finish,d - logical, dimension(:,:), allocatable :: intermolecular - integer, dimension(:), allocatable :: signature - - type(Dictionary) :: params - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Cutoff(intermolecular) for general_trimer-type descriptors") - call param_register(params, 'monomer_one_cutoff', '0.00', this%monomer_one_cutoff, help_string="Cutoff(mono1) for general_trimer-type descriptors") - call param_register(params, 'monomer_two_cutoff', '0.00', this%monomer_two_cutoff, help_string="Cutoff(mono2) for general_trimer-type descriptors") - call param_register(params, 'monomer_three_cutoff', '0.00', this%monomer_three_cutoff, help_string="Cutoff(mono3) for general_trimer-type descriptors") - call param_register(params, 'cutoff_transition_width', '0.50', this%cutoff_transition_width, help_string="Width of smooth cutoff region for general_trimer-type descriptors") - call param_register(params, 'internal_swaps_only', 'true', this%internal_swaps_only, help_string="F: energies will be symmetrised over swaps of nuclei between monomers") - call param_register(params, 'atom_ordercheck', 'true', this%atom_ordercheck, help_string="T: find molecules. F: go by order of atoms") - call param_register(params, 'strict', 'true', this%strict, help_string="Raise error if not all atoms assigned to monomer or if no monomer pairs found") - call param_register(params, 'use_com', 'false', this%use_com, help_string="Use COM instead of COG") - call param_register(params, 'mpifind', 'false', this%mpifind, help_string="Use find_monomer_triplets_MPI") - call param_register(params, 'signature_one', PARAM_MANDATORY, signature_one_string, help_string="Atomic numbers of monomer one, format {Z1 Z2 Z3 ...}") - call param_register(params, 'signature_two', PARAM_MANDATORY, signature_two_string, help_string="Atomic numbers of monomer two, format {Z1 Z2 Z3 ...}") - call param_register(params, 'signature_three', PARAM_MANDATORY, signature_three_string, help_string="Atomic numbers of monomer three, format {Z1 Z2 Z3 ...}") - call param_register(params, 'power', '1.0', this%power, help_string="Power of distances to be used in the kernel") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='general_trimer_initialise args_str')) then - RAISE_ERROR("general_trimer_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - call split_string(signature_one_string,' ','{}',signature_one_fields(:),n_atoms_one,matching=.true.) - call split_string(signature_two_string,' ','{}',signature_two_fields(:),n_atoms_two,matching=.true.) - call split_string(signature_three_string,' ','{}',signature_three_fields(:),n_atoms_three,matching=.true.) - allocate(this%signature_one(n_atoms_one)) - allocate(this%signature_two(n_atoms_two)) - allocate(this%signature_three(n_atoms_three)) - - do i=1,n_atoms_one - this%signature_one(i) = string_to_int(signature_one_fields(i)) - end do - do i=1,n_atoms_two - this%signature_two(i) = string_to_int(signature_two_fields(i)) - end do - do i=1,n_atoms_three - this%signature_three(i) = string_to_int(signature_three_fields(i)) - end do - - this%one_two_identical = .false. - this%one_three_identical = .false. - this%two_three_identical = .false. - - if (size(this%signature_one) == size(this%signature_two)) then - if (all(this%signature_one == this%signature_two)) then - this%one_two_identical = .True. - end if - end if - - if (size(this%signature_one) == size(this%signature_three)) then - if (all(this%signature_one == this%signature_three)) then - this%one_three_identical = .True. - end if - end if - - if (size(this%signature_two) == size(this%signature_three)) then - if (all(this%signature_two == this%signature_three)) then - this%two_three_identical = .True. - end if - end if - - call permutation_data_initialise(this%permutation_data,signature_one=this%signature_one,signature_two=this%signature_two,signature_three=this%signature_three,internal_swaps_only=this%internal_swaps_only,error=error) - - trimer_size=n_atoms_one + n_atoms_two + n_atoms_three - d=trimer_size*(trimer_size-1)/2 - - allocate(signature(trimer_size)) - allocate(intermolecular(trimer_size,trimer_size)) - allocate(this%is_intermolecular(d)) - allocate(this%cutoff_contributor(d)) - allocate(this%component_atoms(d,2)) - - signature(1:n_atoms_one) = this%signature_one - signature(1+n_atoms_one:n_atoms_one+n_atoms_two) = this%signature_two - signature(1+n_atoms_one+n_atoms_two:trimer_size) = this%signature_three - intermolecular = .false. - this%cutoff_contributor=.false. - - do i=1,n_atoms_one - do j=1+n_atoms_one,trimer_size - intermolecular(i,j)=.true. - intermolecular(j,i)=.true. - end do - end do - do i=1+n_atoms_one,n_atoms_one+n_atoms_two - do j=1+n_atoms_one+n_atoms_two,trimer_size - intermolecular(i,j)=.true. - intermolecular(j,i)=.true. - end do - end do - - start = 0 - finish=trimer_size-1 - do i=1,trimer_size - do j=1,finish-start - this%is_intermolecular(start+j) = intermolecular(i,i+j) - this%component_atoms(start+j,:) = (/ i, i+j /) - end do - start = finish - finish=finish + trimer_size-i-1 - end do - - do i=1,d - if (this%is_intermolecular(i)) then - if (.not. signature(this%component_atoms(i,1))==1 ) then - if (.not. signature(this%component_atoms(i,2))==1 ) then - this%cutoff_contributor(i)=.true. - end if - end if - end if - end do - - this%initialised = .true. - deallocate(signature) - deallocate(intermolecular) - endsubroutine general_trimer_initialise - - subroutine general_trimer_finalise(this,error) - type(general_trimer), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - if(.not. this%initialised) return - this%cutoff = 0.0_dp - this%cutoff_transition_width = 0.0_dp - this%monomer_one_cutoff = 0.0_dp - this%monomer_two_cutoff = 0.0_dp - this%monomer_three_cutoff = 0.0_dp - this%atom_ordercheck = .true. - this%internal_swaps_only = .true. - this%use_smooth_cutoff = .false. - this%power = 1.0_dp - if(allocated(this%signature_one)) deallocate(this%signature_one) - if(allocated(this%signature_two)) deallocate(this%signature_two) - if(allocated(this%signature_three)) deallocate(this%signature_three) - - this%initialised = .false. - - endsubroutine general_trimer_finalise - - subroutine rdf_initialise(this,args_str,error) - type(rdf), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - integer :: i - real(dp) :: r_min, r_max - logical :: has_r_max, has_w_gauss - - INIT_ERROR(error) - - call finalise(this) - call initialise(params) - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Cutoff for rdf-type descriptors") - call param_register(params, 'transition_width', '0.20', this%transition_width, help_string="Width of transition region from 1 to 0") - call param_register(params, 'Z', '0', this%Z, help_string="Atomic number of central atom") - call param_register(params, 'r_min', '0.0', r_min, help_string="Atomic number of central atom") - call param_register(params, 'r_max', '0.0', r_max, has_value_target = has_r_max, help_string="Atomic number of central atom") - call param_register(params, 'n_gauss', '10', this%n_gauss, help_string="Atomic number of central atom") - call param_register(params, 'w_gauss', '0.0', this%w_gauss, has_value_target = has_w_gauss, help_string="Atomic number of central atom") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='rdf_initialise args_str')) then - RAISE_ERROR("rdf_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - allocate(this%r_gauss(this%n_gauss)) - if(.not. has_w_gauss) this%w_gauss = this%cutoff / this%n_gauss * 2.0_dp - if(.not. has_r_max) r_max = this%cutoff - this%w_gauss / 2.0_dp - this%r_gauss = real( (/(i,i=1,this%n_gauss)/), kind=dp ) / real(this%n_gauss,kind=dp) * (r_max - r_min) + r_min - - this%initialised = .true. - - endsubroutine rdf_initialise - - subroutine rdf_finalise(this,error) - type(rdf), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%cutoff = 0.0_dp - this%transition_width = 0.0_dp - this%Z = 0 - this%n_gauss = 0 - if( allocated(this%r_gauss) ) deallocate(this%r_gauss) - - this%initialised = .false. - - endsubroutine rdf_finalise - - subroutine as_distance_2b_initialise(this,args_str,error) - type(as_distance_2b), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'min_cutoff', '0.00', this%min_cutoff, help_string="Lower cutoff for as_distance_2b-type descriptors") - call param_register(params, 'max_cutoff', PARAM_MANDATORY, this%max_cutoff, help_string="Higher cutoff for as_distance_2b-type descriptors") - call param_register(params, 'as_cutoff', PARAM_MANDATORY, this%as_cutoff, help_string="Cutoff of asymmetricity") - call param_register(params, 'overlap_alpha', '0.50', this%as_cutoff, help_string="Cutoff of asymmetricity") - call param_register(params, 'min_transition_width', '0.50', this%min_transition_width, help_string="Transition width of lower cutoff for as_distance_2b-type descriptors") - call param_register(params, 'max_transition_width', '0.50', this%max_transition_width, help_string="Transition width of higher cutoff for as_distance_2b-type descriptors") - call param_register(params, 'as_transition_width', '0.10', this%as_transition_width, help_string="Transition width of asymmetricity cutoff for as_distance_2b-type descriptors") - call param_register(params, 'coordination_cutoff', PARAM_MANDATORY, this%coordination_cutoff, help_string="Cutoff for coordination function in as_distance_2b-type descriptors") - call param_register(params, 'coordination_transition_width', '0.50', this%coordination_transition_width, help_string="Transition width for as_distance_2b-type descriptors") - call param_register(params, 'Z1', '0', this%Z1, help_string="Atom type #1 in bond") - call param_register(params, 'Z2', '0', this%Z2, help_string="Atom type #2 in bond") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='as_distance_2b_initialise args_str')) then - RAISE_ERROR("as_distance_2b_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - this%initialised = .true. - - endsubroutine as_distance_2b_initialise - - subroutine as_distance_2b_finalise(this,error) - type(as_distance_2b), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%min_cutoff = 0.0_dp - this%max_cutoff = 0.0_dp - this%as_cutoff = 0.0_dp - this%overlap_alpha = 0.0_dp - this%min_transition_width = 0.0_dp - this%max_transition_width = 0.0_dp - this%as_transition_width = 0.0_dp - this%coordination_cutoff = 0.0_dp - this%coordination_transition_width = 0.0_dp - this%Z1 = 0 - this%Z2 = 0 - - this%initialised = .false. - - endsubroutine as_distance_2b_finalise - - subroutine molecule_lo_d_initialise(this,args_str,error) - type(molecule_lo_d), intent(inout) :: this - character(len=*), intent(in) :: args_str - character(len=STRING_LENGTH) :: signature_string, atoms_template_string, symmetry_string, symmetry_property_name, append_file, append_string - character(len=STRING_LENGTH), dimension(99) :: signature_fields, symmetry_rows, row_fields, append_rows,template_rows - integer, optional, intent(out) :: error - integer :: i,n_atoms,j,n_symm_rows, current_depth, start, finish, i_component, atom_j, N_atom_pairs, atom_k,n_append_rows, old_size, n_perms,n_template_rows - integer, dimension(:,:), allocatable :: equivalents_input, bonds_to_append, tmp_permutations - logical :: signature_given, symmetries_given, add_bond, j_k_present, k_j_present - integer, dimension(:,:), pointer :: symm_2d - integer, dimension(:), pointer :: symm_1d - - type(Table) :: atom_a, atom_b - type(CInOutput) :: tempatoms - type(inoutput) :: tempfile - type(inoutput) :: symmetry_inout - type(inoutput) :: append_inout - type(Connection) :: at_connect - - type(Dictionary) :: params - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Cutoff for molecule_lo_d-type descriptors") - call param_register(params, 'atoms_template_string', PARAM_MANDATORY, atoms_template_string , help_string="Atoms object which serves as a template - written to a string") - call param_register(params, 'neighbour_graph_depth', '2', this%neighbour_graph_depth, help_string="Ignore distances between atoms separated by more than this number of bonds") - call param_register(params, 'signature', '', signature_string, help_string="Atomic numbers of monomer one, format {Z1 Z2 Z3 ...}") - call param_register(params, 'symmetry_property_name', 'symm', symmetry_property_name, help_string="Integer arrays specifying symmetries - see header of make_permutations_v2.f95 for format") - call param_register(params, 'append_file', '', append_file, help_string="Pairs of atoms for which we want the distance to be additionally included in the descriptor") - call param_register(params, 'atom_ordercheck', 'T', this%atom_ordercheck, help_string= & - "T: basic check that atoms in same order as in template F: assume all xyz frames have atoms in same order") - call param_register(params, 'desctype', '0', this%desctype, help_string="0: distance matrix, 1: inverse distance matrix, 2: Coulomb matrix, 3: exponential") - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='molecule_lo_d_initialise args_str')) then - RAISE_ERROR("molecule_lo_d_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - do i=1,len_trim(atoms_template_string) - if(atoms_template_string(i:i)=='%') then - atoms_template_string(i:i)=' ' - end if - end do - - ! read in the atoms object in the sample geometry file - call initialise(tempfile, filename="temp.xyz",action=OUTPUT) - call split_string(atoms_template_string,';','{}',template_rows(:),n_template_rows,matching=.true.) - do i=1,n_template_rows - call print(template_rows(i),file=tempfile) - end do - call finalise(tempfile) - call initialise(tempatoms,"temp.xyz") - call read(this%template_atoms, tempatoms, error=error) - - this%n_atoms = this%template_atoms%N - ! make a table of bonds - this copied from topology module private function create_bond_list - call calc_connect(at_connect,this%template_atoms,error=error) - if (this%neighbour_graph_depth > 0) then - do i=1,this%template_atoms%N - - call initialise(atom_a,4,0,0,0,0) - call append(atom_a,(/i,0,0,0/)) - call bfs_step(this%template_atoms,atom_a,atom_b,nneighb_only=.false.,min_images_only=.true.,alt_connect=at_connect) - - do j = 1,atom_b%N - atom_j = atom_b%int(1,j) - if (atom_j.gt.i) then - add_bond = .true. - - if (add_bond) then - call append(this%bonds,(/i,atom_j/)) - endif - - else -! call print('not added '//i//' -- '//atom_j) - endif - enddo - call finalise(atom_a) - call finalise(atom_b) - enddo - ! add atom pairs separated by up to neighbour_graph_depth bonds - current_depth = 1 - this%atom_pairs=this%bonds - do while (current_depth < this%neighbour_graph_depth) - current_depth = current_depth + 1 - call bond_list_next_layer(this%bonds,this%atom_pairs) - end do - endif - - ! append any manually specified bonds, if not already present - if (.not. append_file .eq. '') then - call initialise(append_inout,trim(append_file)) - read(append_inout%unit,'(a)') append_string - call split_string(append_string,',','{}',append_rows(:),n_append_rows,matching=.true.) - - do i = 1, n_append_rows - call split_string(append_rows(i),' ','{}',row_fields(:),n_atoms,matching=.true.) - if ( n_atoms .ne. 2) then - RAISE_ERROR("append_file incorrectly formatted, expected atoms in pairs",error) - end if - if (.not. allocated(bonds_to_append)) allocate(bonds_to_append(n_append_rows,n_atoms)) - do j=1,n_atoms - bonds_to_append(i,j) = string_to_int(row_fields(j)) - end do - end do - - - do i=1,size(bonds_to_append,1) - atom_j = bonds_to_append(i,1) - atom_k = bonds_to_append(i,2) - if ( this%neighbour_graph_depth > 0) then - N_atom_pairs = this%atom_pairs%N - j_k_present = any(this%atom_pairs%int(1,:N_atom_pairs) .eq. atom_j .and. (this%atom_pairs%int(2,:N_atom_pairs) .eq. atom_k)) - k_j_present = any(this%atom_pairs%int(1,:N_atom_pairs) .eq. atom_k .and. (this%atom_pairs%int(2,:N_atom_pairs) .eq. atom_j)) - else - j_k_present = .false. - k_j_present = .false. - end if - if (.not. j_k_present .and. .not. k_j_present) then - call append(this%atom_pairs,(/atom_j,atom_k/)) - end if - end do - end if - - !call print('table of atom pairs included in descriptor') - !call print(this%atom_pairs) - signature_given = .False. - symmetries_given = .False. - call permutation_data_finalise(this%permutation_data) - ! parse signature, if given - if (.not. signature_string .eq. '') then - signature_given=.True. - call split_string(signature_string,' ','{}',signature_fields(:),n_atoms,matching=.true.) - if (.not. n_atoms .eq. this%n_atoms) then - RAISE_ERROR('signature does not have correct number of entries', error) - end if - allocate(this%signature(this%n_atoms)) - - do i=1,this%n_atoms - this%signature(i) = string_to_int(signature_fields(i)) - end do - call permutation_data_initialise(this%permutation_data,signature_one=this%signature,error=error) - end if - - ! parse symmetries, if given - symmetries_given = has_property(this%template_atoms,symmetry_property_name) - if (symmetries_given) then - if (.not. assign_pointer(this%template_atoms, symmetry_property_name, symm_1d)) then - if (.not. assign_pointer(this%template_atoms, symmetry_property_name, symm_2d)) then - RAISE_ERROR('IPModel_Coulomb_Calc failed to assign pointer to "'//trim(symmetry_property_name)//'" property', error) - else - if (.not. allocated(equivalents_input)) allocate(equivalents_input(size(symm_2d,1),size(symm_2d,2))) - equivalents_input=symm_2d - end if - else - if (.not. allocated(equivalents_input)) allocate(equivalents_input(1,size(symm_1d))) - equivalents_input(1,:)=symm_1d - endif - call permutation_data_initialise(this%permutation_data,equivalents_input=equivalents_input,error=error) - end if - - ! If no signature is given and no symmetries are manually specified we just make a dummy signature to initialise the permutation data - if (.not. (signature_given) .and. .not. (symmetries_given)) then - allocate(this%signature(this%n_atoms)) - do i=1,this%n_atoms - this%signature(i) = i - end do - call permutation_data_initialise(this%permutation_data,signature_one=this%signature,error=error) - end if - - ! make a mapping from i,j pairs to dist_vec components, and compile the list of these which actually make up the descriptor - - this%max_dimension = this%n_atoms * (this%n_atoms -1 ) / 2 - N_atom_pairs = this%atom_pairs%N - allocate(this%component_atoms(this%max_dimension,2)) - allocate(this%included_components(N_atom_pairs)) - this%included_components=0 - - i_component=1 - start = 0 - finish=this%n_atoms-1 - do i=1,this%n_atoms - do j=1,finish-start - this%component_atoms(start+j,:) = (/ i, i+j /) - if (any(this%atom_pairs%int(1,:n_atom_pairs) .eq. i .and. this%atom_pairs%int(2,:n_atom_pairs) .eq. i+j) .or. & - any(this%atom_pairs%int(2,:n_atom_pairs) .eq. i .and. this%atom_pairs%int(1,:n_atom_pairs) .eq. i+j)) then - this%included_components(i_component) = start+j - i_component = i_component + 1 - end if - end do - start = finish - finish=finish + this%n_atoms-i-1 - end do - - if (any(this%included_components .eq. 0)) then - RAISE_ERROR('molecule_lo_d_initialise : something went wrong picking out the correct interatomic distances',error) - end if - - this%initialised = .true. - - endsubroutine molecule_lo_d_initialise - - subroutine molecule_lo_d_finalise(this,error) - type(molecule_lo_d), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%cutoff = 0.0_dp - if (allocated(this%signature)) deallocate(this%signature) - if (allocated(this%component_atoms)) deallocate(this%component_atoms) - if (allocated(this%included_components)) deallocate(this%included_components) - - - - this%initialised = .false. - - endsubroutine molecule_lo_d_finalise - - subroutine alex_initialise(this,args_str,error) - type(alex), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', '0.00', this%cutoff, help_string="Cutoff for alex-type descriptors") - call param_register(params, 'Z', '0', this%Z, help_string="Atomic number of central atom") - call param_register(params, 'power_min', '5', this%power_min, help_string="Minimum power of radial basis for the descriptor") - call param_register(params, 'power_max', '10', this%power_max, help_string="Maximum power of the radial basis for the descriptor") - call param_register(params, 'n_species', '1', this%n_species, help_string="Number of species for the descriptor") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='alex_initialise args_str')) then - RAISE_ERROR("alex_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - allocate(this%species_Z(this%n_species)) - - call initialise(params) - if( this%n_species == 1 ) then - call param_register(params, 'species_Z', '0', this%species_Z(1), help_string="Atomic number of species") - else - call param_register(params, 'species_Z', PARAM_MANDATORY, this%species_Z, help_string="Atomic number of species") - endif - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='alex_initialise args_str')) then - RAISE_ERROR("alex_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - this%initialised = .true. - - endsubroutine alex_initialise - - subroutine alex_finalise(this,error) - type(alex), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%cutoff = 0.0_dp - - if(allocated(this%species_Z)) deallocate(this%species_Z) - - this%initialised = .false. - - endsubroutine alex_finalise - - subroutine distance_Nb_initialise(this,args_str,error) - type(distance_Nb), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(len=STRING_LENGTH) :: default_Z = "" - integer :: i, j, k, i_p - integer :: nEdges, nConnectivities, nMonomerConnectivities - integer, dimension(:), allocatable :: n_permutations, connectivityList - integer, dimension(:,:), allocatable :: atom_permutations, distance_matrix_index, edges - - logical, dimension(:,:,:), allocatable :: allConnectivities - - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', PARAM_MANDATORY, this%cutoff, help_string="Cutoff for distance_Nb-type descriptors") - call param_register(params, 'cutoff_transition_width', '0.5', this%cutoff_transition_width, help_string="Transition width of cutoff for distance_Nb-type descriptors") - call param_register(params, 'order', PARAM_MANDATORY, this%order, help_string="Many-body order, in terms of number of neighbours") - call param_register(params, 'compact_clusters', "F", this%compact_clusters, help_string="If true, generate clusters where the atoms have at least one connection to the central atom. If false, only clusters where all atoms are connected are generated.") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='distance_Nb_initialise args_str')) then - RAISE_ERROR("distance_Nb_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - if( this%order < 1 ) then - RAISE_ERROR("distance_Nb_initialise: order must be greater than 0",error) - endif - - allocate(this%Z(this%order)) - default_Z = "" - do i = 1, this%order - default_Z = trim(default_Z) // " 0" - enddo - - call initialise(params) - if( this%order == 1 ) then - call param_register(params, 'Z', trim(default_Z), this%Z(1), help_string="Atomic type of neighbours") - else - call param_register(params, 'Z', trim(default_Z), this%Z, help_string="Atomic type of neighbours") - endif - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='distance_Nb_initialise args_str')) then - RAISE_ERROR("distance_Nb_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - call finalise(params) - - call sort_array(this%Z) - call distance_Nb_n_permutations(this%Z, n_permutations) - this%n_permutations = product(factorial_int(n_permutations)) - - allocate(atom_permutations(this%order,this%n_permutations)) - call distance_Nb_permutations(n_permutations,atom_permutations) - - allocate(distance_matrix_index(this%order,this%order)) - allocate(this%permutations( max(1,(this%order - 1) * this%order / 2), this%n_permutations)) - - if( this%order == 1 ) then - this%permutations = 1 - else - k = 0 - do i = 1, this%order - do j = i+1, this%order - k = k + 1 - distance_matrix_index(j,i) = k - distance_matrix_index(i,j) = k - enddo - enddo - - do i_p = 1, this%n_permutations - k = 0 - do i = 1, this%order - do j = i+1, this%order - k = k + 1 - this%permutations(k,i_p) = distance_matrix_index(atom_permutations(j,i_p), atom_permutations(i,i_p)) - enddo - enddo - enddo - endif - - nEdges = this%order * (this%order - 1) / 2 - allocate( edges(2,nEdges)) - - k = 0 - do i = 1, this%order - do j = i+1, this%order - k = k + 1 - edges(:,k) = (/i,j/) - enddo - enddo - - nConnectivities = 2**nEdges - - allocate(allConnectivities(this%order,this%order,nConnectivities)) - allocate(connectivityList(nEdges)) - - nMonomerConnectivities = 0 - do i = 1, nConnectivities - call integerDigits(i-1,2,connectivityList) - allConnectivities(:,:,i) = .false. - do j = 1, nEdges - allConnectivities(edges(1,j),edges(2,j),i) = ( connectivityList(j) == 1 ) - allConnectivities(edges(2,j),edges(1,j),i) = ( connectivityList(j) == 1 ) - enddo - - if( graphIsConnected( allConnectivities(:,:,i) ) ) nMonomerConnectivities = nMonomerConnectivities + 1 - enddo - - allocate(this%monomerConnectivities(this%order,this%order,nMonomerConnectivities)) - j = 0 - do i = 1, nConnectivities - if( graphIsConnected( allConnectivities(:,:,i) ) ) then - j = j + 1 - this%monomerConnectivities(:,:,j) = allConnectivities(:,:,i) - endif - enddo - - if(allocated(n_permutations)) deallocate(n_permutations) - if(allocated(atom_permutations)) deallocate(atom_permutations) - if(allocated(distance_matrix_index)) deallocate(distance_matrix_index) - if(allocated(edges)) deallocate(edges) - if(allocated(allConnectivities)) deallocate(allConnectivities) - if(allocated(connectivityList)) deallocate(connectivityList) - this%initialised = .true. - - endsubroutine distance_Nb_initialise - - subroutine distance_Nb_finalise(this,error) - type(distance_Nb), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%cutoff = 0.0_dp - this%cutoff_transition_width = 0.5_dp - this%order = 0 - this%n_permutations = 0 - this%compact_clusters = .false. - if(allocated(this%Z)) deallocate(this%Z) - if(allocated(this%permutations)) deallocate(this%permutations) - if(allocated(this%monomerConnectivities)) deallocate(this%monomerConnectivities) - - this%initialised = .false. - - endsubroutine distance_Nb_finalise - - subroutine soap_express_initialise(this,args_str,error) - type(soap_express), intent(inout) :: this - character(len=*), intent(in) :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - - logical :: has_atom_sigma_angular - - integer :: l, k, i, j, m, n - real(dp) :: fact, fact1, fact2, ppi, atom_sigma_radial_normalised, cutoff_hard,& - s2, I_n, N_n, N_np1, N_np2, I_np1, I_np2, C2 - - type(LA_Matrix) :: LA_overlap - real(dp), dimension(:), allocatable :: s - real(dp), dimension(:,:), allocatable :: sqrt_overlap, u, v - real(dp), parameter :: sqrt_two = sqrt(2.0_dp) - - INIT_ERROR(error) - - call finalise(this) - - call initialise(params) - call param_register(params, 'cutoff', PARAM_MANDATORY, this%cutoff, help_string="Cutoff for soap-type descriptors") - call param_register(params, 'cutoff_transition_width', '0.50', this%cutoff_transition_width, help_string="Cutoff transition width for soap-type descriptors") - call param_register(params, 'cutoff_decay_rate', '4', this%cutoff_decay_rate, help_string="Cutoff decay rate for soap-type descriptors") - - call param_register(params, 'atom_sigma_radial', PARAM_MANDATORY, this%atom_sigma_radial, & - help_string="Width of atomic Gaussians for soap-type descriptors in the radial direction") - - call param_register(params, 'atom_sigma_angular', '0.0', this%atom_sigma_angular, & - help_string="Width of atomic Gaussians for soap-type descriptors in the angular direction",has_value_target = has_atom_sigma_angular) - - call param_register(params, 'central_weight', '1.0', this%central_weight, help_string="Weight of central atom in environment") - call param_register(params, 'covariance_sigma0', '0.0', this%covariance_sigma0, help_string="sigma_0 parameter in polynomial covariance function") - call param_register(params, 'atom_sigma_scaling_radial', '0.0', this%atom_sigma_scaling_radial, & - help_string="Scaling rate of radial sigma: scaled as a function of neighbour distance") - call param_register(params, 'atom_sigma_scaling_angular', '0.0', this%atom_sigma_scaling_angular, & - help_string="Scaling rate of angular sigma: scaled as a function of neighbour distance") - call param_register(params, 'amplitude_scaling', '0.0', this%amplitude_scaling, & - help_string="Scaling rate of amplitude: scaled as an inverse function of neighbour distance") - - call param_register(params, 'l_max', PARAM_MANDATORY, this%l_max, help_string="L_max (spherical harmonics basis band limit) for soap-type descriptors") - call param_register(params, 'n_max', PARAM_MANDATORY, this%n_max, help_string="N_max (number of radial basis functions) for soap-type descriptors") - - if (.not. param_read_line(params, args_str, ignore_unknown=.true.,task='soap_express_initialise args_str')) then - RAISE_ERROR("soap_express_initialise failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - if( this%n_max > 12 ) then - RAISE_ERROR("soap_express_initialise: radial expansion unstable for n_max > 12",error) - endif - - if( this%l_max > 12 ) then - RAISE_ERROR("soap_express_initialise: radial expansion unstable for l_max > 12",error) - endif - - if( .not. has_atom_sigma_angular ) this%atom_sigma_angular = this%atom_sigma_radial - - allocate(this%semifactorial_table(0:this%l_max)) - If( this%l_max >= 0 )then - fact = 1.0_dp - do l = 0, this%l_max - fact = fact * (2.0_dp*l + 1.0_dp) - this%semifactorial_table(l) = fact - enddo - else - RAISE_ERROR("soap_express_initialise: l_max must be greater or equal to zero", error) - endif - this%angular_array_size = 1 + ( this%l_max*(this%l_max+1) ) / 2 + this%l_max - - allocate(this%Y_lm_prefactor(this%angular_array_size)) - - k = 1 - do l = 0, this%l_max - ppi = sqrt((2*l+1)/4.0_dp/PI) - fact2 = 1.0_dp - do i = 1, l - fact2 = fact2 * i - enddo - fact1 = fact2 - do m = 0, l - if( m > 0 )then - ! This is the factorial of (l-m) - fact1 = fact1 / (l+1-m) - ! This is the factorial of (l+m) - fact2 = fact2 * (l+m) - end if - this%Y_lm_prefactor(k) = ppi * sqrt(fact1/fact2) - k = k + 1 - end do - end do - - allocate( this%overlap(this%n_max, this%n_max) ) - allocate( this%basis_transformation_coefficients(this%n_max, this%n_max) ) - allocate( sqrt_overlap(this%n_max, this%n_max) ) - - ! These are the overlap integrals for the polynomial functions - do i = 1, this%n_max-1 - this%overlap(i,i) = 1.0_dp - do j = i+1, this%n_max-1 - this%overlap(i,j) = sqrt( (5.0_dp+2.0_dp*i) * (5.0_dp+2.0_dp*j) ) / real(5+i+j,kind=dp) - this%overlap(j,i) = this%overlap(i,j) - end do - end do - -! These are the overlap integrals between the Gaussian and the polynomials -! See derivation of radial expansion coefficients to understand this code -! **** New basis **** - atom_sigma_radial_normalised = this%atom_sigma_radial/this%cutoff - cutoff_hard = 1.0_dp -! ******************* - s2 = atom_sigma_radial_normalised**2 - I_n = 0.0_dp - N_n = 1.0_dp - N_np1 = descriptor_soap_express_N_a(cutoff_hard, -2) - I_np1 = sqrt(PI/2.0_dp) * atom_sigma_radial_normalised * & - erf( cutoff_hard/sqrt_two/atom_sigma_radial_normalised ) / N_np1 - C2 = s2 / cutoff_hard - do n = -1, this%n_max-1 - C2 = C2 * cutoff_hard - N_np2 = descriptor_soap_express_N_a(cutoff_hard, n) - I_np2 = s2 * (n+1) * N_n/ N_np2 * I_n & - + N_np1 * cutoff_hard / N_np2 * I_np1 & - - C2 / N_np2 - if(n > 0)then - ! Include the normalization factor of the Gaussian - this%overlap(this%n_max, n) = I_np2 * sqrt_two / & - sqrt(atom_sigma_radial_normalised) / PI**0.25_dp - this%overlap(n, this%n_max) = this%overlap(this%n_max, n) - end if - N_n = N_np1 - N_np1 = N_np2 - I_n = I_np1 - I_np1 = I_np2 - end do - this%overlap(this%n_max,this%n_max) = 1.0_dp - - call initialise(LA_overlap,this%overlap) - call LA_Matrix_SVD_Allocate(LA_overlap,s,u,v,error) - call LA_Matrix_SVD(LA_overlap,s,u,v,error) - - sqrt_overlap = 0.0_dp - do i = 1, this%n_max - sqrt_overlap(i,i) = sqrt(s(i)) - end do - sqrt_overlap = matmul(U,sqrt_overlap) - sqrt_overlap = matmul(sqrt_overlap,transpose(V)) - - LA_overlap = sqrt_overlap - call LA_Matrix_Factorise(LA_overlap,error=error) - call LA_Matrix_Inverse(LA_overlap,this%basis_transformation_coefficients) - call Finalise(LA_overlap) - if(allocated(sqrt_overlap)) deallocate(sqrt_overlap) - if(allocated(s)) deallocate(s) - if(allocated(u)) deallocate(u) - if(allocated(v)) deallocate(v) - - this%initialised = .true. - - endsubroutine soap_express_initialise - - subroutine soap_express_finalise(this,error) - type(soap_express), intent(inout) :: this - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(.not. this%initialised) return - this%cutoff = 0.0_dp - this%cutoff_transition_width = 0.0_dp - this%cutoff_decay_rate = 0.0_dp - this%l_max = 0 - this%n_max = 0 - - this%atom_sigma_radial = 0.0_dp - this%atom_sigma_angular = 0.0_dp - this%central_weight = 0.0_dp - this%covariance_sigma0 = 0.0_dp - this%atom_sigma_scaling_radial = 0.0_dp - this%atom_sigma_scaling_angular = 0.0_dp - this%amplitude_scaling = 0.0_dp - - if(allocated(this%basis_transformation_coefficients)) deallocate(this%basis_transformation_coefficients) - if(allocated(this%overlap)) deallocate(this%overlap) - if(allocated(this%semifactorial_table)) deallocate(this%semifactorial_table) - if(allocated(this%Y_lm_prefactor)) deallocate(this%Y_lm_prefactor) - - this%initialised = .false. - - endsubroutine soap_express_finalise - - subroutine distance_Nb_n_permutations(Z,n_permutations,error) - integer, dimension(:), intent(in) :: Z - integer, dimension(:), allocatable :: n_permutations - integer, optional, intent(out) :: error - - integer :: i - integer, dimension(:), allocatable :: uniq_Z - - INIT_ERROR(error) - - call uniq(Z,uniq_Z) - call reallocate(n_permutations,size(uniq_Z)) - - do i = 1, size(uniq_Z) - n_permutations(i) = count( uniq_Z(i) == Z ) - enddo - - if(allocated(uniq_Z)) deallocate(uniq_Z) - - endsubroutine distance_Nb_n_permutations - - recursive subroutine distance_Nb_permutations(n_permutations,permutations) - integer, dimension(:), intent(in) :: n_permutations - integer, dimension(sum(n_permutations),product(factorial_int(n_permutations))), intent(inout) :: permutations - - integer, dimension(:), allocatable, save :: current_permutation - integer :: i, j, n_lo, n_hi - integer, save :: recursion_level = 0, i_current_permutation = 0 - - recursion_level = recursion_level + 1 - - - if( recursion_level == 1 ) then - i_current_permutation = 0 - allocate(current_permutation(sum(n_permutations))) - current_permutation = 0 - endif - - - do i = 1, size(n_permutations) - if( i == 1 ) then - n_lo = 1 - else - n_lo = sum(n_permutations(1:i-1)) + 1 - endif - n_hi = sum(n_permutations(1:i)) - do j = n_lo, n_hi - if( i_current_permutation < size(permutations,2) ) then - if( .not. any(j==current_permutation) .and. recursion_level >= n_lo .and. recursion_level <= n_hi ) then - - current_permutation(recursion_level) = j - if( recursion_level == sum(n_permutations) ) then - i_current_permutation = i_current_permutation + 1 - permutations(:,i_current_permutation) = current_permutation - else - call distance_Nb_permutations(n_permutations,permutations) - endif - endif - endif - enddo - enddo - - current_permutation(recursion_level) = 0 - - recursion_level = recursion_level - 1 - - if( recursion_level == 0 ) then - deallocate(current_permutation) - endif - - endsubroutine distance_Nb_permutations - - subroutine descriptor_str_add_species(this,species,descriptor_str,error) - character(len=*), intent(in) :: this - integer, dimension(:), intent(in) :: species - character(len=STRING_LENGTH), dimension(:), allocatable, intent(out) :: descriptor_str - integer, optional, intent(out) :: error - - integer :: my_descriptor_type, i, j, k, l, n_species, order, n - integer, dimension(:,:), allocatable :: ZN - real(dp), dimension(:), allocatable :: w - type(Dictionary) :: params - - INIT_ERROR(error) - - if(allocated(descriptor_str)) deallocate(descriptor_str) - - my_descriptor_type = get_descriptor_type(this,error) - n_species = size(species) - - select case(my_descriptor_type) - case(DT_BISPECTRUM_SO4,DT_BISPECTRUM_SO3,DT_BEHLER,DT_COSNX,DT_POWER_SO3,DT_POWER_SO4) - allocate(w(n_species)) - allocate(descriptor_str(n_species)) - - if( n_species == 1 ) then - w = 1.0_dp - else - w = real( (/ (i, i=0, n_species-1) /), kind=dp ) / (n_species-1) * 0.5_dp + 0.5_dp - endif - - do i = 1, n_species - descriptor_str(i) = trim(this)//" n_species="//n_species//" Z="//species(i)//" species_Z={"//species//"} w={"//w//"}" - enddo - - deallocate(w) - case(DT_SOAP) - allocate(descriptor_str(n_species)) - do i = 1, n_species - descriptor_str(i) = trim(this)//" n_species="//n_species//" Z="//species(i)//" species_Z={"//species//"}" - enddo - case(DT_DISTANCE_2B,DT_CO_DISTANCE_2B,DT_AS_DISTANCE_2B) - allocate(descriptor_str(n_species * (n_species+1) / 2)) - - l = 0 - do i = 1, n_species - do j = i, n_species - l = l + 1 - descriptor_str(l) = trim(this)//" Z1="//species(i)//" Z2="//species(j) - enddo - enddo - - case(DT_COORDINATION,DT_RDF) - allocate(descriptor_str(n_species)) - do i = 1, n_species - descriptor_str(i) = trim(this)//" Z="//species(i) - enddo - case(DT_ANGLE_3B,DT_CO_ANGLE_3B) - allocate(descriptor_str(n_species * n_species * (n_species+1) / 2)) - l = 0 - do i = 1, n_species - do j = 1, n_species - do k = j, n_species - l = l + 1 - descriptor_str(l) = trim(this)//" Z="//species(i)//" Z1="//species(j)//" Z2="//species(k) - enddo - enddo - enddo - case(DT_GENERAL_MONOMER,DT_GENERAL_DIMER,DT_WATER_MONOMER,DT_WATER_DIMER,DT_A2_DIMER,DT_AB_DIMER,DT_TRIHIS,DT_BOND_REAL_SPACE,DT_ATOM_REAL_SPACE,DT_AN_MONOMER) - allocate(descriptor_str(1)) - descriptor_str(1) = trim(this) - case(DT_DISTANCE_NB) - call initialise(params) - call param_register(params, 'order', PARAM_MANDATORY, order, help_string="Many-body order, in terms of number of neighbours") - if (.not. param_read_line(params, this, ignore_unknown=.true.,task='descriptor_str_add_species this')) then - RAISE_ERROR("descriptor_str_add_species failed to parse descriptor string='"//trim(this)//"'", error) - endif - call finalise(params) - - n = 1 - do i = 1, order - n = n * ( n_species + i - 1 ) / i ! avoids double counting - enddo - - allocate(ZN(order,n),descriptor_str(n)) - - call descriptor_str_add_species_distance_Nb(ZN,species,order) - - do i = 1, n - descriptor_str(i) = trim(this)//" Z={"//ZN(:,i)//"}" - enddo - deallocate(ZN) - - case(DT_SOAP_EXPRESS) - RAISE_ERROR("descriptor_str_add_species: no recipe for "//my_descriptor_type//" yet.",error) - case default - RAISE_ERROR("descriptor_str_add_species: unknown descriptor type "//my_descriptor_type,error) - endselect - - endsubroutine descriptor_str_add_species - - recursive subroutine descriptor_str_add_species_distance_Nb(ZN,species,order) - integer, dimension(:,:), intent(inout) :: ZN - integer, dimension(:), intent(in) :: species - integer, intent(in) :: order - - integer :: i_species, n_species - integer, save :: current_descriptor, current_order = 0 - integer, dimension(:), allocatable, save :: ZN_current - - n_species = size(species) - - if( current_order == 0 ) then ! first run, outermost order. - current_descriptor = 0 ! keeps track of descriptor - current_order = 1 ! keeps track of order - allocate(ZN_current(order)) ! builds/updates atomic numbers gradually for each descriptor - endif - - do i_species = 1, n_species - if( current_order > 1 ) then ! no special atom, all atoms equivalent - if( species(i_species) < ZN_current(current_order-1) ) cycle ! avoids double-counting of neighbours - endif - - ZN_current(current_order) = species(i_species) - if( current_order < order ) then ! calls recursively until we reach the last order - current_order = current_order + 1 - call descriptor_str_add_species_distance_Nb(ZN,species,order) - else ! when we reached the last order, fill the atomic numbers in the loop - current_descriptor = current_descriptor + 1 ! and add them to the output array - ZN(:,current_descriptor) = ZN_current - endif - enddo - - current_order = current_order - 1 ! when the loop finished, step one level down - - if( current_order == 0 ) deallocate(ZN_current) ! when we reach zero, we finished. - - endsubroutine descriptor_str_add_species_distance_Nb - - subroutine descriptor_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(descriptor), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - if(cutoff(this) > at%cutoff) then - RAISE_ERROR("descriptor_calc: descriptor cutoff ("//cutoff(this)//") larger than atoms cutoff("//at%cutoff//")",error) - endif - - selectcase(this%descriptor_type) - case(DT_BISPECTRUM_SO4) - call calc(this%descriptor_bispectrum_SO4,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_BISPECTRUM_SO3) - call calc(this%descriptor_bispectrum_SO3,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error=error) - case(DT_BEHLER) - call calc(this%descriptor_behler,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error=error) - case(DT_DISTANCE_2b) - call calc(this%descriptor_distance_2b,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_COORDINATION) - call calc(this%descriptor_coordination,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_ANGLE_3B) - call calc(this%descriptor_angle_3b,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_CO_ANGLE_3B) - call calc(this%descriptor_co_angle_3b,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_CO_DISTANCE_2b) - call calc(this%descriptor_co_distance_2b,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_COSNX) - call calc(this%descriptor_cosnx,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_TRIHIS) - call calc(this%descriptor_trihis,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_WATER_MONOMER) - call calc(this%descriptor_water_monomer,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_WATER_DIMER) - call calc(this%descriptor_water_dimer,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_A2_DIMER) - call calc(this%descriptor_A2_dimer,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_AB_DIMER) - call calc(this%descriptor_AB_dimer,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_BOND_REAL_SPACE) - call calc(this%descriptor_bond_real_space,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_ATOM_REAL_SPACE) - call calc(this%descriptor_atom_real_space,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_POWER_SO3) - call calc(this%descriptor_power_so3,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_POWER_SO4) - call calc(this%descriptor_power_so4,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_SOAP) - call calc(this%descriptor_soap,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_AN_MONOMER) - call calc(this%descriptor_AN_monomer,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_GENERAL_MONOMER) - call calc(this%descriptor_general_monomer,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_GENERAL_DIMER) - call calc(this%descriptor_general_dimer,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_GENERAL_TRIMER) - call calc(this%descriptor_general_trimer,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_RDF) - call calc(this%descriptor_rdf,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_AS_DISTANCE_2b) - call calc(this%descriptor_as_distance_2b,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_MOLECULE_LO_D) - call calc(this%descriptor_molecule_lo_d,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_ALEX) - call calc(this%descriptor_alex,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_COM_DIMER) - call calc(this%descriptor_com_dimer,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_DISTANCE_Nb) - call calc(this%descriptor_distance_Nb,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case(DT_SOAP_EXPRESS) - call calc(this%descriptor_soap_express,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - case default - RAISE_ERROR("descriptor_calc: unknown descriptor type "//this%descriptor_type,error) - endselect - - endsubroutine descriptor_calc - - subroutine descriptor_calc_array(this,at,descriptor_out,covariance_cutoff,descriptor_index, & - grad_descriptor_out,grad_descriptor_index,grad_descriptor_pos,grad_covariance_cutoff,args_str,error) - - type(descriptor), intent(in) :: this - type(atoms), intent(in) :: at - real(dp), dimension(:,:), intent(out), optional :: descriptor_out - real(dp), dimension(:), intent(out), optional :: covariance_cutoff - integer, dimension(:,:), intent(out), optional :: descriptor_index - real(dp), dimension(:,:,:), intent(out), optional :: grad_descriptor_out - integer, dimension(:,:), intent(out), optional :: grad_descriptor_index - real(dp), dimension(:,:), intent(out), optional :: grad_descriptor_pos - real(dp), dimension(:,:), intent(out), optional :: grad_covariance_cutoff - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(descriptor_data) :: my_descriptor_data - integer :: i, n, i_d, n_descriptors, n_cross, n_index - logical :: do_grad_descriptor, do_descriptor - - INIT_ERROR(error) - - do_descriptor = present(descriptor_out) - do_grad_descriptor = present(grad_descriptor_out) .or. present(grad_descriptor_index) .or. present(grad_descriptor_pos) - - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - - call calc(this,at,my_descriptor_data,do_descriptor=do_descriptor,do_grad_descriptor=do_grad_descriptor,args_str=args_str,error=error) - - if(present(descriptor_out)) & - call check_size('descriptor_out',descriptor_out, (/descriptor_dimensions(this),n_descriptors/),'descriptor_calc_array',error) - - if(present(covariance_cutoff)) & - call check_size('covariance_cutoff',covariance_cutoff,(/n_descriptors/),'descriptor_calc_array',error) - - if(present(descriptor_index)) & - call check_size('descriptor_index',descriptor_index,(/n_index,n_descriptors/),'descriptor_calc_array',error) - - if(present(grad_descriptor_out)) & - call check_size('grad_descriptor_out',grad_descriptor_out,(/descriptor_dimensions(this),3,n_cross/),'descriptor_calc_array',error) - - if(present(grad_descriptor_index)) & - call check_size('grad_descriptor_index',grad_descriptor_index,(/2,n_cross/),'descriptor_calc_array',error) - - if(present(grad_descriptor_pos)) & - call check_size('grad_descriptor_pos',grad_descriptor_pos,(/3,n_cross/),'descriptor_calc_array',error) - - if(present(grad_covariance_cutoff)) & - call check_size('grad_covariance_cutoff',grad_covariance_cutoff,(/3,n_cross/),'descriptor_calc_array',error) - - if(do_descriptor) then - do i = 1, n_descriptors - descriptor_out(:,i) = my_descriptor_data%x(i)%data - if(present(covariance_cutoff)) covariance_cutoff(i) = my_descriptor_data%x(i)%covariance_cutoff - if(present(descriptor_index)) descriptor_index(:,i) = my_descriptor_data%x(i)%ci - enddo - endif - - if(do_grad_descriptor) then - i_d = 0 - do i = 1, n_descriptors - do n = lbound(my_descriptor_data%x(i)%ii,1),ubound(my_descriptor_data%x(i)%ii,1) - i_d = i_d + 1 - if(present(grad_descriptor_index)) grad_descriptor_index(:,i_d) = (/i,my_descriptor_data%x(i)%ii(n)/) - if(present(grad_descriptor_out)) grad_descriptor_out(:,:,i_d) = my_descriptor_data%x(i)%grad_data(:,:,n) - if(present(grad_descriptor_pos)) grad_descriptor_pos(:,i_d) = my_descriptor_data%x(i)%pos(:,n) - if(present(grad_covariance_cutoff)) grad_covariance_cutoff(:,i_d) = my_descriptor_data%x(i)%grad_covariance_cutoff(:,n) - enddo - enddo - endif - - call finalise(my_descriptor_data,error=error) - - endsubroutine descriptor_calc_array - - subroutine bispectrum_SO4_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(bispectrum_SO4), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - type(cplx_2d), dimension(:), allocatable :: U - type(cplx_3d), dimension(:,:), allocatable :: dU - - complex(dp) :: sub - complex(dp), dimension(3) :: dsub - real(dp), dimension(3) :: diff, u_ij - real(dp) :: r, tmp_cg - integer :: i, n, n_i, ji, jn, j, m1, m2, j1, j2, m11, m12, m21, m22, & - i_desc, i_bisp, d, n_descriptors, n_cross, l_n_neighbours, n_index - integer, dimension(3) :: shift - integer, dimension(total_elements) :: species_map - logical :: my_do_descriptor, my_do_grad_descriptor - - INIT_ERROR(error) - - call system_timer('bispectrum_SO4_calc') - - if(.not. this%initialised) then - RAISE_ERROR("bispectrum_SO4_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='bispectrum_SO4_calc args_str')) then - RAISE_ERROR("bispectrum_SO4_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("bispectrum_SO4_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - else - atom_mask_pointer => null() - endif - - endif - - species_map = 0 - do i = 1, size(this%species_Z) - if(this%species_Z(i) == 0) then - species_map = 1 - else - species_map(this%species_Z(i)) = i - endif - enddo - - call cg_initialise(this%j_max, 2) - - call finalise(descriptor_out) - - d = bispectrum_SO4_dimensions(this,error) - - if(associated(atom_mask_pointer)) then - call descriptor_sizes(this,at,n_descriptors,n_cross, & - mask=atom_mask_pointer,n_index=n_index,error=error) - else - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - endif - - allocate(descriptor_out%x(n_descriptors)) - - i_desc = 0 - do i = 1, at%N - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - if(associated(atom_mask_pointer)) then - if(.not. atom_mask_pointer(i)) cycle - endif - - i_desc = i_desc + 1 - - if(my_do_descriptor) then - allocate(descriptor_out%x(i_desc)%data(d)) - descriptor_out%x(i_desc)%data = 0.0_dp - allocate(descriptor_out%x(i_desc)%ci(n_index)) - descriptor_out%x(i_desc)%has_data = .false. - descriptor_out%x(i_desc)%covariance_cutoff = 1.0_dp - endif - - if(my_do_grad_descriptor) then - l_n_neighbours = n_neighbours(at,i,max_dist=this%cutoff) - - allocate(descriptor_out%x(i_desc)%grad_data(d,3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%ii(0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%pos(3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%has_grad_data(0:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_data = 0.0_dp - descriptor_out%x(i_desc)%ii = 0 - descriptor_out%x(i_desc)%pos = 0.0_dp - descriptor_out%x(i_desc)%has_grad_data = .false. - - allocate(descriptor_out%x(i_desc)%grad_covariance_cutoff(3,0:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_covariance_cutoff = 0.0_dp - endif - - enddo - - i_desc = 0 - do i = 1, at%N - - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - if(associated(atom_mask_pointer)) then - if(.not. atom_mask_pointer(i)) cycle - endif - i_desc = i_desc + 1 - - if(my_do_descriptor) then - descriptor_out%x(i_desc)%ci(1) = i - descriptor_out%x(i_desc)%has_data = .true. - endif - - if(my_do_grad_descriptor) then - ! dU is not allocated, allocate and zero it - allocate( dU(0:this%j_max,0:n_neighbours(at,i,max_dist=this%cutoff)) ) - do j = 0, this%j_max - allocate( dU(j,0)%mm(3,-j:j,-j:j) ) - dU(j,0)%mm = CPLX_ZERO - enddo - - descriptor_out%x(i_desc)%ii(0) = i - descriptor_out%x(i_desc)%pos(:,0) = at%pos(:,i) - descriptor_out%x(i_desc)%has_grad_data(0) = .true. - endif - - n_i = 0 - do n = 1, n_neighbours(at,i) - ji = neighbour(at, i, n, jn=jn, distance=r, diff=diff, cosines=u_ij,shift=shift) - if( r >= this%cutoff ) cycle - - n_i = n_i + 1 - - if(my_do_grad_descriptor) then - descriptor_out%x(i_desc)%ii(n_i) = ji - descriptor_out%x(i_desc)%pos(:,n_i) = at%pos(:,ji) + matmul(at%lattice,shift) - descriptor_out%x(i_desc)%has_grad_data(n_i) = .true. - endif - enddo - - if(my_do_grad_descriptor) then - call fourier_SO4_calc(this%fourier_SO4,at,i,U,dU,args_str,error=error) - else - call fourier_SO4_calc(this%fourier_SO4,at,i,U,args_str=args_str,error=error) - endif - - if(my_do_descriptor) then - - i_bisp = 0 - do j1 = 0, this%j_max - j2 = j1 - !do j2 = 0, this%j_max - do j = abs(j1-j2), min(this%j_max,j1+j2) - if( mod(j1+j2+j,2) == 1 ) cycle - - i_bisp = i_bisp + 1 - - !do m1 = -j, j, 2 - ! do m2 = -j, j, 2 - ! sub = CPLX_ZERO - ! do m11 = max(-j1-m1,-j1), min(j1-m1,j1), 2 - ! do m21 = max(-j2-m2,-j2), min(j2-m2,j2), 2 - ! sub = sub + cg_array(j1,m11,j,m1,j1,m11+m1) & - ! * cg_array(j2,m21,j,m2,j2,m21+m2) & - ! * U(j1)%mm(m11,m11+m1) * U(j2)%mm(m21,m21+m2) - ! enddo - ! enddo - ! descriptor_out%x(i_desc)%data(i_bisp) = descriptor_out%x(i_desc)%data(i_bisp) + sub*conjg(U(j)%mm(-m2,m1))*(-1)**(m2/2) - ! enddo - !enddo - - do m1 = -j, j, 2 - do m2 = -j, j, 2 - sub = CPLX_ZERO - do m11 = max(-j1,m1-j2), min(j1,m1+j2), 2 - do m12 = max(-j1,m2-j2), min(j1,m2+j2), 2 - sub = sub + cg_array(j1,m11,j2,m1-m11,j,m1) & - * cg_array(j1,m12,j2,m2-m12,j,m2) & - * U(j1)%mm(m11,m12) * U(j2)%mm(m1-m11,m2-m12) - enddo - enddo - descriptor_out%x(i_desc)%data(i_bisp) = descriptor_out%x(i_desc)%data(i_bisp) + sub*conjg(U(j)%mm(m1,m2)) - enddo - enddo - - enddo - !enddo - enddo - endif - - if(my_do_grad_descriptor) then - n_i = 0 - do n = 0, n_neighbours(at,i) - if( n>0 ) then - ji = neighbour(at, i, n, distance=r) - if( r >= this%cutoff ) cycle - n_i = n_i + 1 - endif - i_bisp = 0 - do j1 = 0, this%j_max - j2 = j1 - !do j2 = 0, this%j_max - do j = abs(j1-j2), min(this%j_max,j1+j2) - if( mod(j1+j2+j,2) == 1 ) cycle - - i_bisp = i_bisp + 1 - - !do m1 = -j, j, 2 - ! do m2 = -j, j, 2 - ! sub = CPLX_ZERO - ! dsub = CPLX_ZERO - - ! do m11 = max(-j1-m1,-j1), min(j1-m1,j1), 2 - ! do m21 = max(-j2-m2,-j2), min(j2-m2,j2), 2 - ! tmp_cg = cg_array(j1,m11,j,m1,j1,m11+m1) & - ! * cg_array(j2,m21,j,m2,j2,m21+m2) - - ! sub = sub + tmp_cg & - ! * U(j1)%mm(m11,m1+m11) * U(j2)%mm(m21,m2+m21) - ! dsub = dsub + tmp_cg & - ! * ( dU(j1,n_i)%mm(:,m11,m1+m11) * U(j2)%mm(m21,m2+m21) + & - ! U(j1)%mm(m11,m1+m11) * dU(j2,n_i)%mm(:,m21,m2+m21) ) - ! enddo - ! enddo - ! descriptor_out%x(i_desc)%grad_data(i_bisp,:,n_i) = & - ! descriptor_out%x(i_desc)%grad_data(i_bisp,:,n_i) + & - ! ( dsub*conjg(U(j)%mm(-m2,m1)) + sub*conjg(dU(j,n_i)%mm(:,-m2,m1)) )*(-1)**(m2/2) - ! enddo - !enddo - do m1 = -j, j, 2 - do m2 = -j, j, 2 - sub = CPLX_ZERO - dsub = CPLX_ZERO - do m11 = max(-j1,m1-j2), min(j1,m1+j2), 2 - do m12 = max(-j1,m2-j2), min(j1,m2+j2), 2 - - tmp_cg = cg_array(j1,m11,j2,m1-m11,j,m1) & - * cg_array(j1,m12,j2,m2-m12,j,m2) - - sub = sub + tmp_cg & - * U(j1)%mm(m11,m12) * U(j2)%mm(m1-m11,m2-m12) - dsub = dsub + tmp_cg & - * ( dU(j1,n_i)%mm(:,m11,m12) * U(j2)%mm(m1-m11,m2-m12) + & - U(j1)%mm(m11,m12) * dU(j2,n_i)%mm(:,m1-m11,m2-m12) ) - enddo - enddo - descriptor_out%x(i_desc)%grad_data(i_bisp,:,n_i) = & - descriptor_out%x(i_desc)%grad_data(i_bisp,:,n_i) + & - dsub*conjg(U(j)%mm(m1,m2)) + sub*conjg(dU(j,n_i)%mm(:,m1,m2)) - enddo - enddo - - enddo - !enddo - enddo - enddo - endif - - call finalise(dU) - enddo ! i - - ! clear U from the memory - call finalise(U) - - call system_timer('bispectrum_SO4_calc') - - endsubroutine bispectrum_SO4_calc - - subroutine bispectrum_so3_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(bispectrum_so3), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(cplx_1d), dimension(:), allocatable :: SphericalY_ij - type(cplx_1d), dimension(:,:), allocatable :: fourier_so3 - - type(cplx_2d), dimension(:), allocatable :: dSphericalY_ij - type(cplx_2d), dimension(:,:,:), allocatable :: dfourier_so3 - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor - integer :: d, i, j, n, a, l, m, l1, l2, m1, i_desc, i_pow, l_n_neighbours, & - n_i, n_descriptors, n_cross, n_index - integer, dimension(3) :: shift_ij - real(dp) :: r_ij - real(dp), dimension(3) :: u_ij, d_ij - real(dp), dimension(:), allocatable :: Rad_ij - real(dp), dimension(:,:), allocatable :: dRad_ij - - complex(dp) :: sub, dsub(3) - - integer, dimension(total_elements) :: species_map - - INIT_ERROR(error) - - call system_timer('bispectrum_so3_calc') - - if(.not. this%initialised) then - RAISE_ERROR("bispectrum_so3_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - species_map = 0 - do i = 1, size(this%species_Z) - if(this%species_Z(i) == 0) then - species_map = 1 - else - species_map(this%species_Z(i)) = i - endif - enddo - - call cg_initialise(this%l_max) - - call finalise(descriptor_out) - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='bispectrum_SO3_calc args_str')) then - RAISE_ERROR("bispectrum_SO3_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("bispectrum_SO3_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - RAISE_ERROR("bispectrum_SO3_calc cannot use atom masks yet.",error) - else - atom_mask_pointer => null() - endif - - endif - - d = bispectrum_so3_dimensions(this,error) - - if(associated(atom_mask_pointer)) then - call descriptor_sizes(this,at,n_descriptors,n_cross, & - mask=atom_mask_pointer,n_index=n_index,error=error) - else - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - endif - - - allocate(descriptor_out%x(n_descriptors)) - - i_desc = 0 - do i = 1, at%N - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - i_desc = i_desc + 1 - - if(my_do_descriptor) then - allocate(descriptor_out%x(i_desc)%data(d)) - descriptor_out%x(i_desc)%data = 0.0_dp - allocate(descriptor_out%x(i_desc)%ci(n_index)) - descriptor_out%x(i_desc)%has_data = .false. - descriptor_out%x(i_desc)%covariance_cutoff = 1.0_dp - endif - if(my_do_grad_descriptor) then - l_n_neighbours = n_neighbours(at,i,max_dist=this%cutoff) - - allocate(descriptor_out%x(i_desc)%grad_data(d,3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%ii(0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%pos(3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%has_grad_data(0:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_data = 0.0_dp - descriptor_out%x(i_desc)%ii = 0 - descriptor_out%x(i_desc)%pos = 0.0_dp - descriptor_out%x(i_desc)%has_grad_data = .false. - - allocate(descriptor_out%x(i_desc)%grad_covariance_cutoff(3,0:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_covariance_cutoff = 0.0_dp - endif - enddo - - allocate(fourier_so3(0:this%l_max,this%n_max),SphericalY_ij(0:this%l_max),Rad_ij(this%n_max)) - do a = 1, this%n_max - do l = 0, this%l_max - allocate(fourier_so3(l,a)%m(-l:l)) - fourier_so3(l,a)%m(:) = CPLX_ZERO - enddo - enddo - do l = 0, this%l_max - allocate(SphericalY_ij(l)%m(-l:l)) - enddo - - if(my_do_grad_descriptor) then - allocate( dRad_ij(3,this%n_max), dSphericalY_ij(0:this%l_max) ) - do l = 0, this%l_max - allocate(dSphericalY_ij(l)%mm(3,-l:l)) - enddo - endif - - i_desc = 0 - do i = 1, at%N - - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - i_desc = i_desc + 1 - - do a = 1, this%n_max - do l = 0, this%l_max - fourier_so3(l,a)%m(:) = CPLX_ZERO - enddo - enddo - - if(my_do_descriptor) then - descriptor_out%x(i_desc)%ci(1) = i - descriptor_out%x(i_desc)%has_data = .true. - endif - - if(my_do_grad_descriptor) then - allocate( dfourier_so3(0:this%l_max,this%n_max,0:n_neighbours(at,i,max_dist=this%cutoff)) ) - do n = 0, n_neighbours(at,i,max_dist=this%cutoff) - do a = 1, this%n_max - do l = 0, this%l_max - allocate(dfourier_so3(l,a,n)%mm(3,-l:l)) - dfourier_so3(l,a,n)%mm(:,:) = CPLX_ZERO - enddo - enddo - enddo - descriptor_out%x(i_desc)%ii(0) = i - descriptor_out%x(i_desc)%pos(:,0) = at%pos(:,i) - descriptor_out%x(i_desc)%has_grad_data(0) = .true. - endif - - n_i = 0 - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij, cosines=u_ij, diff=d_ij, shift=shift_ij) - if( r_ij >= this%cutoff ) cycle - - n_i = n_i + 1 - if(my_do_grad_descriptor) then - descriptor_out%x(i_desc)%ii(n_i) = j - descriptor_out%x(i_desc)%pos(:,n_i) = at%pos(:,j) + matmul(at%lattice,shift_ij) - descriptor_out%x(i_desc)%has_grad_data(n_i) = .true. - endif - - do a = 1, this%n_max - Rad_ij(a) = RadialFunction(this%Radial, r_ij, a) - if(my_do_grad_descriptor) dRad_ij(:,a) = GradRadialFunction(this%Radial, r_ij, a) * u_ij - enddo - - do l = 0, this%l_max - do m = -l, l - SphericalY_ij(l)%m(m) = SphericalYCartesian(l,m,d_ij) - if(my_do_grad_descriptor) dSphericalY_ij(l)%mm(:,m) = GradSphericalYCartesian(l,m,d_ij) - enddo - enddo - - do a = 1, this%n_max - do l = 0, this%l_max - do m = -l, l - fourier_so3(l,a)%m(m) = fourier_so3(l,a)%m(m) + Rad_ij(a)*SphericalY_ij(l)%m(m) - if(my_do_grad_descriptor) then - dfourier_so3(l,a,n_i)%mm(:,m) = dfourier_so3(l,a,n_i)%mm(:,m) + & - dRad_ij(:,a) * SphericalY_ij(l)%m(m) + Rad_ij(a)*dSphericalY_ij(l)%mm(:,m) - endif - enddo - enddo - enddo - - enddo ! n - - if(my_do_descriptor) then - i_pow = 0 - do a = 1, this%n_max - do l1 = 0, this%l_max - l2 = l1 - !do l2 = 0, this%l_max - do l = abs(l1-l2), min(this%l_max,l1+l2) - if( mod(l1,2)==1 .and. mod(l2,2)==1 .and. mod(l,2)==1 ) cycle - i_pow = i_pow + 1 - - do m = -l, l - sub = CPLX_ZERO - do m1 = max(-l1,m-l2),min(l1,m+l2) - sub = sub + cg_array(l1,m1,l2,m-m1,l,m) * conjg(fourier_so3(l1,a)%m(m1)) * conjg(fourier_so3(l2,a)%m(m-m1)) - enddo - - descriptor_out%x(i_desc)%data(i_pow) = descriptor_out%x(i_desc)%data(i_pow) + fourier_so3(l,a)%m(m) * sub - enddo - - enddo - !enddo - enddo - enddo - endif - - if(my_do_grad_descriptor) then - do n = 1, n_neighbours(at,i,max_dist=this%cutoff) - i_pow = 0 - do a = 1, this%n_max - do l1 = 0, this%l_max - l2 = l1 - !do l2 = 0, this%l_max - do l = abs(l1-l2), min(this%l_max,l1+l2) - if( mod(l1,2)==1 .and. mod(l2,2)==1 .and. mod(l,2)==1 ) cycle - i_pow = i_pow + 1 - - do m = -l, l - sub = CPLX_ZERO - dsub = CPLX_ZERO - do m1 = max(-l1,m-l2),min(l1,m+l2) - dsub = dsub + cg_array(l1,m1,l2,m-m1,l,m) * & - ( conjg(dfourier_so3(l1,a,n)%mm(:,m1)) * conjg(fourier_so3(l2,a)%m(m-m1)) + & - conjg(fourier_so3(l1,a)%m(m1)) * conjg(dfourier_so3(l2,a,n)%mm(:,m-m1)) ) - sub = sub + cg_array(l1,m1,l2,m-m1,l,m) * conjg(fourier_so3(l1,a)%m(m1)) * conjg(fourier_so3(l2,a)%m(m-m1)) - enddo - - descriptor_out%x(i_desc)%grad_data(i_pow,:,n) = descriptor_out%x(i_desc)%grad_data(i_pow,:,n) + & - fourier_so3(l,a)%m(m) * dsub + dfourier_so3(l,a,n)%mm(:,m) * sub - enddo - enddo - !enddo - enddo - enddo - descriptor_out%x(i_desc)%grad_data(:,:,0) = descriptor_out%x(i_desc)%grad_data(:,:,0) - descriptor_out%x(i_desc)%grad_data(:,:,n) - enddo - endif - - if(allocated(dfourier_so3)) then - do n = lbound(dfourier_so3,3), ubound(dfourier_so3,3) - do a = lbound(dfourier_so3,2), ubound(dfourier_so3,2) - do l = lbound(dfourier_so3,1), ubound(dfourier_so3,1) - deallocate(dfourier_so3(l,a,n)%mm) - enddo - enddo - enddo - deallocate(dfourier_so3) - endif - - enddo ! i - - if(allocated(Rad_ij)) deallocate(Rad_ij) - if(allocated(dRad_ij)) deallocate(dRad_ij) - - if(allocated(fourier_so3)) then - do a = lbound(fourier_so3,2), ubound(fourier_so3,2) - do l = lbound(fourier_so3,1), ubound(fourier_so3,1) - deallocate(fourier_so3(l,a)%m) - enddo - enddo - deallocate(fourier_so3) - endif - - if(allocated(SphericalY_ij)) then - do l = lbound(SphericalY_ij,1), ubound(SphericalY_ij,1) - deallocate(SphericalY_ij(l)%m) - enddo - deallocate(SphericalY_ij) - endif - - if(allocated(dSphericalY_ij)) then - do l = lbound(dSphericalY_ij,1), ubound(dSphericalY_ij,1) - deallocate(dSphericalY_ij(l)%mm) - enddo - deallocate(dSphericalY_ij) - endif - - call system_timer('bispectrum_so3_calc') - - endsubroutine bispectrum_so3_calc - - subroutine behler_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(behler), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor - integer :: d, i, j, k, n, m, a, b, i_desc, l_n_neighbours, & - n_i, m_i, n_descriptors, n_cross, n_index - integer, dimension(3) :: shift_ij - real(dp) :: r_ij, r_ik, r_jk, cos_ijk, Ang, dAng, Rad, dRad_ij, dRad_ik, dRad_jk, f_cut_ij, f_cut_ik, f_cut_jk, df_cut_ij, df_cut_ik, df_cut_jk, g2, dg2 - real(dp), dimension(3) :: u_ij, u_ik, u_jk, d_ij, d_ik, d_jk, dcosijk_ij, dcosijk_ik - - INIT_ERROR(error) - - call system_timer('behler_calc') - - if(.not. this%initialised) then - RAISE_ERROR("behler_calc: descriptor object not initialised", error) - endif - - if( at%cutoff < this%cutoff ) then - RAISE_ERROR("behler_calc: cutoff of atoms object ("//at%cutoff//") less than cutoff of descriptor ("//this%cutoff//")", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='behler_calc args_str')) then - RAISE_ERROR("behler_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("behler_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - else - atom_mask_pointer => null() - endif - - endif - - call finalise(descriptor_out) - - d = behler_dimensions(this,error) - - if(associated(atom_mask_pointer)) then - call descriptor_sizes(this,at,n_descriptors,n_cross, & - mask=atom_mask_pointer,n_index=n_index,error=error) - else - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - endif - - allocate(descriptor_out%x(n_descriptors)) - - i_desc = 0 - do i = 1, at%N - if(associated(atom_mask_pointer)) then - if(.not. atom_mask_pointer(i)) cycle - endif - i_desc = i_desc + 1 - - if(my_do_descriptor) then - allocate(descriptor_out%x(i_desc)%data(d)) - descriptor_out%x(i_desc)%data = 0.0_dp - allocate(descriptor_out%x(i_desc)%ci(n_index)) - descriptor_out%x(i_desc)%has_data = .false. - descriptor_out%x(i_desc)%covariance_cutoff = 1.0_dp - endif - if(my_do_grad_descriptor) then - l_n_neighbours = n_neighbours(at,i,max_dist=this%cutoff) - - allocate(descriptor_out%x(i_desc)%grad_data(d,3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%ii(0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%pos(3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%has_grad_data(0:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_data = 0.0_dp - descriptor_out%x(i_desc)%ii = 0 - descriptor_out%x(i_desc)%pos = 0.0_dp - descriptor_out%x(i_desc)%has_grad_data = .false. - - allocate(descriptor_out%x(i_desc)%grad_covariance_cutoff(3,0:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_covariance_cutoff = 0.0_dp - endif - enddo - - i_desc = 0 - do i = 1, at%N - if(associated(atom_mask_pointer)) then - if(.not. atom_mask_pointer(i)) cycle - endif - i_desc = i_desc + 1 - - if(my_do_descriptor) then - descriptor_out%x(i_desc)%ci(1) = i - descriptor_out%x(i_desc)%has_data = .true. - endif - if(my_do_grad_descriptor) then - descriptor_out%x(i_desc)%ii(0) = i - descriptor_out%x(i_desc)%pos(:,0) = at%pos(:,i) - descriptor_out%x(i_desc)%has_grad_data(0) = .true. - endif - - n_i = 0 - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij, cosines=u_ij, diff=d_ij, shift=shift_ij) - if( r_ij >= this%cutoff ) cycle - - n_i = n_i + 1 - - if(my_do_grad_descriptor) then - descriptor_out%x(i_desc)%ii(n_i) = j - descriptor_out%x(i_desc)%pos(:,n_i) = at%pos(:,j) + matmul(at%lattice,shift_ij) - descriptor_out%x(i_desc)%has_grad_data(n_i) = .true. - endif - - f_cut_ij = cos_cutoff_function(r_ij,this%cutoff) - if(my_do_grad_descriptor) df_cut_ij = dcos_cutoff_function(r_ij,this%cutoff) - - do a = 1, this%n_g2 - g2 = exp(-this%g2(a)%eta * (r_ij-this%g2(a)%rs)**2) - if(my_do_descriptor) descriptor_out%x(i_desc)%data(a) = descriptor_out%x(i_desc)%data(a) + g2 * f_cut_ij - if(my_do_grad_descriptor) then - dg2 = -2.0_dp * this%g2(a)%eta * (r_ij-this%g2(a)%rs) * g2 - descriptor_out%x(i_desc)%grad_data(a,:,n_i) = ( dg2 * f_cut_ij + g2 * df_cut_ij ) * u_ij - descriptor_out%x(i_desc)%grad_data(a,:,0) = descriptor_out%x(i_desc)%grad_data(a,:,0) - descriptor_out%x(i_desc)%grad_data(a,:,n_i) - endif - enddo - - - m_i = 0 - do m = 1, n_neighbours(at,i) - k = neighbour(at, i, m, distance = r_ik, cosines=u_ik, diff=d_ik) - if( r_ik >= this%cutoff ) cycle - - m_i = m_i + 1 - - d_jk = d_ik - d_ij - r_jk = norm(d_jk) - if( r_jk .feq. 0.0_dp ) cycle - - u_jk = d_jk / r_jk - - f_cut_ik = cos_cutoff_function(r_ik,this%cutoff) - f_cut_jk = cos_cutoff_function(r_jk,this%cutoff) - - cos_ijk = dot_product(u_ij,u_ik) - - if(my_do_grad_descriptor) then - df_cut_ik = dcos_cutoff_function(r_ik,this%cutoff) - df_cut_jk = dcos_cutoff_function(r_jk,this%cutoff) - - dcosijk_ij = ( u_ik - cos_ijk * u_ij ) / r_ij - dcosijk_ik = ( u_ij - cos_ijk * u_ik ) / r_ik - endif - - do b = 1, this%n_g3 - a = b + this%n_g2 - - Ang = (1.0_dp + this%g3(b)%lambda * cos_ijk)**this%g3(b)%zeta - Rad = exp( -this%g3(b)%eta * (r_ij**2 + r_ik**2 + r_jk**2) ) - - if(my_do_descriptor) descriptor_out%x(i_desc)%data(a) = descriptor_out%x(i_desc)%data(a) + 0.5_dp * Ang * Rad * f_cut_ij * f_cut_ik * f_cut_jk - if(my_do_grad_descriptor) then - dAng = this%g3(b)%zeta * (1.0_dp + this%g3(b)%lambda * cos_ijk)**(this%g3(b)%zeta -1.0_dp) * this%g3(b)%lambda - dRad_ij = -this%g3(b)%eta * 2.0_dp * r_ij * Rad - dRad_ik = -this%g3(b)%eta * 2.0_dp * r_ik * Rad - dRad_jk = -this%g3(b)%eta * 2.0_dp * r_jk * Rad - - descriptor_out%x(i_desc)%grad_data(a,:,n_i) = descriptor_out%x(i_desc)%grad_data(a,:,n_i) + 0.5_dp * & - ( ( dAng * dcosijk_ij * Rad + Ang * ( dRad_ij * u_ij - dRad_jk * u_jk ) ) * f_cut_ij * f_cut_ik * f_cut_jk + & - Ang * Rad * f_cut_ik * ( df_cut_ij * u_ij * f_cut_jk - f_cut_ij * df_cut_jk * u_jk ) ) - - descriptor_out%x(i_desc)%grad_data(a,:,m_i) = descriptor_out%x(i_desc)%grad_data(a,:,m_i) + 0.5_dp * & - ( ( dAng * dcosijk_ik * Rad + Ang * ( dRad_ik * u_ik + dRad_jk * u_jk ) ) * f_cut_ij * f_cut_ik * f_cut_jk + & - Ang * Rad * f_cut_ij * ( df_cut_ik * u_ik * f_cut_jk + f_cut_ik * df_cut_jk * u_jk ) ) - - descriptor_out%x(i_desc)%grad_data(a,:,0) = descriptor_out%x(i_desc)%grad_data(a,:,0) - 0.5_dp * & - ( ( dAng * (dcosijk_ij+dcosijk_ik) * Rad + Ang * (dRad_ij * u_ij + dRad_ik * u_ik) ) * f_cut_ij * f_cut_ik * f_cut_jk + & - Ang * Rad * f_cut_jk * ( df_cut_ij * u_ij * f_cut_ik + f_cut_ij * df_cut_ik * u_ik ) ) - endif - - - enddo - - enddo - enddo - - do b = 1, this%n_g3 - a = b + this%n_g2 - - if(my_do_descriptor) descriptor_out%x(i_desc)%data(a) = descriptor_out%x(i_desc)%data(a) * 2.0_dp**(1.0_dp-this%g3(b)%zeta) - if(my_do_grad_descriptor) descriptor_out%x(i_desc)%grad_data(a,:,:) = descriptor_out%x(i_desc)%grad_data(a,:,:) * 2.0_dp**(1.0_dp-this%g3(b)%zeta) - enddo - enddo - - call system_timer('behler_calc') - - endsubroutine behler_calc - - subroutine distance_2b_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(distance_2b), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical :: needs_resid - logical, dimension(:), pointer :: atom_mask_pointer - integer, dimension(:), pointer :: resid_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor, Zi1, Zi2, Zj1, Zj2 - integer :: d, n_descriptors, n_cross, i_desc, i, j, n, n_index - integer, dimension(3) :: shift - real(dp) :: r_ij, covariance_cutoff, dcovariance_cutoff, tail, dtail - real(dp), dimension(3) :: u_ij - - INIT_ERROR(error) - - call system_timer('distance_2b_calc') - - if(.not. this%initialised) then - RAISE_ERROR("distance_2b_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - call finalise(descriptor_out) - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='distance_2b_calc args_str')) then - RAISE_ERROR("distance_2b_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("distance_2b_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - else - atom_mask_pointer => null() - endif - - endif - - needs_resid = this%only_intra .or. this%only_inter - if (needs_resid) then - if (.not. assign_pointer(at, trim(this%resid_name), resid_pointer)) then - RAISE_ERROR("distance_2b_calc did not find "//trim(this%resid_name)//" property (residue id) in the atoms object.", error) - end if - else - resid_pointer => null() - end if - - d = distance_2b_dimensions(this,error) - - if(associated(atom_mask_pointer)) then - call descriptor_sizes(this,at,n_descriptors,n_cross, & - mask=atom_mask_pointer,n_index=n_index,error=error) - else - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - endif - - allocate(descriptor_out%x(n_descriptors)) - do i = 1, n_descriptors - if(my_do_descriptor) then - allocate(descriptor_out%x(i)%data(d)) - descriptor_out%x(i)%data = 0.0_dp - allocate(descriptor_out%x(i)%ci(n_index)) - descriptor_out%x(i)%ci = 0 - descriptor_out%x(i)%has_data = .false. - descriptor_out%x(i)%covariance_cutoff = 1.0_dp - endif - if(my_do_grad_descriptor) then - allocate(descriptor_out%x(i)%grad_data(d,3,0:1)) - allocate(descriptor_out%x(i)%ii(0:1)) - allocate(descriptor_out%x(i)%pos(3,0:1)) - allocate(descriptor_out%x(i)%has_grad_data(0:1)) - descriptor_out%x(i)%grad_data = 0.0_dp - descriptor_out%x(i)%ii = 0 - descriptor_out%x(i)%pos = 0.0_dp - descriptor_out%x(i)%has_grad_data = .false. - - allocate(descriptor_out%x(i)%grad_covariance_cutoff(3,0:1)) - descriptor_out%x(i)%grad_covariance_cutoff = 0.0_dp - endif - enddo - - i_desc = 0 - do i = 1, at%N - if(associated(atom_mask_pointer)) then - if(.not. atom_mask_pointer(i)) cycle - endif - Zi1 = (this%Z1 == 0) .or. (at%Z(i) == this%Z1) - Zi2 = (this%Z2 == 0) .or. (at%Z(i) == this%Z2) - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij, cosines = u_ij, shift=shift) - if( r_ij >= this%cutoff ) cycle - - Zj1 = (this%Z1 == 0) .or. (at%Z(j) == this%Z1) - Zj2 = (this%Z2 == 0) .or. (at%Z(j) == this%Z2) - if( .not. ( ( Zi1 .and. Zj2 ) .or. ( Zi2 .and. Zj1 ) ) ) cycle ! this pair doesn't belong to the descriptor type - - if (needs_resid) then - if (this%only_intra .and. resid_pointer(i) /= resid_pointer(j)) cycle - if (this%only_inter .and. resid_pointer(i) == resid_pointer(j)) cycle - end if - - i_desc = i_desc + 1 - - covariance_cutoff = coordination_function(r_ij,this%cutoff,this%cutoff_transition_width) - if( this%has_tail .and. this%tail_exponent /= 0 ) then - tail = ( erf(this%tail_range*r_ij) / r_ij )**this%tail_exponent - else - tail = 1.0_dp - endif - - if(my_do_descriptor) then - descriptor_out%x(i_desc)%data(:) = r_ij**this%exponents - descriptor_out%x(i_desc)%ci(1:2) = (/i,j/) - descriptor_out%x(i_desc)%has_data = .true. - - descriptor_out%x(i_desc)%covariance_cutoff = covariance_cutoff * tail - endif - if(my_do_grad_descriptor) then - dcovariance_cutoff = dcoordination_function(r_ij,this%cutoff,this%cutoff_transition_width) - if( this%has_tail .and. this%tail_exponent /= 0 ) then - dtail = tail * this%tail_exponent * ( 2.0_dp*this%tail_range*exp(-this%tail_range**2*r_ij**2) / & - sqrt(pi) / erf(this%tail_range*r_ij) - 1.0_dp / r_ij ) - else - dtail = 0.0_dp - endif - - descriptor_out%x(i_desc)%ii(0) = i - descriptor_out%x(i_desc)%pos(:,0) = at%pos(:,i) - descriptor_out%x(i_desc)%has_grad_data(0) = .true. - descriptor_out%x(i_desc)%grad_data(:,:,0) = -( this%exponents*r_ij**(this%exponents-1) ) .outer. u_ij - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,0) = -(dcovariance_cutoff*tail + covariance_cutoff*dtail)*u_ij - - descriptor_out%x(i_desc)%ii(1) = j - descriptor_out%x(i_desc)%pos(:,1) = at%pos(:,j) + matmul(at%lattice,shift) - descriptor_out%x(i_desc)%has_grad_data(1) = .true. - descriptor_out%x(i_desc)%grad_data(:,:,1) = - descriptor_out%x(i_desc)%grad_data(:,:,0) - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,1) = -descriptor_out%x(i_desc)%grad_covariance_cutoff(:,0) - - endif - enddo - enddo - - call system_timer('distance_2b_calc') - - endsubroutine distance_2b_calc - - subroutine coordination_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(coordination), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor - integer :: d, i, j, n, i_n, l_n_neighbours, i_desc, n_descriptors, n_cross, n_index - integer, dimension(3) :: shift - real(dp) :: r_ij - real(dp), dimension(3) :: u_ij, df_cut - - INIT_ERROR(error) - - call system_timer('coordination_calc') - - if(.not. this%initialised) then - RAISE_ERROR("coordination_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='coordination_calc args_str')) then - RAISE_ERROR("coordination_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("coordination_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - else - atom_mask_pointer => null() - endif - - endif - - call finalise(descriptor_out) - - d = coordination_dimensions(this,error) - - if(associated(atom_mask_pointer)) then - call descriptor_sizes(this,at,n_descriptors,n_cross, & - mask=atom_mask_pointer,n_index=n_index,error=error) - else - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - endif - - allocate(descriptor_out%x(n_descriptors)) - i_desc = 0 - do i = 1, at%N - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - if(associated(atom_mask_pointer)) then - if(.not. atom_mask_pointer(i)) cycle - endif - - i_desc = i_desc + 1 - if(my_do_descriptor) then - allocate(descriptor_out%x(i_desc)%data(d)) - descriptor_out%x(i_desc)%data = 0.0_dp - allocate(descriptor_out%x(i_desc)%ci(n_index)) - descriptor_out%x(i_desc)%has_data = .false. - - descriptor_out%x(i_desc)%covariance_cutoff = 1.0_dp - endif - if(my_do_grad_descriptor) then - l_n_neighbours = n_neighbours(at,i,max_dist=this%cutoff) - - allocate(descriptor_out%x(i_desc)%grad_data(d,3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%ii(0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%pos(3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%has_grad_data(0:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_data = 0.0_dp - descriptor_out%x(i_desc)%ii = 0 - descriptor_out%x(i_desc)%pos = 0.0_dp - descriptor_out%x(i_desc)%has_grad_data = .false. - - allocate(descriptor_out%x(i_desc)%grad_covariance_cutoff(3,0:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_covariance_cutoff = 0.0_dp - endif - enddo - - i_desc = 0 - do i = 1, at%N - - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - if(associated(atom_mask_pointer)) then - if(.not. atom_mask_pointer(i)) cycle - endif - i_desc = i_desc + 1 - - if(my_do_descriptor) then - descriptor_out%x(i_desc)%ci(1) = i - descriptor_out%x(i_desc)%has_data = .true. - endif - if(my_do_grad_descriptor) then - descriptor_out%x(i_desc)%ii(0) = i - descriptor_out%x(i_desc)%pos(:,0) = at%pos(:,i) - descriptor_out%x(i_desc)%has_grad_data(0) = .true. - endif - - i_n = 0 - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij, cosines = u_ij, shift=shift) - - if( r_ij >= this%cutoff ) cycle - i_n = i_n + 1 - - if(my_do_descriptor) & - descriptor_out%x(i_desc)%data(1) = descriptor_out%x(i_desc)%data(1) + coordination_function(r_ij,this%cutoff,this%transition_width) - - if(my_do_grad_descriptor) then - df_cut = dcoordination_function(r_ij,this%cutoff,this%transition_width) * u_ij - - descriptor_out%x(i_desc)%grad_data(1,:,0) = descriptor_out%x(i_desc)%grad_data(1,:,0) - df_cut - - descriptor_out%x(i_desc)%ii(i_n) = j - descriptor_out%x(i_desc)%pos(:,i_n) = at%pos(:,j) + matmul(at%lattice,shift) - descriptor_out%x(i_desc)%has_grad_data(i_n) = .true. - descriptor_out%x(i_desc)%grad_data(1,:,i_n) = df_cut - endif - enddo - enddo - - call system_timer('coordination_calc') - - endsubroutine coordination_calc - - subroutine angle_3b_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(angle_3b), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor, Zk1, Zk2, Zj1, Zj2 - integer :: d, n_descriptors, n_cross, i_desc, i, j, k, n, m, n_index - integer, dimension(3) :: shift_ij, shift_ik - real(dp) :: r_ij, r_ik, r_jk, cos_ijk, fc_j, fc_k, dfc_j, dfc_k - real(dp), dimension(3) :: u_ij, u_ik, u_jk, d_ij, d_ik, d_jk, dcosijk_ij, dcosijk_ik - - INIT_ERROR(error) - - call system_timer('angle_3b_calc') - - if(.not. this%initialised) then - RAISE_ERROR("angle_3b_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - call finalise(descriptor_out) - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='angle_3b_calc args_str')) then - RAISE_ERROR("angle_3b_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("angle_3b_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - else - atom_mask_pointer => null() - endif - - endif - - d = angle_3b_dimensions(this,error) - - if(associated(atom_mask_pointer)) then - call descriptor_sizes(this,at,n_descriptors,n_cross, & - mask=atom_mask_pointer,n_index=n_index,error=error) - else - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - endif - - allocate(descriptor_out%x(n_descriptors)) - do i = 1, n_descriptors - if(my_do_descriptor) then - allocate(descriptor_out%x(i)%data(d)) - descriptor_out%x(i)%data = 0.0_dp - allocate(descriptor_out%x(i)%ci(n_index)) - descriptor_out%x(i)%has_data = .false. - endif - - if(my_do_grad_descriptor) then - allocate(descriptor_out%x(i)%grad_data(d,3,0:2)) - allocate(descriptor_out%x(i)%ii(0:2)) - allocate(descriptor_out%x(i)%pos(3,0:2)) - allocate(descriptor_out%x(i)%has_grad_data(0:2)) - descriptor_out%x(i)%grad_data = 0.0_dp - descriptor_out%x(i)%ii = 0 - descriptor_out%x(i)%pos = 0.0_dp - descriptor_out%x(i)%has_grad_data = .false. - - allocate(descriptor_out%x(i)%grad_covariance_cutoff(3,0:2)) - descriptor_out%x(i)%grad_covariance_cutoff = 0.0_dp - endif - enddo - - i_desc = 0 - do i = 1, at%N - if(associated(atom_mask_pointer)) then - if(.not. atom_mask_pointer(i)) cycle - endif - if( (this%Z /=0) .and. (at%Z(i) /= this%Z) ) cycle - - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij, cosines = u_ij, diff = d_ij, shift=shift_ij) - - if( r_ij >= this%cutoff ) cycle - - Zj1 = (this%Z1 == 0) .or. (at%Z(j) == this%Z1) - Zj2 = (this%Z2 == 0) .or. (at%Z(j) == this%Z2) - - fc_j = coordination_function(r_ij,this%cutoff,this%cutoff_transition_width) - dfc_j = dcoordination_function(r_ij,this%cutoff,this%cutoff_transition_width) - - do m = 1, n_neighbours(at,i) - - if( n == m ) cycle - - k = neighbour(at, i, m, distance = r_ik, cosines = u_ik, diff = d_ik, shift=shift_ik) - if( r_ik >= this%cutoff ) cycle - - Zk1 = (this%Z1 == 0) .or. (at%Z(k) == this%Z1) - Zk2 = (this%Z2 == 0) .or. (at%Z(k) == this%Z2) - - if( .not. ( ( Zk1 .and. Zj2 ) .or. ( Zk2 .and. Zj1 ) ) ) cycle ! this pair doesn't belong to the descriptor type - - d_jk = d_ij - d_ik - r_jk = norm(d_jk) - u_jk = d_jk / r_jk - - fc_k = coordination_function(r_ik,this%cutoff,this%cutoff_transition_width) - dfc_k = dcoordination_function(r_ik,this%cutoff,this%cutoff_transition_width) - - cos_ijk = dot_product(d_ij,d_ik)/(r_ij*r_ik) - - i_desc = i_desc + 1 - - if(my_do_descriptor) then - descriptor_out%x(i_desc)%data(1) = r_ij + r_ik - descriptor_out%x(i_desc)%data(2) = (r_ij - r_ik)**2 - descriptor_out%x(i_desc)%data(3) = r_jk !cos_ijk - descriptor_out%x(i_desc)%ci(1) = i - descriptor_out%x(i_desc)%has_data = .true. - - descriptor_out%x(i_desc)%covariance_cutoff = fc_j*fc_k - endif - - if(my_do_grad_descriptor) then - dcosijk_ij = ( u_ik - cos_ijk * u_ij ) / r_ij - dcosijk_ik = ( u_ij - cos_ijk * u_ik ) / r_ik - - descriptor_out%x(i_desc)%ii(0) = i - descriptor_out%x(i_desc)%pos(:,0) = at%pos(:,i) - descriptor_out%x(i_desc)%has_grad_data(0) = .true. - descriptor_out%x(i_desc)%grad_data(1,:,0) = - u_ij - u_ik - descriptor_out%x(i_desc)%grad_data(2,:,0) = 2.0_dp * (r_ij - r_ik)*(-u_ij + u_ik) - descriptor_out%x(i_desc)%grad_data(3,:,0) = 0.0_dp !-dcosijk_ij - dcosijk_ik - - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,0) = - dfc_j*fc_k*u_ij - dfc_k*fc_j*u_ik - - descriptor_out%x(i_desc)%ii(1) = j - descriptor_out%x(i_desc)%pos(:,1) = at%pos(:,j) + matmul(at%lattice,shift_ij) - descriptor_out%x(i_desc)%has_grad_data(1) = .true. - descriptor_out%x(i_desc)%grad_data(1,:,1) = u_ij - descriptor_out%x(i_desc)%grad_data(2,:,1) = 2.0_dp * (r_ij - r_ik)*u_ij - descriptor_out%x(i_desc)%grad_data(3,:,1) = u_jk !dcosijk_ij - - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,1) = dfc_j*fc_k*u_ij - - descriptor_out%x(i_desc)%ii(2) = k - descriptor_out%x(i_desc)%pos(:,2) = at%pos(:,k) + matmul(at%lattice,shift_ik) - descriptor_out%x(i_desc)%has_grad_data(2) = .true. - descriptor_out%x(i_desc)%grad_data(1,:,2) = u_ik - descriptor_out%x(i_desc)%grad_data(2,:,2) = 2.0_dp * (r_ij - r_ik)*(-u_ik) - descriptor_out%x(i_desc)%grad_data(3,:,2) = -u_jk !dcosijk_ik - - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,2) = dfc_k*fc_j*u_ik - endif - enddo - enddo - enddo - - call system_timer('angle_3b_calc') - - endsubroutine angle_3b_calc - - subroutine co_angle_3b_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(co_angle_3b), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(descriptor) :: my_coordination - type(descriptor_data) :: descriptor_coordination - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor, Zk1, Zk2, Zj1, Zj2 - integer :: d, n_descriptors, n_cross, i_desc, i, j, k, n, m, & - l_n_neighbours_coordination, n_index - integer, dimension(3) :: shift_ij, shift_ik - real(dp) :: r_ij, r_ik, r_jk, cos_ijk, fc_j, fc_k, dfc_j, dfc_k - real(dp), dimension(3) :: u_ij, u_ik, u_jk, d_ij, d_ik, d_jk, dcosijk_ij, dcosijk_ik - - INIT_ERROR(error) - - call system_timer('co_angle_3b_calc') - - if(.not. this%initialised) then - RAISE_ERROR("co_angle_3b_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - call finalise(descriptor_out) - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='co_angle_3b_calc args_str')) then - RAISE_ERROR("co_angle_3b_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("co_angle_3b_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - RAISE_ERROR("co_angle_3b_calc cannot use atom masks yet.",error) - else - atom_mask_pointer => null() - endif - - endif - - d = co_angle_3b_dimensions(this,error) - - if(associated(atom_mask_pointer)) then - call descriptor_sizes(this,at,n_descriptors,n_cross, & - mask=atom_mask_pointer,n_index=n_index,error=error) - else - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - endif - - allocate(descriptor_out%x(n_descriptors)) - i_desc = 0 - do i = 1, at%N - if( (this%Z /=0) .and. (at%Z(i) /= this%Z) ) cycle - l_n_neighbours_coordination = n_neighbours(at,i,max_dist=this%coordination_cutoff) - - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij) - if( r_ij >= this%cutoff ) cycle - - Zj1 = (this%Z1 == 0) .or. (at%Z(j) == this%Z1) - Zj2 = (this%Z2 == 0) .or. (at%Z(j) == this%Z2) - - do m = 1, n_neighbours(at,i) - - if( n == m ) cycle - - k = neighbour(at, i, m, distance = r_ik) - if( r_ik >= this%cutoff ) cycle - - Zk1 = (this%Z1 == 0) .or. (at%Z(k) == this%Z1) - Zk2 = (this%Z2 == 0) .or. (at%Z(k) == this%Z2) - - if( .not. ( ( Zk1 .and. Zj2 ) .or. ( Zk2 .and. Zj1 ) ) ) cycle ! this pair doesn't belong to the descriptor type - - i_desc = i_desc + 1 - if(my_do_descriptor) then - allocate(descriptor_out%x(i_desc)%data(d)) - descriptor_out%x(i_desc)%data = 0.0_dp - allocate(descriptor_out%x(i_desc)%ci(n_index)) - descriptor_out%x(i_desc)%has_data = .false. - endif - - if(my_do_grad_descriptor) then - - allocate(descriptor_out%x(i_desc)%grad_data(d,3,0:2+l_n_neighbours_coordination)) - allocate(descriptor_out%x(i_desc)%ii(0:2+l_n_neighbours_coordination)) - allocate(descriptor_out%x(i_desc)%pos(3,0:2+l_n_neighbours_coordination)) - allocate(descriptor_out%x(i_desc)%has_grad_data(0:2+l_n_neighbours_coordination)) - descriptor_out%x(i_desc)%grad_data = 0.0_dp - descriptor_out%x(i_desc)%ii = 0 - descriptor_out%x(i_desc)%pos = 0.0_dp - descriptor_out%x(i_desc)%has_grad_data = .false. - - allocate(descriptor_out%x(i_desc)%grad_covariance_cutoff(3,0:2+l_n_neighbours_coordination)) - descriptor_out%x(i_desc)%grad_covariance_cutoff = 0.0_dp - endif - enddo - enddo - enddo - - call initialise(my_coordination,'coordination cutoff='//this%coordination_cutoff//' coordination_transition_width='//this%coordination_transition_width,error) - call calc(my_coordination,at,descriptor_coordination,do_descriptor,do_grad_descriptor,args_str,error) - - i_desc = 0 - do i = 1, at%N - if( (this%Z /=0) .and. (at%Z(i) /= this%Z) ) cycle - - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij, cosines = u_ij, diff = d_ij, shift=shift_ij) - - if( r_ij >= this%cutoff ) cycle - - Zj1 = (this%Z1 == 0) .or. (at%Z(j) == this%Z1) - Zj2 = (this%Z2 == 0) .or. (at%Z(j) == this%Z2) - - fc_j = coordination_function(r_ij,this%cutoff,0.5_dp) - dfc_j = dcoordination_function(r_ij,this%cutoff,0.5_dp) - - do m = 1, n_neighbours(at,i) - if( n == m ) cycle - - k = neighbour(at, i, m, distance = r_ik, cosines = u_ik, diff = d_ik, shift=shift_ik) - if( r_ik >= this%cutoff ) cycle - - Zk1 = (this%Z1 == 0) .or. (at%Z(k) == this%Z1) - Zk2 = (this%Z2 == 0) .or. (at%Z(k) == this%Z2) - - if( .not. ( ( Zk1 .and. Zj2 ) .or. ( Zk2 .and. Zj1 ) ) ) cycle ! this pair doesn't belong to the descriptor type - - d_jk = d_ij - d_ik - r_jk = norm(d_jk) - u_jk = d_jk / r_jk - - fc_k = coordination_function(r_ik,this%cutoff,0.5_dp) - dfc_k = dcoordination_function(r_ik,this%cutoff,0.5_dp) - - cos_ijk = dot_product(d_ij,d_ik)/(r_ij*r_ik) - - i_desc = i_desc + 1 - - if(my_do_descriptor) then - descriptor_out%x(i_desc)%data(1) = r_ij + r_ik - descriptor_out%x(i_desc)%data(2) = (r_ij - r_ik)**2 - descriptor_out%x(i_desc)%data(3) = r_jk !cos_ijk - descriptor_out%x(i_desc)%data(4) = descriptor_coordination%x(i)%data(1) - descriptor_out%x(i_desc)%ci(1) = i - descriptor_out%x(i_desc)%has_data = .true. - - descriptor_out%x(i_desc)%covariance_cutoff = fc_j*fc_k - endif - - if(my_do_grad_descriptor) then - dcosijk_ij = ( u_ik - cos_ijk * u_ij ) / r_ij - dcosijk_ik = ( u_ij - cos_ijk * u_ik ) / r_ik - - descriptor_out%x(i_desc)%ii(0) = i - descriptor_out%x(i_desc)%pos(:,0) = at%pos(:,i) - descriptor_out%x(i_desc)%has_grad_data(0) = .true. - descriptor_out%x(i_desc)%grad_data(1,:,0) = - u_ij - u_ik - descriptor_out%x(i_desc)%grad_data(2,:,0) = 2.0_dp * (r_ij - r_ik)*(-u_ij + u_ik) - descriptor_out%x(i_desc)%grad_data(3,:,0) = 0.0_dp !-dcosijk_ij - dcosijk_ik - descriptor_out%x(i_desc)%grad_data(4,:,0) = descriptor_coordination%x(i)%grad_data(1,:,0) - - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,0) = - dfc_j*fc_k*u_ij - dfc_k*fc_j*u_ik - - descriptor_out%x(i_desc)%ii(1) = j - descriptor_out%x(i_desc)%pos(:,1) = at%pos(:,j) + matmul(at%lattice,shift_ij) - descriptor_out%x(i_desc)%has_grad_data(1) = .true. - descriptor_out%x(i_desc)%grad_data(1,:,1) = u_ij - descriptor_out%x(i_desc)%grad_data(2,:,1) = 2.0_dp * (r_ij - r_ik)*u_ij - descriptor_out%x(i_desc)%grad_data(3,:,1) = u_jk !dcosijk_ij - - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,1) = dfc_j*fc_k*u_ij - - descriptor_out%x(i_desc)%ii(2) = k - descriptor_out%x(i_desc)%pos(:,2) = at%pos(:,k) + matmul(at%lattice,shift_ik) - descriptor_out%x(i_desc)%has_grad_data(2) = .true. - descriptor_out%x(i_desc)%grad_data(1,:,2) = u_ik - descriptor_out%x(i_desc)%grad_data(2,:,2) = 2.0_dp * (r_ij - r_ik)*(-u_ik) - descriptor_out%x(i_desc)%grad_data(3,:,2) = -u_jk !dcosijk_ik - - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,2) = dfc_k*fc_j*u_ik - - descriptor_out%x(i_desc)%ii(3:) = descriptor_coordination%x(i)%ii(1:) - descriptor_out%x(i_desc)%pos(:,3:) = descriptor_coordination%x(i)%pos(:,1:) - descriptor_out%x(i_desc)%has_grad_data(3:) = descriptor_coordination%x(i)%has_grad_data(1:) - descriptor_out%x(i_desc)%grad_data(4,:,3:) = descriptor_coordination%x(i)%grad_data(1,:,1:) - endif - enddo - enddo - enddo - - call finalise(my_coordination) - call finalise(descriptor_coordination) - - call system_timer('co_angle_3b_calc') - - endsubroutine co_angle_3b_calc - - subroutine co_distance_2b_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(co_distance_2b), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(descriptor) :: my_coordination - type(descriptor_data) :: descriptor_coordination - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor, Zi1, Zi2, Zj1, Zj2 - integer :: d, n_descriptors, n_cross, i_desc, i, j, n, & - n_neighbours_coordination_i, n_neighbours_coordination_ij, n_index - integer, dimension(3) :: shift - real(dp) :: r_ij - real(dp), dimension(3) :: u_ij - - INIT_ERROR(error) - call system_timer('co_distance_2b_calc') - - if(.not. this%initialised) then - RAISE_ERROR("co_distance_2b_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - call finalise(descriptor_out) - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='co_distance_2b_calc args_str')) then - RAISE_ERROR("co_distance_2b_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("co_distance_2b_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - RAISE_ERROR("co_distance_2b_calc cannot use atom masks yet.",error) - else - atom_mask_pointer => null() - endif - - endif - - d = co_distance_2b_dimensions(this,error) - - if(associated(atom_mask_pointer)) then - call descriptor_sizes(this,at,n_descriptors,n_cross, & - mask=atom_mask_pointer,n_index=n_index,error=error) - else - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - endif - - allocate(descriptor_out%x(n_descriptors)) - i_desc = 0 - do i = 1, at%N - - if( associated(atom_mask_pointer) ) then - if( .not. atom_mask_pointer(i) ) cycle - endif - - Zi1 = (this%Z1 == 0) .or. (at%Z(i) == this%Z1) - Zi2 = (this%Z2 == 0) .or. (at%Z(i) == this%Z2) - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance=r_ij) - - if(r_ij >= this%cutoff) cycle -!if(r_ij <3.5_dp) cycle - - Zj1 = (this%Z1 == 0) .or. (at%Z(j) == this%Z1) - Zj2 = (this%Z2 == 0) .or. (at%Z(j) == this%Z2) - if( .not. ( ( Zi1 .and. Zj2 ) .or. ( Zi2 .and. Zj1 ) ) ) cycle ! this pair doesn't belong to the descriptor type - - i_desc = i_desc + 1 - if(my_do_descriptor) then - allocate(descriptor_out%x(i_desc)%data(d)) - descriptor_out%x(i_desc)%data = 0.0_dp - allocate(descriptor_out%x(i_desc)%ci(n_index)) - descriptor_out%x(i_desc)%has_data = .false. - endif - - if(my_do_grad_descriptor) then - n_neighbours_coordination_ij = n_neighbours(at,i,max_dist=this%coordination_cutoff) + & - n_neighbours(at,j,max_dist=this%coordination_cutoff) + 2 - - allocate(descriptor_out%x(i_desc)%grad_data(d,3,0:1+n_neighbours_coordination_ij)) - allocate(descriptor_out%x(i_desc)%ii(0:1+n_neighbours_coordination_ij)) - allocate(descriptor_out%x(i_desc)%pos(3,0:1+n_neighbours_coordination_ij)) - allocate(descriptor_out%x(i_desc)%has_grad_data(0:1+n_neighbours_coordination_ij)) - descriptor_out%x(i_desc)%grad_data = 0.0_dp - descriptor_out%x(i_desc)%ii = 0 - descriptor_out%x(i_desc)%pos = 0.0_dp - descriptor_out%x(i_desc)%has_grad_data = .false. - - allocate(descriptor_out%x(i_desc)%grad_covariance_cutoff(3,0:1+n_neighbours_coordination_ij)) - descriptor_out%x(i_desc)%grad_covariance_cutoff = 0.0_dp - endif - enddo - enddo - - call initialise(my_coordination,'coordination cutoff='//this%coordination_cutoff//' transition_width='//this%coordination_transition_width,error) - call calc(my_coordination,at,descriptor_coordination,.true.,do_grad_descriptor,args_str,error) - - i_desc = 0 - do i = 1, at%N - - if( associated(atom_mask_pointer) ) then - if( .not. atom_mask_pointer(i) ) cycle - endif - - Zi1 = (this%Z1 == 0) .or. (at%Z(i) == this%Z1) - Zi2 = (this%Z2 == 0) .or. (at%Z(i) == this%Z2) - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij, cosines = u_ij, shift=shift) - if( r_ij >= this%cutoff ) cycle -!if(r_ij <3.5_dp) cycle - - Zj1 = (this%Z1 == 0) .or. (at%Z(j) == this%Z1) - Zj2 = (this%Z2 == 0) .or. (at%Z(j) == this%Z2) - if( .not. ( ( Zi1 .and. Zj2 ) .or. ( Zi2 .and. Zj1 ) ) ) cycle ! this pair doesn't belong to the descriptor type - - i_desc = i_desc + 1 - if(my_do_descriptor) then - descriptor_out%x(i_desc)%ci(1:2) = (/i,j/) - - descriptor_out%x(i_desc)%has_data = .true. - - descriptor_out%x(i_desc)%data(1) = r_ij - descriptor_out%x(i_desc)%data(2) = descriptor_coordination%x(i)%data(1) + descriptor_coordination%x(j)%data(1) - descriptor_out%x(i_desc)%data(3) = (descriptor_coordination%x(i)%data(1) - descriptor_coordination%x(j)%data(1))**2 - - descriptor_out%x(i_desc)%covariance_cutoff = coordination_function(r_ij, this%cutoff,this%transition_width) !coordination_function(r_ij,3.5_dp, 0.5_dp, this%cutoff,this%transition_width) - endif - if(my_do_grad_descriptor) then - n_neighbours_coordination_i = n_neighbours(at,i,max_dist=this%coordination_cutoff) - - descriptor_out%x(i_desc)%ii(0) = i - descriptor_out%x(i_desc)%pos(:,0) = at%pos(:,i) - descriptor_out%x(i_desc)%has_grad_data(0) = .true. - descriptor_out%x(i_desc)%grad_data(1,:,0) = -u_ij(:) - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,0) = -dcoordination_function(r_ij,this%cutoff,this%transition_width)*u_ij !-dcoordination_function(r_ij,3.5_dp, 0.5_dp, this%cutoff,this%transition_width)*u_ij - - descriptor_out%x(i_desc)%ii(1) = j - descriptor_out%x(i_desc)%pos(:,1) = at%pos(:,j) + matmul(at%lattice,shift) - descriptor_out%x(i_desc)%has_grad_data(1) = .true. - descriptor_out%x(i_desc)%grad_data(1,:,1) = u_ij(:) - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,1) = -descriptor_out%x(i_desc)%grad_covariance_cutoff(:,0) - - descriptor_out%x(i_desc)%ii(2:n_neighbours_coordination_i+2) = descriptor_coordination%x(i)%ii(:) - descriptor_out%x(i_desc)%pos(:,2:n_neighbours_coordination_i+2) = descriptor_coordination%x(i)%pos(:,:) - descriptor_out%x(i_desc)%has_grad_data(2:n_neighbours_coordination_i+2) = descriptor_coordination%x(i)%has_grad_data(:) - descriptor_out%x(i_desc)%grad_data(2,:,2:n_neighbours_coordination_i+2) = descriptor_coordination%x(i)%grad_data(1,:,:) - descriptor_out%x(i_desc)%grad_data(3,:,2:n_neighbours_coordination_i+2) = 2.0_dp*(descriptor_coordination%x(i)%data(1) - descriptor_coordination%x(j)%data(1))*& - descriptor_coordination%x(i)%grad_data(1,:,:) - - descriptor_out%x(i_desc)%ii(n_neighbours_coordination_i+3:) = descriptor_coordination%x(j)%ii(:) - descriptor_out%x(i_desc)%pos(:,n_neighbours_coordination_i+3:) = descriptor_coordination%x(j)%pos(:,:) - descriptor_out%x(i_desc)%has_grad_data(n_neighbours_coordination_i+3:) = descriptor_coordination%x(j)%has_grad_data(:) - descriptor_out%x(i_desc)%grad_data(2,:,n_neighbours_coordination_i+3:) = descriptor_coordination%x(j)%grad_data(1,:,:) - descriptor_out%x(i_desc)%grad_data(3,:,n_neighbours_coordination_i+3:) = -2.0_dp*(descriptor_coordination%x(i)%data(1) - descriptor_coordination%x(j)%data(1))*& - descriptor_coordination%x(j)%grad_data(1,:,:) - - endif - enddo - enddo - - call finalise(my_coordination) - call finalise(descriptor_coordination) - - call system_timer('co_distance_2b_calc') - - endsubroutine co_distance_2b_calc - - subroutine cosnx_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(cosnx), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor - integer :: d, i, j, k, n, m, a, b, i_desc, i_cosnx, l_n_neighbours, n_i, & - n_descriptors, n_cross, n_index - integer, dimension(3) :: shift_ij - real(dp) :: r_ij, r_ik, r_jk, cos_ijk, T_0_cos_ijk, T_1_cos_ijk, T_n_cos_ijk, U_0_cos_ijk, U_1_cos_ijk, U_n_cos_ijk, Ang - real(dp), dimension(3) :: u_ij, u_ik, d_ij, d_ik, d_jk, dcosijk_ij, dcosijk_ik, dAng_ij, dAng_ik - real(dp), dimension(:), allocatable :: Rad_ij, Rad_ik, T_cos_ijk, U_cos_ijk - real(dp), dimension(:,:), allocatable :: dRad_ij, dRad_ik - integer, dimension(total_elements) :: species_map - - INIT_ERROR(error) - - call system_timer('cosnx_calc') - - if(.not. this%initialised) then - RAISE_ERROR("cosnx_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='cosnx_calc args_str')) then - RAISE_ERROR("cosnx_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("cosnx_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - else - atom_mask_pointer => null() - endif - - endif - - species_map = 0 - do i = 1, size(this%species_Z) - if(this%species_Z(i) == 0) then - species_map = 1 - else - species_map(this%species_Z(i)) = i - endif - enddo - - call finalise(descriptor_out) - - d = cosnx_dimensions(this,error) - - if(associated(atom_mask_pointer)) then - call descriptor_sizes(this,at,n_descriptors,n_cross, & - mask=atom_mask_pointer,n_index=n_index,error=error) - else - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - endif - - allocate(descriptor_out%x(n_descriptors)) - - i_desc = 0 - do i = 1, at%N - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - if(associated(atom_mask_pointer)) then - if(.not. atom_mask_pointer(i)) cycle - endif - i_desc = i_desc + 1 - - if(my_do_descriptor) then - allocate(descriptor_out%x(i_desc)%data(d)) - descriptor_out%x(i_desc)%data = 0.0_dp - allocate(descriptor_out%x(i_desc)%ci(n_index)) - descriptor_out%x(i_desc)%has_data = .false. - descriptor_out%x(i_desc)%covariance_cutoff = 1.0_dp - endif - if(my_do_grad_descriptor) then - l_n_neighbours = n_neighbours(at,i,max_dist=this%cutoff) - - allocate(descriptor_out%x(i_desc)%grad_data(d,3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%ii(0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%pos(3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%has_grad_data(0:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_data = 0.0_dp - descriptor_out%x(i_desc)%ii = 0 - descriptor_out%x(i_desc)%pos = 0.0_dp - descriptor_out%x(i_desc)%has_grad_data = .false. - - allocate(descriptor_out%x(i_desc)%grad_covariance_cutoff(3,0:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_covariance_cutoff = 0.0_dp - endif - enddo - - allocate(Rad_ij(this%n_max), Rad_ik(this%n_max)) - allocate(T_cos_ijk(0:this%l_max)) - if(my_do_grad_descriptor) then - allocate(U_cos_ijk(-1:this%l_max)) - allocate(dRad_ij(3,this%n_max), dRad_ik(3,this%n_max)) - endif - - i_desc = 0 - do i = 1, at%N - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - if(associated(atom_mask_pointer)) then - if(.not. atom_mask_pointer(i)) cycle - endif - i_desc = i_desc + 1 - - if(my_do_descriptor) then - descriptor_out%x(i_desc)%ci(1) = i - descriptor_out%x(i_desc)%has_data = .true. - endif - if(my_do_grad_descriptor) then - descriptor_out%x(i_desc)%ii(0) = i - descriptor_out%x(i_desc)%pos(:,0) = at%pos(:,i) - descriptor_out%x(i_desc)%has_grad_data(0) = .true. - endif - - n_i = 0 - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij, cosines=u_ij, diff=d_ij, shift=shift_ij) - if( r_ij >= this%cutoff ) cycle - - n_i = n_i + 1 - - do a = 1, this%n_max - Rad_ij(a) = RadialFunction(this%Radial, r_ij, a) * this%w(species_map(at%Z(j))) - if(my_do_grad_descriptor) dRad_ij(:,a) = GradRadialFunction(this%Radial, r_ij, a) * u_ij * this%w(species_map(at%Z(j))) - enddo - - if(my_do_grad_descriptor) then - descriptor_out%x(i_desc)%ii(n_i) = j - descriptor_out%x(i_desc)%pos(:,n_i) = at%pos(:,j) + matmul(at%lattice,shift_ij) - descriptor_out%x(i_desc)%has_grad_data(n_i) = .true. - endif - - do m = 1, n_neighbours(at,i) - k = neighbour(at, i, m, distance = r_ik, cosines=u_ik, diff=d_ik) - if( r_ik >= this%cutoff ) cycle - - d_jk = d_ik - d_ij - r_jk = norm(d_jk) - if( r_jk .feq. 0.0_dp ) cycle - - cos_ijk = dot_product(u_ij,u_ik) - if(my_do_grad_descriptor) then - dcosijk_ij = ( u_ik - cos_ijk * u_ij ) / r_ij - dcosijk_ik = ( u_ij - cos_ijk * u_ik ) / r_ik - endif - - do a = 1, this%n_max - Rad_ik(a) = RadialFunction(this%Radial, r_ik, a) * this%w(species_map(at%Z(k))) - if(my_do_grad_descriptor) dRad_ik(:,a) = GradRadialFunction(this%Radial, r_ik, a) * u_ik * this%w(species_map(at%Z(k))) - enddo - - if(this%l_max >= 0) then - T_cos_ijk(0) = 1.0_dp - T_0_cos_ijk = T_cos_ijk(0) - if(my_do_grad_descriptor) then - U_cos_ijk(-1) = 0.0_dp - U_cos_ijk(0) = 1.0_dp - U_0_cos_ijk = U_cos_ijk(0) - endif - endif - - if(this%l_max >= 1) then - T_cos_ijk(1) = cos_ijk - T_1_cos_ijk = T_cos_ijk(1) - if(my_do_grad_descriptor) then - U_cos_ijk(1) = 2.0_dp*cos_ijk - U_1_cos_ijk = U_cos_ijk(1) - endif - endif - - do b = 2, this%l_max - T_n_cos_ijk = 2*cos_ijk*T_1_cos_ijk - T_0_cos_ijk - T_0_cos_ijk = T_1_cos_ijk - T_1_cos_ijk = T_n_cos_ijk - - T_cos_ijk(b) = T_n_cos_ijk - - if(my_do_grad_descriptor) then - U_n_cos_ijk = 2*cos_ijk*U_1_cos_ijk - U_0_cos_ijk - U_0_cos_ijk = U_1_cos_ijk - U_1_cos_ijk = U_n_cos_ijk - - U_cos_ijk(b) = U_n_cos_ijk - endif - enddo - - i_cosnx = 0 - do a = 1, this%n_max - do b = 0, this%l_max - i_cosnx = i_cosnx + 1 - - Ang = T_cos_ijk(b) - - if(my_do_descriptor) & - descriptor_out%x(i_desc)%data(i_cosnx) = descriptor_out%x(i_desc)%data(i_cosnx) + Rad_ij(a)*Rad_ik(a)*Ang*0.5_dp - - if(my_do_grad_descriptor) then - - dAng_ij = b*U_cos_ijk(b-1) * dcosijk_ij - dAng_ik = b*U_cos_ijk(b-1) * dcosijk_ik - - descriptor_out%x(i_desc)%grad_data(i_cosnx,:,0) = descriptor_out%x(i_desc)%grad_data(i_cosnx,:,0) - & - ( Rad_ij(a)*Rad_ik(a)*(dAng_ij+dAng_ik) + dRad_ij(:,a)*Rad_ik(a)*Ang + Rad_ij(a)*dRad_ik(:,a)*Ang ) * 0.5_dp - - descriptor_out%x(i_desc)%grad_data(i_cosnx,:,n_i) = descriptor_out%x(i_desc)%grad_data(i_cosnx,:,n_i) + & - (Rad_ij(a)*Rad_ik(a)*dAng_ij + dRad_ij(:,a)*Rad_ik(a)*Ang) - endif - enddo - enddo - enddo - enddo - enddo - - if(allocated(Rad_ij)) deallocate(Rad_ij) - if(allocated(Rad_ik)) deallocate(Rad_ik) - if(allocated(T_cos_ijk)) deallocate(T_cos_ijk) - if(allocated(U_cos_ijk)) deallocate(U_cos_ijk) - if(allocated(dRad_ij)) deallocate(dRad_ij) - if(allocated(dRad_ik)) deallocate(dRad_ik) - - call system_timer('cosnx_calc') - - endsubroutine cosnx_calc - - subroutine trihis_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(trihis), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor - integer :: d, i, j, k, n, m, i_desc, n_index - integer, dimension(3) :: shift_ij - real(dp) :: r_ij, r_ik, r_jk, cos_ijk, Sym_Cor_S, Sym_Cor_A, exp_desc - real(dp), dimension(3) :: u_ij, u_ik, d_ij, d_ik, d_jk, dcosijk_ij, dcosijk_ik, x, exp_arg, dexp_desc - real(dp), dimension(3,3) :: dx_j, dx_k - - INIT_ERROR(error) - - call system_timer('trihis_calc') - - if(.not. this%initialised) then - RAISE_ERROR("trihis_calc: descriptor object not initialised", error) - endif - RAISE_ERROR("trihis_calc: ab686 noticed that this routine needs updating. Remove this line if you know what you are doing, then proceed.", error) - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - call finalise(descriptor_out) - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='trihis_calc args_str')) then - RAISE_ERROR("trihis_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("trihis_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - RAISE_ERROR("trihis_calc cannot use atom masks yet.",error) - else - atom_mask_pointer => null() - endif - - endif - - d = trihis_dimensions(this,error) - - allocate(descriptor_out%x(at%N)) - do i = 1, at%N - if(my_do_descriptor) then - allocate(descriptor_out%x(i)%data(d)) - descriptor_out%x(i)%data = 0.0_dp - allocate(descriptor_out%x(i)%ci(n_index)) - descriptor_out%x(i)%has_data = .false. - endif - if(my_do_grad_descriptor) then - allocate(descriptor_out%x(i)%grad_data(d,3,0:n_neighbours(at,i))) - allocate(descriptor_out%x(i)%ii(0:n_neighbours(at,i))) - allocate(descriptor_out%x(i)%pos(3,0:n_neighbours(at,i))) - allocate(descriptor_out%x(i)%has_grad_data(0:n_neighbours(at,i))) - descriptor_out%x(i)%grad_data = 0.0_dp - descriptor_out%x(i)%ii = 0 - descriptor_out%x(i)%pos = 0.0_dp - descriptor_out%x(i)%has_grad_data = .false. - endif - enddo - - do i = 1, at%N - - if(my_do_descriptor) then - descriptor_out%x(i)%ci(1) = i - descriptor_out%x(i)%has_data = .true. - endif - if(my_do_grad_descriptor) then - descriptor_out%x(i)%ii(0) = i - descriptor_out%x(i)%pos(:,0) = at%pos(:,i) - descriptor_out%x(i)%has_grad_data(0) = .true. - endif - - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij, cosines=u_ij, diff=d_ij, shift=shift_ij) - if( r_ij >= this%cutoff ) cycle - - if(my_do_grad_descriptor) then - descriptor_out%x(i)%ii(n) = j - descriptor_out%x(i)%pos(:,n) = at%pos(:,j) + matmul(at%lattice,shift_ij) - descriptor_out%x(i)%has_grad_data(n) = .true. - endif - - do m = 1, n_neighbours(at,i) - k = neighbour(at, i, m, distance = r_ik, cosines=u_ik, diff=d_ik) - if( r_ik >= this%cutoff ) cycle - - d_jk = d_ik - d_ij - r_jk = norm(d_jk) - if( r_jk .feq. 0.0_dp ) cycle - - cos_ijk = dot_product(u_ij,u_ik) - Sym_Cor_S = r_ij + r_ik - Sym_Cor_A = (r_ij - r_ik)**2 - - x = (/Sym_Cor_S, Sym_Cor_A, cos_ijk/) - - if(my_do_grad_descriptor) then - dcosijk_ij = ( u_ik - cos_ijk * u_ij ) / r_ij - dcosijk_ik = ( u_ij - cos_ijk * u_ik ) / r_ik - - dx_j(:,1) = u_ij - dx_j(:,2) = 2.0_dp*(r_ij - r_ik)*u_ij - dx_j(:,3) = dcosijk_ij - - dx_k(:,1) = u_ik - dx_k(:,2) = -2.0_dp*(r_ij - r_ik)*u_ik - dx_k(:,3) = dcosijk_ik - endif - - do i_desc = 1, this%n_gauss - - exp_arg = (x - this%gauss_centre(:,i_desc))/this%gauss_width(:,i_desc) - exp_desc = exp(-0.5_dp*sum(exp_arg**2)) - - if(my_do_descriptor) & - descriptor_out%x(i)%data(i_desc) = descriptor_out%x(i)%data(i_desc) + exp_desc - - if(my_do_grad_descriptor) then - dexp_desc = -exp_desc * exp_arg / this%gauss_width(:,i_desc) - - descriptor_out%x(i)%grad_data(i_desc,:,0) = descriptor_out%x(i)%grad_data(i_desc,:,0) - & - matmul(dx_j+dx_k,dexp_desc) - descriptor_out%x(i)%grad_data(i_desc,:,n) = descriptor_out%x(i)%grad_data(i_desc,:,n) + & - 2.0_dp*matmul(dx_j,dexp_desc) - endif - enddo - enddo - enddo - enddo - - call system_timer('trihis_calc') - - endsubroutine trihis_calc - - subroutine water_monomer_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(water_monomer), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor - integer :: d, n_descriptors, n_cross, i, iO, iH1, iH2, n_index - integer :: i_desc, mpi_n_procs, mpi_my_proc - integer, dimension(3) :: shift_1, shift_2 - integer, dimension(:,:), allocatable :: water_monomer_index - real(dp) :: r1, r2 - real(dp), dimension(3) :: v1, v2, u1, u2 - - INIT_ERROR(error) - - call system_timer('water_monomer_calc') - - if(.not. this%initialised) then - RAISE_ERROR("water_monomer_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - call finalise(descriptor_out) - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='water_monomer_calc args_str')) then - RAISE_ERROR("water_monomer_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("water_monomer_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - else - atom_mask_pointer => null() - endif - - endif - - d = water_monomer_dimensions(this,error) - if(associated(atom_mask_pointer)) then - call descriptor_sizes(this,at,n_descriptors,n_cross, & - mask=atom_mask_pointer,n_index=n_index, error=error) - else - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index, error=error) - endif - - allocate(descriptor_out%x(n_descriptors)) - do i = 1, n_descriptors - if(my_do_descriptor) then - allocate(descriptor_out%x(i)%data(d)) - descriptor_out%x(i)%data = 0.0_dp - allocate(descriptor_out%x(i)%ci(n_index)) - descriptor_out%x(i)%has_data = .false. - descriptor_out%x(i)%covariance_cutoff = 1.0_dp - endif - if(my_do_grad_descriptor) then - allocate(descriptor_out%x(i)%grad_data(d,3,3)) - allocate(descriptor_out%x(i)%ii(3)) - allocate(descriptor_out%x(i)%pos(3,3)) - allocate(descriptor_out%x(i)%has_grad_data(3)) - descriptor_out%x(i)%grad_data = 0.0_dp - descriptor_out%x(i)%ii = 0 - descriptor_out%x(i)%pos = 0.0_dp - descriptor_out%x(i)%has_grad_data = .false. - - allocate(descriptor_out%x(i)%grad_covariance_cutoff(3,3)) - descriptor_out%x(i)%grad_covariance_cutoff = 0.0_dp - endif - enddo - - allocate(water_monomer_index(3,count(at%Z==8))) - call find_water_monomer(at,water_monomer_index,error=error) - - i_desc = 0 - do i = 1, count(at%Z==8) - - iO = water_monomer_index(1,i) - iH1 = water_monomer_index(2,i) - iH2 = water_monomer_index(3,i) - - if(associated(atom_mask_pointer)) then - if(.not. atom_mask_pointer(iO)) cycle - endif - i_desc = i_desc + 1 - - v1 = diff_min_image(at,iO,iH1,shift=shift_1) - v2 = diff_min_image(at,iO,iH2,shift=shift_2) - r1 = sqrt(dot_product(v1,v1)) - r2 = sqrt(dot_product(v2,v2)) - u1 = v1 / r1 - u2 = v2 / r2 - - if(my_do_descriptor) then - descriptor_out%x(i_desc)%ci(:) = water_monomer_index(:,i) - descriptor_out%x(i_desc)%has_data = .true. - descriptor_out%x(i_desc)%data(1) = r1+r2 - descriptor_out%x(i_desc)%data(2) = (r1-r2)**2 - descriptor_out%x(i_desc)%data(3) = dot_product(v1,v2) - endif - - if(my_do_grad_descriptor) then - descriptor_out%x(i_desc)%ii(:) = water_monomer_index(:,i) - descriptor_out%x(i_desc)%pos(:,1) = at%pos(:,iO) - descriptor_out%x(i_desc)%pos(:,2) = at%pos(:,iH1) + matmul(at%lattice,shift_1) - descriptor_out%x(i_desc)%pos(:,3) = at%pos(:,iH2) + matmul(at%lattice,shift_2) - descriptor_out%x(i_desc)%has_grad_data(:) = .true. - - descriptor_out%x(i_desc)%grad_data(1,:,1) = -u1-u2 ! 1st descriptor wrt rO - descriptor_out%x(i_desc)%grad_data(1,:,2) = u1 ! 1st descriptor wrt rH1 - descriptor_out%x(i_desc)%grad_data(1,:,3) = u2 ! 1st descriptor wrt rH2 - descriptor_out%x(i_desc)%grad_data(2,:,1) = 2.0_dp*(r1-r2)*(u2-u1) ! 2nd descriptor wrt rO - descriptor_out%x(i_desc)%grad_data(2,:,2) = 2.0_dp*(r1-r2)*u1 ! 2nd descriptor wrt rH1 - descriptor_out%x(i_desc)%grad_data(2,:,3) = -2.0_dp*(r1-r2)*u2 ! 2nd descriptor wrt rH2 - descriptor_out%x(i_desc)%grad_data(3,:,1) = -v1-v2 ! 3rd descriptor wrt rO - descriptor_out%x(i_desc)%grad_data(3,:,2) = v2 ! 3rd descriptor wrt rH1 - descriptor_out%x(i_desc)%grad_data(3,:,3) = v1 ! 3rd descriptor wrt rH2 - endif - - enddo - - deallocate(water_monomer_index) - call system_timer('water_monomer_calc') - - endsubroutine water_monomer_calc - - subroutine water_dimer_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(water_dimer), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor - integer :: d, n_descriptors, n_cross, n_monomers, i_desc, i, j, n, & - iAO, iAH1, iAH2, iBO, iBH1, iBH2, i_distance, n_index - integer :: mpi_n_procs, mpi_my_proc - integer, dimension(3) :: shift_AO_BO, shift_AO_AH1, shift_AO_AH2, shift_AO_BH1, shift_AO_BH2, & - shift_BO_AH1, shift_BO_AH2, shift_BO_BH1, shift_BO_BH2, & - shift_AH1_AH2, shift_AH1_BH1, shift_AH1_BH2, shift_AH2_BH1, shift_AH2_BH2, shift_BH1_BH2 - real(dp), dimension(3) :: diff_AO_BO, diff_AO_AH1, diff_AO_AH2, diff_AO_BH1, diff_AO_BH2, & - diff_BO_AH1, diff_BO_AH2, diff_BO_BH1, diff_BO_BH2, & - diff_AH1_AH2, diff_AH1_BH1, diff_AH1_BH2, diff_AH2_BH1, diff_AH2_BH2, diff_BH1_BH2 - integer, dimension(:,:), allocatable :: water_monomer_index - real(dp) :: r_AO_BO, r_AO_AH1, r_AO_AH2, r_AO_BH1, r_AO_BH2, r_BO_AH1, r_BO_AH2, r_BO_BH1, r_BO_BH2, & - r_AH1_AH2, r_AH1_BH1, r_AH1_BH2, r_AH2_BH1, r_AH2_BH2, r_BH1_BH2 - integer, dimension(1) :: j_array - real(dp), dimension(15) :: distances - - INIT_ERROR(error) - - call system_timer('water_dimer_calc') - - if(.not. this%initialised) then - RAISE_ERROR("water_dimer_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - call finalise(descriptor_out) - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='water_dimer_calc args_str')) then - RAISE_ERROR("water_dimer_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("water_dimer_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - else - atom_mask_pointer => null() - endif - - endif - - d = water_dimer_dimensions(this,error) - - if(associated(atom_mask_pointer)) then - call descriptor_sizes(this,at,n_descriptors,n_cross, & - mask=atom_mask_pointer,n_index=n_index,error=error) - else - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - endif - - allocate(descriptor_out%x(n_descriptors)) - do i = 1, n_descriptors - if(my_do_descriptor) then - allocate(descriptor_out%x(i)%data(d)) - descriptor_out%x(i)%data = 0.0_dp - allocate(descriptor_out%x(i)%ci(n_index)) - descriptor_out%x(i)%has_data = .false. - endif - if(my_do_grad_descriptor) then - allocate(descriptor_out%x(i)%grad_data(d,3,6)) - allocate(descriptor_out%x(i)%ii(6)) - allocate(descriptor_out%x(i)%pos(3,6)) - allocate(descriptor_out%x(i)%has_grad_data(6)) - descriptor_out%x(i)%grad_data = 0.0_dp - descriptor_out%x(i)%ii = 0 - descriptor_out%x(i)%pos = 0.0_dp - descriptor_out%x(i)%has_grad_data = .false. - - allocate(descriptor_out%x(i)%grad_covariance_cutoff(3,6)) - descriptor_out%x(i)%grad_covariance_cutoff = 0.0_dp - - endif - enddo - - n_monomers = 0 - do i = 1, at%N - if(at%Z(i) == 8) n_monomers = n_monomers+1 - enddo - - allocate(water_monomer_index(3,n_monomers)) - call find_water_monomer(at,water_monomer_index,OHH_ordercheck=this%OHH_ordercheck,monomer_cutoff=this%monomer_cutoff,error=error) - - i_desc = 0 - do i = 1, n_monomers - iAO = water_monomer_index(1,i) - iAH1 = water_monomer_index(2,i) - iAH2 = water_monomer_index(3,i) - - if(associated(atom_mask_pointer)) then - if(.not. atom_mask_pointer(iAO)) cycle - endif - - diff_AO_AH1 = diff_min_image(at,iAO,iAH1,shift=shift_AO_AH1) - diff_AO_AH2 = diff_min_image(at,iAO,iAH2,shift=shift_AO_AH2) - diff_AH1_AH2 = diff_min_image(at,iAH1,iAH2,shift=shift_AH1_AH2) - - r_AO_AH1 = norm(diff_AO_AH1) - r_AO_AH2 = norm(diff_AO_AH2) - r_AH1_AH2 = norm(diff_AH1_AH2) - - do n = 1, n_neighbours(at,iAO) - iBO = neighbour(at,iAO,n,distance=r_AO_BO, diff=diff_AO_BO, shift=shift_AO_BO ) - if(at%Z(iBO) /= 8) cycle - if( r_AO_BO >= this%cutoff ) cycle - i_desc = i_desc + 1 - j_array = find(water_monomer_index(1,:) == iBO) - j = j_array(1) - - iBH1 = water_monomer_index(2,j) - iBH2 = water_monomer_index(3,j) - - diff_BO_BH1 = diff_min_image(at,iBO,iBH1,shift=shift_BO_BH1) - diff_BO_BH2 = diff_min_image(at,iBO,iBH2,shift=shift_BO_BH2) - diff_BH1_BH2 = diff_min_image(at,iBH1,iBH2,shift=shift_BH1_BH2) - - r_BO_BH1 = norm(diff_BO_BH1) - r_BO_BH2 = norm(diff_BO_BH2) - r_BH1_BH2 = norm(diff_BH1_BH2) - - diff_AO_BH1 = diff_AO_BO + diff_BO_BH1 - diff_AO_BH2 = diff_AO_BO + diff_BO_BH2 - shift_AO_BH1 = shift_AO_BO + shift_BO_BH1 - shift_AO_BH2 = shift_AO_BO + shift_BO_BH2 - - r_AO_BH1 = norm(diff_AO_BH1) - r_AO_BH2 = norm(diff_AO_BH2) - - diff_BO_AH1 = -diff_AO_BO + diff_AO_AH1 - diff_BO_AH2 = -diff_AO_BO + diff_AO_AH2 - - shift_BO_AH1 = -shift_AO_BO + shift_AO_AH1 - shift_BO_AH2 = -shift_AO_BO + shift_AO_AH2 - - r_BO_AH1 = norm(diff_BO_AH1) - r_BO_AH2 = norm(diff_BO_AH2) - - diff_AH1_BH1 = -diff_AO_AH1 + diff_AO_BO + diff_BO_BH1 - diff_AH1_BH2 = -diff_AO_AH1 + diff_AO_BO + diff_BO_BH2 - diff_AH2_BH1 = -diff_AO_AH2 + diff_AO_BO + diff_BO_BH1 - diff_AH2_BH2 = -diff_AO_AH2 + diff_AO_BO + diff_BO_BH2 - - shift_AH1_BH1 = -shift_AO_AH1 + shift_AO_BO + shift_BO_BH1 - shift_AH1_BH2 = -shift_AO_AH1 + shift_AO_BO + shift_BO_BH2 - shift_AH2_BH1 = -shift_AO_AH2 + shift_AO_BO + shift_BO_BH1 - shift_AH2_BH2 = -shift_AO_AH2 + shift_AO_BO + shift_BO_BH2 - - r_AH1_BH1 = norm(diff_AH1_BH1) - r_AH1_BH2 = norm(diff_AH1_BH2) - r_AH2_BH1 = norm(diff_AH2_BH1) - r_AH2_BH2 = norm(diff_AH2_BH2) - - - distances = (/r_AO_BO, & - r_AO_AH1, r_AO_AH2, r_AO_BH1, r_AO_BH2, r_BO_AH1, r_BO_AH2, r_BO_BH1, r_BO_BH2, & - r_AH1_AH2, r_AH1_BH1, r_AH1_BH2, r_AH2_BH1, r_AH2_BH2, r_BH1_BH2/) - - if(my_do_descriptor) then - descriptor_out%x(i_desc)%ci(:) = (/ water_monomer_index(:,i),water_monomer_index(:,j) /) - descriptor_out%x(i_desc)%has_data = .true. - descriptor_out%x(i_desc)%data(:) = distances**this%power - - descriptor_out%x(i_desc)%covariance_cutoff = coordination_function(r_AO_BO, & - this%cutoff,this%cutoff_transition_width) - endif - - if(my_do_grad_descriptor) then - descriptor_out%x(i_desc)%ii(:) = (/ water_monomer_index(:,i),water_monomer_index(:,j) /) - descriptor_out%x(i_desc)%pos(:,1) = at%pos(:,iAO) ! TODO: Have to figure out how to do this. - descriptor_out%x(i_desc)%pos(:,2) = at%pos(:,iAH1) + matmul(at%lattice,shift_AO_AH1) ! TODO: Have to figure out how to do this. - descriptor_out%x(i_desc)%pos(:,3) = at%pos(:,iAH2) + matmul(at%lattice,shift_AO_AH2) ! TODO: Have to figure out how to do this. - descriptor_out%x(i_desc)%pos(:,4) = at%pos(:,iBO) + matmul(at%lattice,shift_AO_BO) ! TODO: Have to figure out how to do this. - descriptor_out%x(i_desc)%pos(:,5) = at%pos(:,iBH1) + matmul(at%lattice,shift_AO_BH1) ! TODO: Have to figure out how to do this. - descriptor_out%x(i_desc)%pos(:,6) = at%pos(:,iBH2) + matmul(at%lattice,shift_AO_BH2) ! TODO: Have to figure out how to do this. - - descriptor_out%x(i_desc)%has_grad_data(:) = .true. - - descriptor_out%x(i_desc)%grad_data(1,:,1) = -diff_AO_BO / r_AO_BO ! 1st descriptor wrt OA - descriptor_out%x(i_desc)%grad_data(1,:,4) = -descriptor_out%x(i_desc)%grad_data(1,:,1) ! 1st descriptor wrt OB - - descriptor_out%x(i_desc)%grad_data(2,:,1) = -diff_AO_AH1 / r_AO_AH1 ! 2nd descriptor wrt OA - descriptor_out%x(i_desc)%grad_data(2,:,2) = -descriptor_out%x(i_desc)%grad_data(2,:,1) ! 2nd descriptor wrt AH1 - descriptor_out%x(i_desc)%grad_data(3,:,1) = -diff_AO_AH2 / r_AO_AH2 ! 3rd descriptor wrt OA - descriptor_out%x(i_desc)%grad_data(3,:,3) = -descriptor_out%x(i_desc)%grad_data(3,:,1) ! 3rd descriptor wrt AH2 - descriptor_out%x(i_desc)%grad_data(4,:,1) = -diff_AO_BH1 / r_AO_BH1 ! 4th descriptor wrt OA - descriptor_out%x(i_desc)%grad_data(4,:,5) = -descriptor_out%x(i_desc)%grad_data(4,:,1) ! 4th descriptor wrt BH1 - descriptor_out%x(i_desc)%grad_data(5,:,1) = -diff_AO_BH2 / r_AO_BH2 ! 5th descriptor wrt OA - descriptor_out%x(i_desc)%grad_data(5,:,6) = -descriptor_out%x(i_desc)%grad_data(5,:,1) ! 5th descriptor wrt BH2 - - descriptor_out%x(i_desc)%grad_data(6,:,4) = -diff_BO_AH1 / r_BO_AH1 ! 6th descriptor wrt OB - descriptor_out%x(i_desc)%grad_data(6,:,2) = -descriptor_out%x(i_desc)%grad_data(6,:,4) ! 6th descriptor wrt AH1 - descriptor_out%x(i_desc)%grad_data(7,:,4) = -diff_BO_AH2 / r_BO_AH2 ! 7th descriptor wrt OB - descriptor_out%x(i_desc)%grad_data(7,:,3) = -descriptor_out%x(i_desc)%grad_data(7,:,4) ! 7th descriptor wrt AH2 - descriptor_out%x(i_desc)%grad_data(8,:,4) = -diff_BO_BH1 / r_BO_BH1 ! 8th descriptor wrt OB - descriptor_out%x(i_desc)%grad_data(8,:,5) = -descriptor_out%x(i_desc)%grad_data(8,:,4) ! 8th descriptor wrt BH1 - descriptor_out%x(i_desc)%grad_data(9,:,4) = -diff_BO_BH2 / r_BO_BH2 ! 9th descriptor wrt OB - descriptor_out%x(i_desc)%grad_data(9,:,6) = -descriptor_out%x(i_desc)%grad_data(9,:,4) ! 9th descriptor wrt BH2 - - descriptor_out%x(i_desc)%grad_data(10,:,2) = -diff_AH1_AH2 / r_AH1_AH2 ! 10th descriptor wrt AH1 - descriptor_out%x(i_desc)%grad_data(10,:,3) = -descriptor_out%x(i_desc)%grad_data(10,:,2) ! 10th descriptor wrt AH2 - descriptor_out%x(i_desc)%grad_data(11,:,2) = -diff_AH1_BH1 / r_AH1_BH1 ! 11th descriptor wrt AH1 - descriptor_out%x(i_desc)%grad_data(11,:,5) = -descriptor_out%x(i_desc)%grad_data(11,:,2) ! 11th descriptor wrt BH1 - descriptor_out%x(i_desc)%grad_data(12,:,2) = -diff_AH1_BH2 / r_AH1_BH2 ! 12th descriptor wrt AH1 - descriptor_out%x(i_desc)%grad_data(12,:,6) = -descriptor_out%x(i_desc)%grad_data(12,:,2) ! 12th descriptor wrt BH2 - - descriptor_out%x(i_desc)%grad_data(13,:,3) = -diff_AH2_BH1 / r_AH2_BH1 ! 13th descriptor wrt AH2 - descriptor_out%x(i_desc)%grad_data(13,:,5) = -descriptor_out%x(i_desc)%grad_data(13,:,3) ! 13th descriptor wrt BH1 - descriptor_out%x(i_desc)%grad_data(14,:,3) = -diff_AH2_BH2 / r_AH2_BH2 ! 14th descriptor wrt AH2 - descriptor_out%x(i_desc)%grad_data(14,:,6) = -descriptor_out%x(i_desc)%grad_data(14,:,3) ! 14th descriptor wrt BH2 - - descriptor_out%x(i_desc)%grad_data(15,:,5) = -diff_BH1_BH2 / r_BH1_BH2 ! 15th descriptor wrt BH1 - descriptor_out%x(i_desc)%grad_data(15,:,6) = -descriptor_out%x(i_desc)%grad_data(15,:,5) ! 15th descriptor wrt BH2 - - do i_distance = 1, 15 - descriptor_out%x(i_desc)%grad_data(i_distance,:,:) = descriptor_out%x(i_desc)%grad_data(i_distance,:,:) * & - distances(i_distance)**(this%power-1.0_dp) * this%power - enddo - - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,1) = -dcoordination_function(r_AO_BO,& - this%cutoff,this%cutoff_transition_width) * diff_AO_BO / r_AO_BO - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,4) = -descriptor_out%x(i_desc)%grad_covariance_cutoff(:,1) - endif - enddo - enddo - - deallocate(water_monomer_index) - call system_timer('water_dimer_calc') - - endsubroutine water_dimer_calc - - subroutine A2_dimer_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(A2_dimer), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor - integer :: d, n_descriptors, n_cross, n_monomers, i_desc, i, j, & - iA1, iA2, iB1, iB2, n_index - integer, dimension(3) :: shift_A1_A2, shift_A1_B1, shift_A1_B2, shift_A2_B1, shift_A2_B2, shift_B1_B2 - integer, dimension(at%N) :: A2_monomer_index - real(dp) :: r_A1_A2, r_A1_B1, r_A1_B2, r_A2_B1, r_A2_B2, r_B1_B2 - - INIT_ERROR(error) - - call system_timer('A2_dimer_calc') - - if(.not. this%initialised) then - RAISE_ERROR("A2_dimer_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - call finalise(descriptor_out) - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='A2_dimer_calc args_str')) then - RAISE_ERROR("A2_dimer_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("A2_dimer_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - RAISE_ERROR("A2_dimer_calc cannot use atom masks yet.",error) - else - atom_mask_pointer => null() - endif - - endif - - d = A2_dimer_dimensions(this,error) - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - - allocate(descriptor_out%x(n_descriptors)) - do i = 1, n_descriptors - if(my_do_descriptor) then - allocate(descriptor_out%x(i)%data(d)) - descriptor_out%x(i)%data = 0.0_dp - allocate(descriptor_out%x(i)%ci(n_index)) - descriptor_out%x(i)%has_data = .false. - endif - if(my_do_grad_descriptor) then - allocate(descriptor_out%x(i)%grad_data(d,3,4)) - allocate(descriptor_out%x(i)%ii(4)) - allocate(descriptor_out%x(i)%pos(3,4)) - allocate(descriptor_out%x(i)%has_grad_data(4)) - descriptor_out%x(i)%grad_data = 0.0_dp - descriptor_out%x(i)%ii = 0 - descriptor_out%x(i)%pos = 0.0_dp - descriptor_out%x(i)%has_grad_data = .false. - - allocate(descriptor_out%x(i)%grad_covariance_cutoff(3,4)) - descriptor_out%x(i)%grad_covariance_cutoff = 0.0_dp - endif - enddo - - n_monomers = count(at%Z == this%atomic_number) / 2 - - call find_A2_monomer(at,this%atomic_number, this%monomer_cutoff, A2_monomer_index,error) - - i_desc = 0 - do i = 1, at%N - iA1 = i - iA2 = neighbour(at,i,A2_monomer_index(i),distance=r_A1_A2,shift=shift_A1_A2) - if( iA1 > iA2 ) cycle - - do j = i + 1, at%N - iB1 = j - iB2 = neighbour(at,j,A2_monomer_index(j),distance=r_B1_B2,shift=shift_B1_B2) - if( iB1 > iB2 ) cycle - - r_A1_B1 = distance_min_image(at,iA1,iB1,shift=shift_A1_B1) - r_A1_B2 = distance_min_image(at,iA1,iB2,shift=shift_A1_B2) - - r_A2_B1 = distance_min_image(at,iA2,iB1,shift=shift_A2_B1) - r_A2_B2 = distance_min_image(at,iA2,iB2,shift=shift_A2_B2) - - if( any( (/r_A1_A2,r_B1_B2,r_A1_B1,r_A1_B2,r_A2_B1,r_A2_B2/) >= this%cutoff) ) cycle - i_desc = i_desc + 1 - - if(my_do_descriptor) then - descriptor_out%x(i_desc)%ci(:) = (/ iA1, iA2, iB1, iB2 /) - descriptor_out%x(i_desc)%has_data = .true. - descriptor_out%x(i_desc)%data(:) = (/ r_A1_A2, r_B1_B2, r_A1_B1, r_A1_B2, r_A2_B1, r_A2_B2/) - endif - - if(my_do_grad_descriptor) then - descriptor_out%x(i_desc)%ii(:) = (/ iA1, iA2, iB1, iB2 /) - descriptor_out%x(i_desc)%pos(:,:) = 0.0_dp ! TODO: Have to figure out how to do this. - descriptor_out%x(i_desc)%has_grad_data(:) = .true. - - descriptor_out%x(i_desc)%grad_data(1,:,1) = -diff(at,iA1,iA2,shift=shift_A1_A2) / r_A1_A2 ! 1st descriptor wrt A1 - descriptor_out%x(i_desc)%grad_data(1,:,2) = -descriptor_out%x(i_desc)%grad_data(1,:,1) ! 1st descriptor wrt A2 - descriptor_out%x(i_desc)%grad_data(2,:,3) = -diff(at,iB1,iB2,shift=shift_B1_B2) / r_B1_B2 ! 2nd descriptor wrt B1 - descriptor_out%x(i_desc)%grad_data(2,:,4) = -descriptor_out%x(i_desc)%grad_data(2,:,3) ! 2nd descriptor wrt B2 - - descriptor_out%x(i_desc)%grad_data(3,:,1) = -diff(at,iA1,iB1,shift=shift_A1_B1) / r_A1_B1 ! 3rd descriptor wrt A1 - descriptor_out%x(i_desc)%grad_data(3,:,3) = -descriptor_out%x(i_desc)%grad_data(3,:,1) ! 3rd descriptor wrt B1 - descriptor_out%x(i_desc)%grad_data(4,:,1) = -diff(at,iA1,iB2,shift=shift_A1_B2) / r_A1_B2 ! 4th descriptor wrt A1 - descriptor_out%x(i_desc)%grad_data(4,:,4) = -descriptor_out%x(i_desc)%grad_data(4,:,1) ! 4th descriptor wrt B2 - - descriptor_out%x(i_desc)%grad_data(5,:,2) = -diff(at,iA2,iB1,shift=shift_A2_B1) / r_A2_B1 ! 5th descriptor wrt A2 - descriptor_out%x(i_desc)%grad_data(5,:,3) = -descriptor_out%x(i_desc)%grad_data(5,:,2) ! 5th descriptor wrt B1 - descriptor_out%x(i_desc)%grad_data(6,:,2) = -diff(at,iA2,iB2,shift=shift_A2_B2) / r_A2_B2 ! 6th descriptor wrt A2 - descriptor_out%x(i_desc)%grad_data(6,:,4) = -descriptor_out%x(i_desc)%grad_data(6,:,2) ! 6th descriptor wrt B2 - - endif - enddo - enddo - - call system_timer('A2_dimer_calc') - - endsubroutine A2_dimer_calc - - subroutine AB_dimer_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(AB_dimer), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor - integer :: d, n_descriptors, n_cross, n_monomers, i_desc, i, j, & - iA1, iA2, iB1, iB2, n_index - integer, dimension(3) :: shift_A1_A2, shift_A1_B1, shift_A1_B2, shift_A2_B1, shift_A2_B2, shift_B1_B2 - integer, dimension(:,:), allocatable :: AB_monomer_index - real(dp) :: r_A1_A2, r_A1_B1, r_A1_B2, r_A2_B1, r_A2_B2, r_B1_B2 - - INIT_ERROR(error) - - call system_timer('AB_dimer_calc') - - if(.not. this%initialised) then - RAISE_ERROR("AB_dimer_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - call finalise(descriptor_out) - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='AB_dimer_calc args_str')) then - RAISE_ERROR("AB_dimer_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("AB_dimer_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - RAISE_ERROR("AB_dimer_calc cannot use atom masks yet.",error) - else - atom_mask_pointer => null() - endif - - endif - - d = AB_dimer_dimensions(this,error) - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - - allocate(descriptor_out%x(n_descriptors)) - do i = 1, n_descriptors - if(my_do_descriptor) then - allocate(descriptor_out%x(i)%data(d)) - descriptor_out%x(i)%data = 0.0_dp - allocate(descriptor_out%x(i)%ci(n_index)) - descriptor_out%x(i)%has_data = .false. - endif - if(my_do_grad_descriptor) then - allocate(descriptor_out%x(i)%grad_data(d,3,4)) - allocate(descriptor_out%x(i)%ii(4)) - allocate(descriptor_out%x(i)%pos(3,4)) - allocate(descriptor_out%x(i)%has_grad_data(4)) - descriptor_out%x(i)%grad_data = 0.0_dp - descriptor_out%x(i)%ii = 0 - descriptor_out%x(i)%pos = 0.0_dp - descriptor_out%x(i)%has_grad_data = .false. - - allocate(descriptor_out%x(i)%grad_covariance_cutoff(3,4)) - descriptor_out%x(i)%grad_covariance_cutoff = 0.0_dp - endif - enddo - - if( count(at%Z == this%atomic_number1) == count(at%Z == this%atomic_number2) ) then - n_monomers = count(at%Z == this%atomic_number1) - else - RAISE_ERROR("AB_dimer_calc: number of monomer atoms 1 ("//count(at%Z == this%atomic_number1)//") not equal to number of monomer atoms 2 ("//count(at%Z == this%atomic_number1)//")",error) - endif - - allocate(AB_monomer_index(2,n_monomers)) - call find_AB_monomer(at,(/this%atomic_number1,this%atomic_number2/), this%monomer_cutoff, AB_monomer_index,error) - - i_desc = 0 - do i = 1, n_monomers - iA1 = AB_monomer_index(1,i) - iB1 = AB_monomer_index(2,i) - do j = i + 1, n_monomers - iA2 = AB_monomer_index(1,j) - iB2 = AB_monomer_index(2,j) - - - r_A1_B1 = distance_min_image(at,iA1,iB1,shift=shift_A1_B1) - r_A2_B2 = distance_min_image(at,iA2,iB2,shift=shift_A2_B2) - - r_A1_A2 = distance_min_image(at,iA1,iA2,shift=shift_A1_A2) - r_B1_B2 = distance_min_image(at,iB1,iB2,shift=shift_B1_B2) - - r_A1_B2 = distance_min_image(at,iA1,iB2,shift=shift_A1_B2) - r_A2_B1 = distance_min_image(at,iA2,iB1,shift=shift_A2_B1) - - if( any( (/r_A1_A2,r_B1_B2,r_A1_B1,r_A1_B2,r_A2_B1,r_A2_B2/) >= this%cutoff) ) cycle - i_desc = i_desc + 1 - - if(my_do_descriptor) then - descriptor_out%x(i_desc)%ci(:) = (/ AB_monomer_index(:,i),AB_monomer_index(:,j) /) - descriptor_out%x(i_desc)%has_data = .true. - descriptor_out%x(i_desc)%data(:) = (/ r_A1_B1, r_A2_B2, r_A1_A2, r_B1_B2, r_A1_B2, r_A2_B1 /) - endif - - if(my_do_grad_descriptor) then - descriptor_out%x(i_desc)%ii(:) = (/ AB_monomer_index(:,i),AB_monomer_index(:,j) /) - descriptor_out%x(i_desc)%pos(:,:) = 0.0_dp ! TODO: Have to figure out how to do this. - descriptor_out%x(i_desc)%has_grad_data(:) = .true. - - descriptor_out%x(i_desc)%grad_data(1,:,1) = -diff(at,iA1,iB1,shift=shift_A1_B1) / r_A1_B1 ! 1st descriptor wrt A1 - descriptor_out%x(i_desc)%grad_data(1,:,2) = -descriptor_out%x(i_desc)%grad_data(1,:,1) ! 1st descriptor wrt B1 - descriptor_out%x(i_desc)%grad_data(2,:,3) = -diff(at,iA2,iB2,shift=shift_A2_B2) / r_A2_B2 ! 2nd descriptor wrt A2 - descriptor_out%x(i_desc)%grad_data(2,:,4) = -descriptor_out%x(i_desc)%grad_data(2,:,3) ! 2nd descriptor wrt B2 - - descriptor_out%x(i_desc)%grad_data(3,:,1) = -diff(at,iA1,iA2,shift=shift_A1_A2) / r_A1_A2 ! 1st descriptor wrt A1 - descriptor_out%x(i_desc)%grad_data(3,:,3) = -descriptor_out%x(i_desc)%grad_data(3,:,1) ! 1st descriptor wrt A2 - descriptor_out%x(i_desc)%grad_data(4,:,2) = -diff(at,iB1,iB2,shift=shift_B1_B2) / r_B1_B2 ! 2nd descriptor wrt B1 - descriptor_out%x(i_desc)%grad_data(4,:,4) = -descriptor_out%x(i_desc)%grad_data(4,:,2) ! 2nd descriptor wrt B2 - - descriptor_out%x(i_desc)%grad_data(5,:,1) = -diff(at,iA1,iB2,shift=shift_A1_B2) / r_A1_B2 ! 4th descriptor wrt A1 - descriptor_out%x(i_desc)%grad_data(5,:,4) = -descriptor_out%x(i_desc)%grad_data(5,:,1) ! 4th descriptor wrt B2 - descriptor_out%x(i_desc)%grad_data(6,:,3) = -diff(at,iA2,iB1,shift=shift_A2_B1) / r_A2_B1 ! 5th descriptor wrt A2 - descriptor_out%x(i_desc)%grad_data(6,:,2) = -descriptor_out%x(i_desc)%grad_data(6,:,3) ! 5th descriptor wrt B1 - - endif - enddo - enddo - - deallocate(AB_monomer_index) - call system_timer('AB_dimer_calc') - - endsubroutine AB_dimer_calc - - subroutine bond_real_space_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(bond_real_space), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - type(atoms) :: at_copy - logical :: my_do_descriptor, my_do_grad_descriptor - integer :: n_descriptors, n_cross, i_desc, i, j, n, k, m, m_index, l, & - ij_neighbours, n_index - integer, dimension(3) :: shift_j, shift_k - real(dp) :: r_ij, r_ijk - real(dp) :: atom_i(3), atom_j(3), atom_k(3), bond(3), bond_len - real(dp) :: atom_i_cross_atom_j(3), atom_i_normsq_min_atom_j_normsq - real(dp), allocatable :: r(:,:), z(:), c(:) - real(dp) :: self_overlap - real(dp), allocatable :: dr(:,:,:,:), dz(:,:,:), dc(:,:,:) - real(dp), allocatable :: dself_overlap(:,:) - integer, allocatable :: ii(:) - real(dp), allocatable :: pos(:,:) - real(dp) :: r_m_cross_r_l(3) - - INIT_ERROR(error) - - call system_timer('bond_real_space_calc') - - if(.not. this%initialised) then - RAISE_ERROR("bond_real_space_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - call finalise(descriptor_out) - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='bond_real_space_calc args_str')) then - RAISE_ERROR("bond_real_space_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("bond_real_space_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - RAISE_ERROR("bond_real_space_calc cannot use atom masks yet.",error) - else - atom_mask_pointer => null() - endif - - endif - - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - - allocate(descriptor_out%x(n_descriptors)) - - i_desc = 0 - - do i = 1, at%N - do n = 1, n_neighbours(at, i) - j = neighbour(at, i, n, shift=shift_j, distance=r_ij, max_dist=this%bond_cutoff) - - if(j == 0) cycle - - i_desc = i_desc + 1 - - atom_i = at%pos(:,i) - atom_j = at%pos(:,j) + matmul(at%lattice, shift_j) - - at_copy = at - call add_atoms(at_copy, 0.5_dp * (atom_i + atom_j), 1) - call calc_connect(at_copy) - - ij_neighbours = 0 - - do m = 1, n_neighbours(at_copy, at%N + 1) - k = neighbour(at_copy, at%N + 1, m, max_dist=this%cutoff) - - if(k == 0) cycle - - if(at_copy%pos(:,k) .feq. at_copy%pos(:,at%N + 1)) cycle - - ij_neighbours = ij_neighbours + 1 - enddo - - if(ij_neighbours > this%max_neighbours) then - RAISE_ERROR("bond_real_space_calc: number of neighbours exceeds max_neighbours", error) - endif - - if(my_do_descriptor .or. my_do_grad_descriptor) then - allocate(r(3,ij_neighbours), z(ij_neighbours), c(ij_neighbours)) - allocate(ii(ij_neighbours), pos(3,ij_neighbours)) - - r = 0.0_dp - z = 0.0_dp - c = 0.0_dp - self_overlap = 0.0_dp - bond = atom_i - atom_j - bond_len = norm(bond) - atom_i_cross_atom_j = atom_i .cross. atom_j - atom_i_normsq_min_atom_j_normsq = normsq(atom_i) - normsq(atom_j) - ii = 0 - pos = 0.0_dp - - if(my_do_grad_descriptor) then - allocate(dr(3,ij_neighbours,3,ij_neighbours), dz(ij_neighbours,3,ij_neighbours), dc(ij_neighbours,3,ij_neighbours), dself_overlap(3,ij_neighbours)) - - dr = 0.0_dp - dz = 0.0_dp - dc = 0.0_dp - dself_overlap = 0.0_dp - endif - - m_index = 2 - - do m = 1, n_neighbours(at_copy, at%N + 1) - k = neighbour(at_copy, at%N + 1, m, shift=shift_k, distance=r_ijk, max_dist=this%cutoff) - - if(k == 0) cycle - - if(at_copy%pos(:,k) .feq. at_copy%pos(:,at%N + 1)) cycle - - atom_k = at_copy%pos(:,k) + matmul(at_copy%lattice, shift_k) - - if(atom_k .feq. atom_i) then - ! r remains zero - z(1) = 0.5_dp * bond_len - c(1) = coordination_function(r_ijk, this%cutoff, this%transition_width) - - ii(1) = k - pos(:,1) = atom_k - - if(my_do_grad_descriptor) then - ! dr remains zero - dz(1,:,1) = 0.5_dp * bond / bond_len - dz(1,:,2) = - dz(1,:,1) - dc(1,:,1) = 0.25_dp * dcoordination_function(r_ijk, this%cutoff, this%transition_width) * bond / r_ijk - dc(1,:,2) = - dc(1,:,1) - endif - elseif(atom_k .feq. atom_j) then - ! r remain zero - z(2) = -0.5_dp * bond_len - c(2) = coordination_function(r_ijk, this%cutoff, this%transition_width) - - ii(2) = k - pos(:,2) = atom_k - - if(my_do_grad_descriptor) then - ! dr remains zero - dz(2,:,1) = -0.5_dp * bond / bond_len - dz(2,:,2) = - dz(2,:,1) - dc(2,:,1) = -0.25_dp * dcoordination_function(r_ijk, this%cutoff, this%transition_width) * bond / r_ijk - dc(2,:,2) = - dc(2,:,1) - endif - else - m_index = m_index + 1 - - r(:,m_index) = ((atom_k .cross. bond) + atom_i_cross_atom_j) / bond_len - z(m_index) = ((atom_k .dot. bond) - 0.5_dp * atom_i_normsq_min_atom_j_normsq) / bond_len - c(m_index) = coordination_function(r_ijk, this%cutoff, this%transition_width) - - ii(m_index) = k - pos(:,m_index) = atom_k - - if(my_do_grad_descriptor) then - dr(:,m_index,1,1) = ((/ 0.0_dp, atom_k(3) - atom_j(3), atom_j(2) - atom_k(2) /) / bond_len) - (r(:,m_index) * bond(1) / bond_len**2) - dr(:,m_index,2,1) = ((/ atom_j(3) - atom_k(3), 0.0_dp, atom_k(1) - atom_j(1) /) / bond_len) - (r(:,m_index) * bond(2) / bond_len**2) - dr(:,m_index,3,1) = ((/ atom_k(2) - atom_j(2), atom_j(1) - atom_k(1), 0.0_dp /) / bond_len) - (r(:,m_index) * bond(3) / bond_len**2) - dz(m_index,:,1) = ((atom_k - atom_i) / bond_len) - (z(m_index) * bond / bond_len**2) - dc(m_index,:,1) = -0.5_dp * dcoordination_function(r_ijk, this%cutoff, this%transition_width) * (atom_k - at_copy%pos(:,at%N + 1)) / r_ijk - - dr(:,m_index,1,2) = - dr(:,m_index,1,1) + ((/ 0.0_dp, bond(3), - bond(2) /) / bond_len) - dr(:,m_index,2,2) = - dr(:,m_index,2,1) + ((/ - bond(3), 0.0_dp, bond(1) /) / bond_len) - dr(:,m_index,3,2) = - dr(:,m_index,3,1) + ((/ bond(2), - bond(1), 0.0_dp /) / bond_len) - dz(m_index,:,2) = - dz(m_index,:,1) - (bond / bond_len) - dc(m_index,:,2) = dc(m_index,:,1) - - dr(:,m_index,1,m_index) = (/ 0.0_dp, - bond(3), bond(2) /) / bond_len - dr(:,m_index,2,m_index) = (/ bond(3), 0.0_dp, - bond(1) /) / bond_len - dr(:,m_index,3,m_index) = (/ - bond(2), bond(1), 0.0_dp /) / bond_len - dz(m_index,:,m_index) = bond / bond_len - dc(m_index,:,m_index) = -2.0_dp * dc(m_index,:,1) - endif - endif - enddo - endif - - if(my_do_descriptor) then - allocate(descriptor_out%x(i_desc)%data(2 + (1 + 2 * this%max_neighbours) * this%max_neighbours)) - allocate(descriptor_out%x(i_desc)%ci(n_index)) - - descriptor_out%x(i_desc)%data = 0.0_dp - - do m = 1, ij_neighbours - self_overlap = self_overlap + c(m)**2 - - if(m == 1) then - descriptor_out%x(i_desc)%data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * m)) = z(m) - elseif(m == 2) then - descriptor_out%x(i_desc)%data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * m)) = z(m) - - self_overlap = self_overlap + 2.0_dp * c(m) * c(m - 1) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,m - 1)) / this%atom_sigma**2 ) - else - do l = 3, ij_neighbours - if(l == m) then - descriptor_out%x(i_desc)%data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1) = normsq(r(:,m)) - descriptor_out%x(i_desc)%data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l)) = z(m) - else - descriptor_out%x(i_desc)%data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1) = r(:,m) .dot. r(:,l) - descriptor_out%x(i_desc)%data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l)) = ((r(:,m) .cross. r(:,l)) .dot. bond) / bond_len - endif - - if(l < m) then - self_overlap = self_overlap + 2.0_dp * c(m) * c(l) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,l)) / this%atom_sigma**2 ) - endif - enddo - endif - enddo - - descriptor_out%x(i_desc)%data(1) = real(ij_neighbours, dp) - - descriptor_out%x(i_desc)%data(2) = self_overlap - - descriptor_out%x(i_desc)%data(3:ij_neighbours + 2) = c - - descriptor_out%x(i_desc)%covariance_cutoff = coordination_function(r_ij, this%bond_cutoff, this%bond_transition_width) - - descriptor_out%x(i_desc)%ci(:) = (/ i, j /) - descriptor_out%x(i_desc)%has_data = .true. - endif - - if(my_do_grad_descriptor) then - allocate(descriptor_out%x(i_desc)%grad_data(2 + (1 + 2 * ij_neighbours) * ij_neighbours,3,ij_neighbours)) - allocate(descriptor_out%x(i_desc)%ii(ij_neighbours)) - allocate(descriptor_out%x(i_desc)%pos(3,ij_neighbours)) - allocate(descriptor_out%x(i_desc)%grad_covariance_cutoff(3,ij_neighbours)) - allocate(descriptor_out%x(i_desc)%has_grad_data(ij_neighbours)) - - descriptor_out%x(i_desc)%grad_data = 0.0_dp - - do m = 1, ij_neighbours - dself_overlap(:,1) = dself_overlap(:,1) + 2.0_dp * c(m) * dc(m,:,1) - dself_overlap(:,2) = dself_overlap(:,2) + 2.0_dp * c(m) * dc(m,:,2) - - if(m == 1) then - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * m),:,1) = dz(m,:,1) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * m),:,2) = dz(m,:,2) - elseif(m == 2) then - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * m),:,1) = dz(m,:,1) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * m),:,2) = dz(m,:,2) - - dself_overlap(:,1) = dself_overlap(:,1) + 2.0_dp * dc(m,:,1) * c(m - 1) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,m - 1)) / this%atom_sigma**2 ) \ - + 2.0_dp * c(m) * dc(m - 1,:,1) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,m - 1)) / this%atom_sigma**2 ) \ - + c(m) * c(m - 1) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,m - 1)) / this%atom_sigma**2 ) \ - * (pos(:,m) - pos(:,m - 1)) / this%atom_sigma**2 - dself_overlap(:,2) = dself_overlap(:,2) + 2.0_dp * dc(m,:,2) * c(m - 1) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,m - 1)) / this%atom_sigma**2 ) \ - + 2.0_dp * c(m) * dc(m - 1,:,2) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,m - 1)) / this%atom_sigma**2 ) \ - + c(m) * c(m - 1) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,m - 1)) / this%atom_sigma**2 ) \ - * (pos(:,m - 1) - pos(:,m)) / this%atom_sigma**2 - else - dself_overlap(:,m) = dself_overlap(:,m) + 2.0_dp * c(m) * dc(m,:,m) - - do l = 3, ij_neighbours - if(l == m) then - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1,1,1) = 2.0_dp * (r(:,m) .dot. dr(:,m,1,1)) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1,2,1) = 2.0_dp * (r(:,m) .dot. dr(:,m,2,1)) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1,3,1) = 2.0_dp * (r(:,m) .dot. dr(:,m,3,1)) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l),:,1) = dz(m,:,1) - - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1,1,2) = 2.0_dp * (r(:,m) .dot. dr(:,m,1,2)) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1,2,2) = 2.0_dp * (r(:,m) .dot. dr(:,m,2,2)) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1,3,2) = 2.0_dp * (r(:,m) .dot. dr(:,m,3,2)) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l),:,2) = dz(m,:,2) - - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1,1,m) = 2.0_dp * (r(:,m) .dot. dr(:,m,1,m)) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1,2,m) = 2.0_dp * (r(:,m) .dot. dr(:,m,2,m)) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1,3,m) = 2.0_dp * (r(:,m) .dot. dr(:,m,3,m)) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l),:,m) = dz(m,:,m) - else - r_m_cross_r_l = r(:,m) .cross. r(:,l) - - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1,1,1) = (dr(:,m,1,1) .dot. r(:,l)) + (r(:,m) .dot. dr(:,l,1,1)) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1,2,1) = (dr(:,m,2,1) .dot. r(:,l)) + (r(:,m) .dot. dr(:,l,2,1)) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1,3,1) = (dr(:,m,3,1) .dot. r(:,l)) + (r(:,m) .dot. dr(:,l,3,1)) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l),1,1) = ((((dr(:,m,1,1) .cross. r(:,l)) + (r(:,m) .cross. dr(:,l,1,1))) .dot. bond) + (r_m_cross_r_l .dot. ((/ 1.0_dp, 0.0_dp, 0.0_dp /) - (bond * bond(1) / bond_len**2)))) / bond_len - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l),2,1) = ((((dr(:,m,2,1) .cross. r(:,l)) + (r(:,m) .cross. dr(:,l,2,1))) .dot. bond) + (r_m_cross_r_l .dot. ((/ 0.0_dp, 1.0_dp, 0.0_dp /) - (bond * bond(2) / bond_len**2)))) / bond_len - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l),3,1) = ((((dr(:,m,3,1) .cross. r(:,l)) + (r(:,m) .cross. dr(:,l,3,1))) .dot. bond) + (r_m_cross_r_l .dot. ((/ 0.0_dp, 0.0_dp, 1.0_dp /) - (bond * bond(3) / bond_len**2)))) / bond_len - - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1,1,2) = (dr(:,m,1,2) .dot. r(:,l)) + (r(:,m) .dot. dr(:,l,1,2)) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1,2,2) = (dr(:,m,2,2) .dot. r(:,l)) + (r(:,m) .dot. dr(:,l,2,2)) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1,3,2) = (dr(:,m,3,2) .dot. r(:,l)) + (r(:,m) .dot. dr(:,l,3,2)) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l),1,2) = ((((dr(:,m,1,2) .cross. r(:,l)) + (r(:,m) .cross. dr(:,l,1,2))) .dot. bond) + (r_m_cross_r_l .dot. ((/ -1.0_dp, 0.0_dp, 0.0_dp /) + (bond * bond(1) / bond_len**2)))) / bond_len - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l),2,2) = ((((dr(:,m,2,2) .cross. r(:,l)) + (r(:,m) .cross. dr(:,l,2,2))) .dot. bond) + (r_m_cross_r_l .dot. ((/ 0.0_dp, -1.0_dp, 0.0_dp /) + (bond * bond(2) / bond_len**2)))) / bond_len - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l),3,2) = ((((dr(:,m,3,2) .cross. r(:,l)) + (r(:,m) .cross. dr(:,l,3,2))) .dot. bond) + (r_m_cross_r_l .dot. ((/ 0.0_dp, 0.0_dp, -1.0_dp /) + (bond * bond(3) / bond_len**2)))) / bond_len - - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1,1,m) = dr(:,m,1,m) .dot. r(:,l) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1,2,m) = dr(:,m,2,m) .dot. r(:,l) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1,3,m) = dr(:,m,3,m) .dot. r(:,l) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l),1,m) = ((dr(:,m,1,m) .cross. r(:,l)) .dot. bond) / bond_len - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l),2,m) = ((dr(:,m,2,m) .cross. r(:,l)) .dot. bond) / bond_len - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l),3,m) = ((dr(:,m,3,m) .cross. r(:,l)) .dot. bond) / bond_len - - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1,1,l) = r(:,m) .dot. dr(:,l,1,l) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1,2,l) = r(:,m) .dot. dr(:,l,2,l) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l) - 1,3,l) = r(:,m) .dot. dr(:,l,3,l) - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l),1,l) = ((r(:,m) .cross. dr(:,l,1,l)) .dot. bond) / bond_len - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l),2,l) = ((r(:,m) .cross. dr(:,l,2,l)) .dot. bond) / bond_len - descriptor_out%x(i_desc)%grad_data(2 + ij_neighbours + (2 * (m - 1) * ij_neighbours) + (2 * l),3,l) = ((r(:,m) .cross. dr(:,l,3,l)) .dot. bond) / bond_len - endif - - if(l < m) then - dself_overlap(:,m) = dself_overlap(:,m) + 2.0_dp * dc(m,:,m) * c(l) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,l)) / this%atom_sigma**2 ) \ - + c(m) * c(l) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,l)) / this%atom_sigma**2 ) \ - * (pos(:,l) - pos(:,m)) / this%atom_sigma**2 - - if(l == 1) then - dself_overlap(:,1) = dself_overlap(:,1) + 2.0_dp * dc(m,:,1) * c(l) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,l)) / this%atom_sigma**2 ) \ - + 2.0_dp * c(m) * dc(l,:,1) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,l)) / this%atom_sigma**2 ) \ - + c(m) * c(l) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,l)) / this%atom_sigma**2 ) \ - * (pos(:,m) - pos(:,l)) / this%atom_sigma**2 - dself_overlap(:,2) = dself_overlap(:,2) + 2.0_dp * dc(m,:,2) * c(l) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,l)) / this%atom_sigma**2 ) \ - + 2.0_dp * c(m) * dc(l,:,2) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,l)) / this%atom_sigma**2 ) - elseif(l == 2) then - dself_overlap(:,1) = dself_overlap(:,1) + 2.0_dp * dc(m,:,1) * c(l) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,l)) / this%atom_sigma**2 ) \ - + 2.0_dp * c(m) * dc(l,:,1) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,l)) / this%atom_sigma**2 ) - dself_overlap(:,2) = dself_overlap(:,2) + 2.0_dp * dc(m,:,2) * c(l) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,l)) / this%atom_sigma**2 ) \ - + 2.0_dp * c(m) * dc(l,:,2) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,l)) / this%atom_sigma**2 ) \ - + c(m) * c(l) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,l)) / this%atom_sigma**2 ) \ - * (pos(:,m) - pos(:,l)) / this%atom_sigma**2 - else - dself_overlap(:,1) = dself_overlap(:,1) + 2.0_dp * dc(m,:,1) * c(l) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,l)) / this%atom_sigma**2 ) \ - + 2.0_dp * c(m) * dc(l,:,1) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,l)) / this%atom_sigma**2 ) - dself_overlap(:,2) = dself_overlap(:,2) + 2.0_dp * dc(m,:,2) * c(l) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,l)) / this%atom_sigma**2 ) \ - + 2.0_dp * c(m) * dc(l,:,2) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,l)) / this%atom_sigma**2 ) - dself_overlap(:,l) = dself_overlap(:,l) + 2.0_dp * c(m) * dc(l,:,l) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,l)) / this%atom_sigma**2 ) \ - + c(m) * c(l) * exp( -0.25_dp * normsq(pos(:,m) - pos(:,l)) / this%atom_sigma**2 ) \ - * (pos(:,m) - pos(:,l)) / this%atom_sigma**2 - endif - endif - enddo - endif - enddo - - !descriptor_out%x(i_desc)%grad_data(1,:,:) = 0.0_dp - - descriptor_out%x(i_desc)%grad_data(2,:,:) = dself_overlap - - descriptor_out%x(i_desc)%grad_data(3:ij_neighbours + 2,:,:) = dc - - descriptor_out%x(i_desc)%ii = ii - descriptor_out%x(i_desc)%pos = pos - - descriptor_out%x(i_desc)%grad_covariance_cutoff = 0.0_dp - - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,1) = dcoordination_function(r_ij, this%bond_cutoff, this%bond_transition_width) * bond / r_ij - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,2) = - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,1) - - descriptor_out%x(i_desc)%has_grad_data = .true. - endif - - if(my_do_descriptor .or. my_do_grad_descriptor) then - deallocate(r, z, c) - deallocate(ii, pos) - - if(my_do_grad_descriptor) then - deallocate(dr, dz, dc, dself_overlap) - endif - endif - - call finalise(at_copy) - enddo - enddo - - call system_timer('bond_real_space_calc') - - endsubroutine bond_real_space_calc - - subroutine atom_real_space_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(atom_real_space), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor - integer :: d, grad_d, n_descriptors, n_cross, descriptor_mould_size, & - i_desc, i_data, i, j, k, n, l, m, l_n_neighbours, i_n, n_index - - real(dp) :: r - real(dp), dimension(3) :: diff - real(dp), dimension(1) :: descriptor_mould - integer, dimension(3) :: shift - - complex(dp), dimension(:), allocatable :: spherical_harmonics - complex(dp), dimension(:,:), allocatable :: grad_spherical_harmonics - - INIT_ERROR(error) - - call system_timer('atom_real_space_calc') - - if(.not. this%initialised) then - RAISE_ERROR("atom_real_space_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - call finalise(descriptor_out) - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='atom_real_space_calc args_str')) then - RAISE_ERROR("atom_real_space_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("atom_real_space_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - RAISE_ERROR("atom_real_space_calc cannot use atom masks yet.",error) - else - atom_mask_pointer => null() - endif - - endif - - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - - allocate(descriptor_out%x(n_descriptors)) - - i_desc = 0 - do i = 1, at%N - i_desc = i_desc + 1 - - l_n_neighbours = n_neighbours(at,i,max_dist=this%cutoff) - d = ( 2 * (this%l_max+1)**2 + 2 ) * l_n_neighbours - - if(my_do_descriptor) then - allocate(descriptor_out%x(i_desc)%data(d)) - descriptor_out%x(i_desc)%data = 0.0_dp - allocate(descriptor_out%x(i_desc)%ci(n_index)) - descriptor_out%x(i_desc)%has_data = .false. - descriptor_out%x(i_desc)%covariance_cutoff = 1.0_dp - endif - if(my_do_grad_descriptor) then - grad_d = 2 * (this%l_max+1)**2 + 2 - - allocate(descriptor_out%x(i_desc)%grad_data(d,3,1:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%ii(1:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%pos(3,1:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%has_grad_data(1:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_data = 0.0_dp - descriptor_out%x(i_desc)%ii = 0 - descriptor_out%x(i_desc)%pos = 0.0_dp - descriptor_out%x(i_desc)%has_grad_data = .false. - - allocate(descriptor_out%x(i_desc)%grad_covariance_cutoff(3,1:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_covariance_cutoff = 0.0_dp - endif - enddo - - allocate(spherical_harmonics(-this%l_max:this%l_max)) - if( my_do_grad_descriptor ) allocate(grad_spherical_harmonics(3,-this%l_max:this%l_max)) - - i_desc = 0 - do i = 1, at%N - i_desc = i_desc + 1 - i_data = 0 - i_n = 0 - - if(my_do_descriptor) then - descriptor_out%x(i_desc)%ci(1) = i - descriptor_out%x(i_desc)%has_data = .true. - endif - - if(my_do_grad_descriptor) then - !descriptor_out%x(i_desc)%ii(0) = i - !descriptor_out%x(i_desc)%pos(:,0) = at%pos(:,i) - !descriptor_out%x(i_desc)%has_grad_data(0) = .true. - endif - - do n = 1, n_neighbours(at,i) - - j = neighbour(at,i,n,distance = r, diff = diff, shift=shift) - if(r >= this%cutoff) cycle - i_n = i_n + 1 - - i_data = i_data + 1 - if(my_do_descriptor) then - descriptor_out%x(i_desc)%data(i_data) = r - endif - if(my_do_grad_descriptor) then - descriptor_out%x(i_desc)%ii(i_n) = j - descriptor_out%x(i_desc)%pos(:,i_n) = at%pos(:,j) + matmul(at%lattice,shift) - descriptor_out%x(i_desc)%has_grad_data(i_n) = .true. - descriptor_out%x(i_desc)%grad_data(i_data,:,i_n) = diff / r - endif - - i_data = i_data + 1 - if(my_do_descriptor) descriptor_out%x(i_desc)%data(i_data) = real(i_n,dp) - if(my_do_grad_descriptor) descriptor_out%x(i_desc)%grad_data(i_data,:,i_n) = real(i_n,dp) - - do l = 0, this%l_max - descriptor_mould_size = size(transfer(spherical_harmonics(-l:l),descriptor_mould)) - - do m = -l, l - if(my_do_descriptor) spherical_harmonics(m) = SphericalYCartesian(l,m,diff) - if(my_do_grad_descriptor) grad_spherical_harmonics(:,m) = GradSphericalYCartesian(l,m,diff) - enddo - - if(my_do_descriptor) then - descriptor_out%x(i_desc)%data(i_data+1:i_data+descriptor_mould_size) = transfer(spherical_harmonics(-l:l),descriptor_mould) - endif - - if(my_do_grad_descriptor) then - do k = 1, 3 - descriptor_out%x(i_desc)%grad_data(i_data+1:i_data+descriptor_mould_size,k,i_n) = & - transfer(grad_spherical_harmonics(k,-l:l),descriptor_mould) - enddo - endif - - i_data = i_data + descriptor_mould_size - - enddo - enddo - enddo - - if(allocated(spherical_harmonics)) deallocate(spherical_harmonics) - if(allocated(grad_spherical_harmonics)) deallocate(grad_spherical_harmonics) - - call system_timer('atom_real_space_calc') - - endsubroutine atom_real_space_calc - - subroutine power_so3_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(power_so3), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - type(cplx_1d), dimension(:), allocatable :: SphericalY_ij - type(cplx_1d), dimension(:,:), allocatable :: fourier_so3 - - type(cplx_2d), dimension(:), allocatable :: dSphericalY_ij - type(cplx_2d), dimension(:,:,:), allocatable :: dfourier_so3 - - logical :: my_do_descriptor, my_do_grad_descriptor - integer :: d, i, j, n, a, l, m, i_desc, i_pow, l_n_neighbours, n_i, & - n_descriptors, n_cross, n_index - integer, dimension(3) :: shift_ij - real(dp) :: r_ij - real(dp), dimension(3) :: u_ij, d_ij - real(dp), dimension(:), allocatable :: Rad_ij - real(dp), dimension(:,:), allocatable :: dRad_ij - integer, dimension(total_elements) :: species_map - - INIT_ERROR(error) - - call system_timer('power_so3_calc') - - if(.not. this%initialised) then - RAISE_ERROR("power_so3_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='power_so3_calc args_str')) then - RAISE_ERROR("power_so3_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("power_so3_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - else - atom_mask_pointer => null() - endif - - endif - - species_map = 0 - do i = 1, size(this%species_Z) - if(this%species_Z(i) == 0) then - species_map = 1 - else - species_map(this%species_Z(i)) = i - endif - enddo - - call finalise(descriptor_out) - - d = power_so3_dimensions(this,error) - - if(associated(atom_mask_pointer)) then - call descriptor_sizes(this,at,n_descriptors,n_cross,& - mask=atom_mask_pointer,n_index=n_index,error=error) - else - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - endif - - allocate(descriptor_out%x(n_descriptors)) - - i_desc = 0 - do i = 1, at%N - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - if(associated(atom_mask_pointer)) then - if(.not. atom_mask_pointer(i)) cycle - endif - i_desc = i_desc + 1 - - if(my_do_descriptor) then - allocate(descriptor_out%x(i_desc)%data(d)) - descriptor_out%x(i_desc)%data = 0.0_dp - descriptor_out%x(i_desc)%has_data = .false. - allocate(descriptor_out%x(i_desc)%ci(n_index)) - descriptor_out%x(i_desc)%covariance_cutoff = 1.0_dp - endif - if(my_do_grad_descriptor) then - l_n_neighbours = n_neighbours(at,i,max_dist=this%cutoff) - - allocate(descriptor_out%x(i_desc)%grad_data(d,3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%ii(0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%pos(3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%has_grad_data(0:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_data = 0.0_dp - descriptor_out%x(i_desc)%ii = 0 - descriptor_out%x(i_desc)%pos = 0.0_dp - descriptor_out%x(i_desc)%has_grad_data = .false. - - allocate(descriptor_out%x(i_desc)%grad_covariance_cutoff(3,0:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_covariance_cutoff = 0.0_dp - endif - enddo - - allocate(fourier_so3(0:this%l_max,this%n_max),SphericalY_ij(0:this%l_max),Rad_ij(this%n_max)) - do a = 1, this%n_max - do l = 0, this%l_max - allocate(fourier_so3(l,a)%m(-l:l)) - fourier_so3(l,a)%m(:) = CPLX_ZERO - enddo - enddo - do l = 0, this%l_max - allocate(SphericalY_ij(l)%m(-l:l)) - enddo - - if(my_do_grad_descriptor) then - allocate( dRad_ij(3,this%n_max), dSphericalY_ij(0:this%l_max) ) - do l = 0, this%l_max - allocate(dSphericalY_ij(l)%mm(3,-l:l)) - enddo - endif - - i_desc = 0 - do i = 1, at%N - - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - if(associated(atom_mask_pointer)) then - if(.not. atom_mask_pointer(i)) cycle - endif - i_desc = i_desc + 1 - - if(my_do_descriptor) then - descriptor_out%x(i_desc)%ci(1) = i - descriptor_out%x(i_desc)%has_data = .true. - endif - do a = 1, this%n_max - do l = 0, this%l_max - fourier_so3(l,a)%m(:) = CPLX_ZERO - enddo - enddo - - if(my_do_grad_descriptor) then - allocate( dfourier_so3(0:this%l_max,this%n_max,0:n_neighbours(at,i,max_dist=this%cutoff)) ) - do n = 0, n_neighbours(at,i,max_dist=this%cutoff) - do a = 1, this%n_max - do l = 0, this%l_max - allocate(dfourier_so3(l,a,n)%mm(3,-l:l)) - dfourier_so3(l,a,n)%mm(:,:) = CPLX_ZERO - enddo - enddo - enddo - descriptor_out%x(i_desc)%ii(0) = i - descriptor_out%x(i_desc)%pos(:,0) = at%pos(:,i) - descriptor_out%x(i_desc)%has_grad_data(0) = .true. - endif - - n_i = 0 - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij, cosines=u_ij, diff=d_ij, shift=shift_ij) - if( r_ij >= this%cutoff ) cycle - - n_i = n_i + 1 - if(my_do_grad_descriptor) then - descriptor_out%x(i_desc)%ii(n_i) = j - descriptor_out%x(i_desc)%pos(:,n_i) = at%pos(:,j) + matmul(at%lattice,shift_ij) - descriptor_out%x(i_desc)%has_grad_data(n_i) = .true. - endif - - do a = 1, this%n_max - Rad_ij(a) = RadialFunction(this%Radial, r_ij, a) - if(my_do_grad_descriptor) dRad_ij(:,a) = GradRadialFunction(this%Radial, r_ij, a) * u_ij - enddo - - do l = 0, this%l_max - do m = -l, l - SphericalY_ij(l)%m(m) = SphericalYCartesian(l,m,d_ij) - if(my_do_grad_descriptor) dSphericalY_ij(l)%mm(:,m) = GradSphericalYCartesian(l,m,d_ij) - enddo - enddo - - do a = 1, this%n_max - do l = 0, this%l_max - do m = -l, l - fourier_so3(l,a)%m(m) = fourier_so3(l,a)%m(m) + Rad_ij(a)*SphericalY_ij(l)%m(m) - if(my_do_grad_descriptor) then - dfourier_so3(l,a,n_i)%mm(:,m) = dfourier_so3(l,a,n_i)%mm(:,m) + & - dRad_ij(:,a) * SphericalY_ij(l)%m(m) + Rad_ij(a)*dSphericalY_ij(l)%mm(:,m) - endif - enddo - enddo - enddo - - enddo ! n - - if(my_do_descriptor) then - i_pow = 0 - do a = 1, this%n_max - do l = 0, this%l_max - i_pow = i_pow + 1 - - descriptor_out%x(i_desc)%data(i_pow) = dot_product(fourier_so3(l,a)%m,fourier_so3(l,a)%m) - enddo - enddo - endif - - if(my_do_grad_descriptor) then - do n = 1, n_neighbours(at,i,max_dist=this%cutoff) - i_pow = 0 - do a = 1, this%n_max - do l = 0, this%l_max - i_pow = i_pow + 1 - - descriptor_out%x(i_desc)%grad_data(i_pow,:,n) = 2.0_dp * matmul(conjg(dfourier_so3(l,a,n)%mm(:,:)),fourier_so3(l,a)%m(:)) - enddo - enddo - descriptor_out%x(i_desc)%grad_data(:,:,0) = descriptor_out%x(i_desc)%grad_data(:,:,0) - descriptor_out%x(i_desc)%grad_data(:,:,n) - enddo - endif - - if(allocated(dfourier_so3)) then - do n = lbound(dfourier_so3,3), ubound(dfourier_so3,3) - do a = lbound(dfourier_so3,2), ubound(dfourier_so3,2) - do l = lbound(dfourier_so3,1), ubound(dfourier_so3,1) - deallocate(dfourier_so3(l,a,n)%mm) - enddo - enddo - enddo - deallocate(dfourier_so3) - endif - - enddo ! i - - if(allocated(Rad_ij)) deallocate(Rad_ij) - if(allocated(dRad_ij)) deallocate(dRad_ij) - - if(allocated(fourier_so3)) then - do a = lbound(fourier_so3,2), ubound(fourier_so3,2) - do l = lbound(fourier_so3,1), ubound(fourier_so3,1) - deallocate(fourier_so3(l,a)%m) - enddo - enddo - deallocate(fourier_so3) - endif - - if(allocated(SphericalY_ij)) then - do l = lbound(SphericalY_ij,1), ubound(SphericalY_ij,1) - deallocate(SphericalY_ij(l)%m) - enddo - deallocate(SphericalY_ij) - endif - - if(allocated(dSphericalY_ij)) then - do l = lbound(dSphericalY_ij,1), ubound(dSphericalY_ij,1) - deallocate(dSphericalY_ij(l)%mm) - enddo - deallocate(dSphericalY_ij) - endif - - call system_timer('power_so3_calc') - - endsubroutine power_so3_calc - - subroutine power_SO4_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(power_SO4), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(cplx_2d), dimension(:), allocatable :: U - type(cplx_3d), dimension(:,:), allocatable :: dU - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - real(dp), dimension(3) :: diff, u_ij - real(dp) :: r - integer :: i, n, n_i, ji, jn, k, j, i_desc, i_bisp, d, & - n_descriptors, n_cross, l_n_neighbours, n_index - integer, dimension(3) :: shift - integer, dimension(total_elements) :: species_map - logical :: my_do_descriptor, my_do_grad_descriptor - - INIT_ERROR(error) - - call system_timer('power_SO4_calc') - - if(.not. this%initialised) then - RAISE_ERROR("power_SO4_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - species_map = 0 - do i = 1, size(this%species_Z) - if(this%species_Z(i) == 0) then - species_map = 1 - else - species_map(this%species_Z(i)) = i - endif - enddo - - call finalise(descriptor_out) - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='power_SO4_calc args_str')) then - RAISE_ERROR("power_SO4_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("power_SO4_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - RAISE_ERROR("power_SO4_calc cannot use atom masks yet.",error) - else - atom_mask_pointer => null() - endif - - endif - - d = power_SO4_dimensions(this,error) - - if(associated(atom_mask_pointer)) then - call descriptor_sizes(this,at,n_descriptors,n_cross, & - mask=atom_mask_pointer,n_index=n_index,error=error) - else - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - endif - - allocate(descriptor_out%x(n_descriptors)) - - i_desc = 0 - do i = 1, at%N - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - - i_desc = i_desc + 1 - - if(my_do_descriptor) then - allocate(descriptor_out%x(i_desc)%data(d)) - descriptor_out%x(i_desc)%data = 0.0_dp - descriptor_out%x(i_desc)%has_data = .false. - allocate(descriptor_out%x(i_desc)%ci(n_index)) - descriptor_out%x(i_desc)%covariance_cutoff = 1.0_dp - endif - - if(my_do_grad_descriptor) then - l_n_neighbours = n_neighbours(at,i,max_dist=this%cutoff) - - allocate(descriptor_out%x(i_desc)%grad_data(d,3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%ii(0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%pos(3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%has_grad_data(0:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_data = 0.0_dp - descriptor_out%x(i_desc)%ii = 0 - descriptor_out%x(i_desc)%pos = 0.0_dp - descriptor_out%x(i_desc)%has_grad_data = .false. - - allocate(descriptor_out%x(i_desc)%grad_covariance_cutoff(3,0:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_covariance_cutoff = 0.0_dp - endif - - enddo - - i_desc = 0 - do i = 1, at%N - - if( associated(atom_mask_pointer) ) then - if( .not. atom_mask_pointer(i) ) cycle - endif - - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - i_desc = i_desc + 1 - - if(my_do_descriptor) then - descriptor_out%x(i_desc)%ci(1) = i - descriptor_out%x(i_desc)%has_data = .true. - endif - if(my_do_grad_descriptor) then - descriptor_out%x(i_desc)%ii(0) = i - descriptor_out%x(i_desc)%pos(:,0) = at%pos(:,i) - descriptor_out%x(i_desc)%has_grad_data(0) = .true. - endif - - n_i = 0 - do n = 1, n_neighbours(at,i) - ji = neighbour(at, i, n, jn=jn, distance=r, diff=diff, cosines=u_ij,shift=shift) - if( r >= this%cutoff ) cycle - - n_i = n_i + 1 - - if(my_do_grad_descriptor) then - descriptor_out%x(i_desc)%ii(n_i) = ji - descriptor_out%x(i_desc)%pos(:,n_i) = at%pos(:,ji) + matmul(at%lattice,shift) - descriptor_out%x(i_desc)%has_grad_data(n_i) = .true. - endif - enddo - - if(my_do_grad_descriptor) then - call fourier_SO4_calc(this%fourier_SO4,at,i,U,dU,args_str,error=error) - else - call fourier_SO4_calc(this%fourier_SO4,at,i,U,args_str=args_str,error=error) - endif - - if(my_do_descriptor) then - - i_bisp = 0 - do j = 0, this%j_max - i_bisp = i_bisp + 1 - descriptor_out%x(i_desc)%data(i_bisp) = sum( conjg(U(j)%mm)*U(j)%mm ) - enddo - endif - - if(my_do_grad_descriptor) then - n_i = 0 - do n = 1, n_neighbours(at,i) - ji = neighbour(at, i, n, distance=r) - if( r >= this%cutoff ) cycle - n_i = n_i + 1 - i_bisp = 0 - do j = 0, this%j_max - i_bisp = i_bisp + 1 - do k = 1, 3 - descriptor_out%x(i_desc)%grad_data(i_bisp,k,n_i) = 2.0_dp * sum( conjg(U(j)%mm)*dU(j,n_i)%mm(k,:,:) ) - enddo - enddo - enddo - descriptor_out%x(i_desc)%grad_data(:,:,0) = -sum(descriptor_out%x(i_desc)%grad_data(:,:,:), dim=3) - endif - - call finalise(dU) - enddo ! i - - ! clear U from the memory - call finalise(U) - - call system_timer('power_SO4_calc') - - endsubroutine power_SO4_calc - - subroutine soap_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type real_2d_array - type(real_2d), dimension(:,:,:), allocatable :: x - endtype real_2d_array - - type(soap), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - type(cplx_1d), dimension(:), allocatable, save :: SphericalY_ij - type(cplx_2d), dimension(:), allocatable, save :: grad_SphericalY_ij - - !SPEED type(cplx_1d), dimension(:,:,:), allocatable :: fourier_so3 - !SPEED type(cplx_2d), dimension(:,:,:), allocatable :: grad_fourier_so3 - type(real_1d), dimension(:,:,:), allocatable, save :: fourier_so3_r, fourier_so3_i, global_fourier_so3_r, global_fourier_so3_i - type(real_2d), dimension(:,:,:), allocatable :: grad_fourier_so3_r, grad_fourier_so3_i - real(dp), allocatable :: t_g_r(:,:), t_g_i(:,:), t_f_r(:,:), t_f_i(:,:), t_g_f_rr(:,:), t_g_f_ii(:,:) - integer :: alpha - - logical :: my_do_descriptor, my_do_grad_descriptor, do_two_l_plus_one - integer :: d, i, j, n, a, b, k, l, m, i_pow, i_coeff, l_n_neighbours, n_i, & - n_descriptors, n_cross, i_species, j_species, ia, jb, i_desc_i, & - xml_version, sum_l_n_neighbours, i_pair, i_pair_i, n_index - integer, dimension(3) :: shift_ij - integer, dimension(:), allocatable :: i_desc - integer, dimension(:,:), allocatable :: rs_index - real(dp) :: r_ij, arg_bess, mo_spher_bess_fi_ki_l, mo_spher_bess_fi_ki_lm, mo_spher_bess_fi_ki_lmm, mo_spher_bess_fi_ki_lp, & - exp_p, exp_m, f_cut, df_cut, norm_descriptor_i, radial_decay, dradial_decay, norm_radial_decay - real(dp), dimension(3) :: u_ij, d_ij - real(dp), dimension(:,:), allocatable, save :: radial_fun, radial_coefficient, grad_radial_fun, grad_radial_coefficient, grad_descriptor_i - real(dp), dimension(:), allocatable, save :: descriptor_i - real(dp), dimension(:), allocatable :: global_fourier_so3_r_array, global_fourier_so3_i_array - type(real_2d_array), dimension(:), allocatable :: global_grad_fourier_so3_r_array, global_grad_fourier_so3_i_array - integer, dimension(total_elements) :: species_map -!$omp threadprivate(radial_fun, radial_coefficient, grad_radial_fun, grad_radial_coefficient) -!$omp threadprivate(fourier_so3_r, fourier_so3_i) -!$omp threadprivate(SphericalY_ij,grad_SphericalY_ij) -!$omp threadprivate(descriptor_i, grad_descriptor_i) - - INIT_ERROR(error) - - call system_timer('soap_calc') - - if(.not. this%initialised) then - RAISE_ERROR("soap_calc: descriptor object not initialised", error) - endif - - species_map = 0 - do i_species = 1, this%n_species - if(this%species_Z(i_species) == 0) then - species_map = 1 - else - species_map(this%species_Z(i_species)) = i_species - endif - enddo - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - has_atom_mask_name = .false. - atom_mask_pointer => null() - xml_version = 1423143769 - - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is " // & - "true, descriptors are calculated.") - - call param_register(params, 'xml_version', '1423143769', xml_version, & - help_string="Version of GAP the XML potential file was created") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='soap_calc args_str')) then - RAISE_ERROR("soap_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("soap_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - else - atom_mask_pointer => null() - endif - - endif - - if( this%cutoff_dexp > 0 ) then - if( this%cutoff_rate == 0.0_dp ) then - norm_radial_decay = 1.0_dp - else - norm_radial_decay = this%cutoff_rate / ( 1.0_dp + this%cutoff_rate ) - endif - else - norm_radial_decay = 1.0_dp - endif - - do_two_l_plus_one = (xml_version >= 1423143769) - - allocate(rs_index(2,this%n_max*this%n_species)) - i = 0 - do i_species = 1, this%n_species - do a = 1, this%n_max - i = i + 1 - rs_index(:,i) = (/a,i_species/) - enddo - enddo - - call finalise(descriptor_out) - - d = soap_dimensions(this,error) - - if(associated(atom_mask_pointer)) then - call descriptor_sizes(this,at,n_descriptors,n_cross, & - mask=atom_mask_pointer,n_index=n_index,error=error) - else - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - endif - - allocate(descriptor_out%x(n_descriptors)) - allocate(i_desc(at%N)) - -!$omp parallel default(none) shared(this,my_do_grad_descriptor,d) private(i_species, a, l) - allocate(descriptor_i(d)) - if(my_do_grad_descriptor) allocate(grad_descriptor_i(d,3)) - - allocate(radial_fun(0:this%l_max, this%n_max), radial_coefficient(0:this%l_max, this%n_max)) - !SPEED allocate(fourier_so3(0:this%l_max,this%n_max,this%n_species), SphericalY_ij(0:this%l_max)) - allocate(fourier_so3_r(0:this%l_max,this%n_max,this%n_species), fourier_so3_i(0:this%l_max,this%n_max,this%n_species), SphericalY_ij(0:this%l_max)) - - if(my_do_grad_descriptor) then - allocate(grad_radial_fun(0:this%l_max, this%n_max), grad_radial_coefficient(0:this%l_max, this%n_max)) - allocate(grad_SphericalY_ij(0:this%l_max)) - endif - - do i_species = 1, this%n_species - do a = 1, this%n_max - do l = 0, this%l_max - !SPEED allocate(fourier_so3(l,a,i_species)%m(-l:l)) - !SPEED fourier_so3(l,a,i_species)%m(:) = CPLX_ZERO - allocate(fourier_so3_r(l,a,i_species)%m(-l:l)) - allocate(fourier_so3_i(l,a,i_species)%m(-l:l)) - fourier_so3_r(l,a,i_species)%m(:) = 0.0_dp - fourier_so3_i(l,a,i_species)%m(:) = 0.0_dp - enddo - enddo - enddo - - do l = 0, this%l_max - allocate(SphericalY_ij(l)%m(-l:l)) - if(my_do_grad_descriptor) allocate(grad_SphericalY_ij(l)%mm(3,-l:l)) - enddo -!$omp end parallel - - i_desc = 0 - i_desc_i = 0 - do i = 1, at%N - - if( .not. any( at%Z(i) == this%Z ) .and. .not. any(this%Z == 0) ) cycle - - if(associated(atom_mask_pointer)) then - if(.not. atom_mask_pointer(i)) cycle - endif - - i_desc_i = i_desc_i + 1 - i_desc(i) = i_desc_i - - if(.not. this%global) then ! atomic SOAP - if(my_do_descriptor) then - allocate(descriptor_out%x(i_desc_i)%data(d)) - !slow, no need - !descriptor_out%x(i_desc_i)%data = 0.0_dp - allocate(descriptor_out%x(i_desc_i)%ci(n_index)) - descriptor_out%x(i_desc_i)%has_data = .false. - descriptor_out%x(i_desc_i)%covariance_cutoff = 1.0_dp - endif - if(my_do_grad_descriptor) then - l_n_neighbours = n_neighbours(at,i,max_dist=this%cutoff) - - allocate(descriptor_out%x(i_desc_i)%grad_data(d,3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc_i)%ii(0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc_i)%pos(3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc_i)%has_grad_data(0:l_n_neighbours)) - ! slow, no need - ! descriptor_out%x(i_desc_i)%grad_data = 0.0_dp - descriptor_out%x(i_desc_i)%grad_data(:,:,0) = 0.0_dp - descriptor_out%x(i_desc_i)%ii = 0 - descriptor_out%x(i_desc_i)%pos = 0.0_dp - descriptor_out%x(i_desc_i)%has_grad_data = .false. - - allocate(descriptor_out%x(i_desc_i)%grad_covariance_cutoff(3,0:l_n_neighbours)) - descriptor_out%x(i_desc_i)%grad_covariance_cutoff = 0.0_dp - endif - endif - enddo - - allocate( & - global_fourier_so3_r_array((this%l_max+1)**2 * this%n_max * this%n_species), & - global_fourier_so3_i_array((this%l_max+1)**2 * this%n_max * this%n_species), & - global_grad_fourier_so3_r_array( count(i_desc/=0) ), & - global_grad_fourier_so3_i_array( count(i_desc/=0) ) ) - - - - if(this%global) then - if(my_do_descriptor) then - allocate(descriptor_out%x(1)%data(d)) - allocate(descriptor_out%x(1)%ci(n_index)) - if( any(this%Z == 0) ) then - descriptor_out%x(1)%ci(:) = (/ (i, i=1, at%N) /) - else - forall(i=1:at%N, any(at%Z(i) == this%Z)) descriptor_out%x(1)%ci(i_desc(i)) = i - endif - descriptor_out%x(1)%has_data = .true. - descriptor_out%x(1)%covariance_cutoff = 1.0_dp - endif ! my_do_descriptor - if(my_do_grad_descriptor) then - sum_l_n_neighbours = 0 - do i = 1, at%N - - if(i_desc(i) == 0) then - cycle - else - i_desc_i = i_desc(i) - endif - - l_n_neighbours = n_neighbours(at,i,max_dist=this%cutoff) - sum_l_n_neighbours = sum_l_n_neighbours + l_n_neighbours + 1 ! include central atom as well! - - allocate( & - global_grad_fourier_so3_r_array(i_desc_i)%x(0:this%l_max,this%n_max,l_n_neighbours), & - global_grad_fourier_so3_i_array(i_desc_i)%x(0:this%l_max,this%n_max,l_n_neighbours) ) - - do n_i = 1, l_n_neighbours - do a = 1, this%n_max - do l = 0, this%l_max - allocate( & - global_grad_fourier_so3_r_array(i_desc_i)%x(l,a,n_i)%mm(3,-l:l), & - global_grad_fourier_so3_i_array(i_desc_i)%x(l,a,n_i)%mm(3,-l:l) ) - global_grad_fourier_so3_r_array(i_desc_i)%x(l,a,n_i)%mm = 0.0_dp - global_grad_fourier_so3_i_array(i_desc_i)%x(l,a,n_i)%mm = 0.0_dp - enddo ! l - enddo ! a - enddo ! n_i - enddo ! i - - allocate(descriptor_out%x(1)%grad_data(d,3,sum_l_n_neighbours)) - allocate(descriptor_out%x(1)%ii(sum_l_n_neighbours)) - allocate(descriptor_out%x(1)%pos(3,sum_l_n_neighbours)) - allocate(descriptor_out%x(1)%has_grad_data(sum_l_n_neighbours)) - - allocate(descriptor_out%x(1)%grad_covariance_cutoff(3,sum_l_n_neighbours)) - descriptor_out%x(1)%grad_covariance_cutoff = 0.0_dp - endif ! my_do_grad_descriptor - - global_fourier_so3_r_array = 0.0_dp - global_fourier_so3_i_array = 0.0_dp - endif ! this%global - -!$omp parallel do schedule(dynamic) default(none) shared(this, at, descriptor_out, my_do_descriptor, my_do_grad_descriptor, d, i_desc, species_map, rs_index, do_two_l_plus_one) & -!$omp shared(global_grad_fourier_so3_r_array, global_grad_fourier_so3_i_array, norm_radial_decay) & -!$omp private(i, j, i_species, j_species, a, b, l, m, n, n_i, r_ij, u_ij, d_ij, shift_ij, i_pow, i_coeff, ia, jb, alpha, i_desc_i) & -!$omp private(grad_fourier_so3_r,grad_fourier_so3_i,t_g_r, t_g_i, t_f_r, t_f_i, t_g_f_rr, t_g_f_ii) & -!$omp private(f_cut, df_cut, arg_bess, exp_p, exp_m, mo_spher_bess_fi_ki_l, mo_spher_bess_fi_ki_lp, mo_spher_bess_fi_ki_lm, mo_spher_bess_fi_ki_lmm, norm_descriptor_i) & -!$omp private(radial_decay, dradial_decay) & -!$omp reduction(+:global_fourier_so3_r_array,global_fourier_so3_i_array) - do i = 1, at%N - - if(i_desc(i) == 0) then - cycle - else - i_desc_i = i_desc(i) - endif - - if(.not.this%global) then - if(my_do_descriptor) then - descriptor_out%x(i_desc_i)%ci(1) = i - descriptor_out%x(i_desc_i)%has_data = .true. - endif - if(my_do_grad_descriptor) then - descriptor_out%x(i_desc_i)%ii(0) = i - descriptor_out%x(i_desc_i)%pos(:,0) = at%pos(:,i) - descriptor_out%x(i_desc_i)%has_grad_data(0) = .true. - endif - endif - if(my_do_grad_descriptor) then - !SPEED allocate( grad_fourier_so3(0:this%l_max,this%n_max,n_neighbours(at,i,max_dist=this%cutoff)) ) - allocate( grad_fourier_so3_r(0:this%l_max,this%n_max,n_neighbours(at,i,max_dist=this%cutoff)) ) - allocate( grad_fourier_so3_i(0:this%l_max,this%n_max,n_neighbours(at,i,max_dist=this%cutoff)) ) - endif - - !do a = 1, this%n_max - ! radial_fun(0,a) = exp( -this%alpha * this%r_basis(a)**2 ) !* this%r_basis(a) - !enddo - !radial_coefficient(0,:) = matmul( radial_fun(0,:), this%transform_basis ) - radial_fun(0,:) = 0.0_dp - radial_fun(0,1) = 1.0_dp - radial_coefficient(0,:) = matmul( radial_fun(0,:), this%cholesky_overlap_basis) - - do i_species = 1, this%n_species - do a = 1, this%n_max - !SPEED fourier_so3(0,a,i_species)%m(0) = radial_coefficient(0,a) * SphericalYCartesian(0,0,(/0.0_dp, 0.0_dp, 0.0_dp/)) - if( this%central_reference_all_species .or. this%species_Z(i_species) == at%Z(i) .or. this%species_Z(i_species) == 0 ) then - fourier_so3_r(0,a,i_species)%m(0) = this%central_weight * real(radial_coefficient(0,a) * SphericalYCartesian(0,0,(/0.0_dp, 0.0_dp, 0.0_dp/)), dp) - fourier_so3_i(0,a,i_species)%m(0) = this%central_weight * aimag(radial_coefficient(0,a) * SphericalYCartesian(0,0,(/0.0_dp, 0.0_dp, 0.0_dp/))) - else - fourier_so3_i(0,a,i_species)%m(0) = 0.0_dp - fourier_so3_r(0,a,i_species)%m(0) = 0.0_dp - endif - - do l = 1, this%l_max - !SPEED fourier_so3(l,a,i_species)%m(:) = CPLX_ZERO - fourier_so3_r(l,a,i_species)%m(:) = 0.0_dp - fourier_so3_i(l,a,i_species)%m(:) = 0.0_dp - enddo - enddo - enddo - -! soap_calc 20 takes 0.0052 s -! call system_timer("soap_calc 20") - n_i = 0 - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij, cosines=u_ij, diff=d_ij, shift=shift_ij) - if( r_ij >= this%cutoff ) cycle - - n_i = n_i + 1 - - i_species = species_map(at%Z(j)) - if( i_species == 0 ) cycle - - if(.not. this%global .and. my_do_grad_descriptor) then - descriptor_out%x(i_desc_i)%ii(n_i) = j - descriptor_out%x(i_desc_i)%pos(:,n_i) = at%pos(:,j) + matmul(at%lattice,shift_ij) - descriptor_out%x(i_desc_i)%has_grad_data(n_i) = .true. - endif - - f_cut = coordination_function(r_ij,this%cutoff, this%cutoff_transition_width) - radial_decay = ( 1.0_dp + this%cutoff_rate ) / ( this%cutoff_rate + ( r_ij / this%cutoff_scale )**this%cutoff_dexp ) - radial_decay = norm_radial_decay * radial_decay - - if(my_do_grad_descriptor) then - df_cut = dcoordination_function(r_ij,this%cutoff, this%cutoff_transition_width) - dradial_decay = - this%cutoff_dexp * ( 1.0_dp + this%cutoff_rate ) * ( r_ij / this%cutoff_scale )**this%cutoff_dexp / & - ( r_ij * ( this%cutoff_rate + ( r_ij / this%cutoff_scale )**this%cutoff_dexp )**2 ) - dradial_decay = norm_radial_decay * dradial_decay - - df_cut = df_cut * radial_decay + f_cut * dradial_decay - do a = 1, this%n_max - do l = 0, this%l_max - !SPEED allocate(grad_fourier_so3(l,a,n_i)%mm(3,-l:l)) - !SPEED grad_fourier_so3(l,a,n_i)%mm(:,:) = CPLX_ZERO - allocate(grad_fourier_so3_r(l,a,n_i)%mm(3,-l:l)) - allocate(grad_fourier_so3_i(l,a,n_i)%mm(3,-l:l)) - grad_fourier_so3_r(l,a,n_i)%mm(:,:) = 0.0_dp - grad_fourier_so3_i(l,a,n_i)%mm(:,:) = 0.0_dp - enddo - enddo - endif - f_cut = f_cut * radial_decay - - do a = 1, this%n_max - arg_bess = 2.0_dp * this%alpha * r_ij * this%r_basis(a) - exp_p = exp( -this%alpha*( r_ij + this%r_basis(a) )**2 ) - exp_m = exp( -this%alpha*( r_ij - this%r_basis(a) )**2 ) - - do l = 0, this%l_max - if( l == 0 ) then - if(arg_bess == 0.0_dp) then - !mo_spher_bess_fi_ki_l = 1.0_dp - mo_spher_bess_fi_ki_l = exp( -this%alpha * (this%r_basis(a)**2 + r_ij**2) ) - if(my_do_grad_descriptor) mo_spher_bess_fi_ki_lp = 0.0_dp - else - !mo_spher_bess_fi_ki_lm = cosh(arg_bess)/arg_bess - !mo_spher_bess_fi_ki_l = sinh(arg_bess)/arg_bess - mo_spher_bess_fi_ki_lm = 0.5_dp * (exp_m + exp_p) / arg_bess - mo_spher_bess_fi_ki_l = 0.5_dp * (exp_m - exp_p) / arg_bess - if(my_do_grad_descriptor) mo_spher_bess_fi_ki_lp = mo_spher_bess_fi_ki_lm - (2*l+1)*mo_spher_bess_fi_ki_l / arg_bess - endif - else - if(arg_bess == 0.0_dp) then - mo_spher_bess_fi_ki_l = 0.0_dp - if(my_do_grad_descriptor) mo_spher_bess_fi_ki_lp = 0.0_dp - else - mo_spher_bess_fi_ki_lmm = mo_spher_bess_fi_ki_lm - mo_spher_bess_fi_ki_lm = mo_spher_bess_fi_ki_l - if(my_do_grad_descriptor) then - mo_spher_bess_fi_ki_l = mo_spher_bess_fi_ki_lp - mo_spher_bess_fi_ki_lp = mo_spher_bess_fi_ki_lm - (2*l+1)*mo_spher_bess_fi_ki_l / arg_bess - else - mo_spher_bess_fi_ki_l = mo_spher_bess_fi_ki_lmm - (2*l-1)*mo_spher_bess_fi_ki_lm / arg_bess - endif - endif - endif - - !radial_fun(l,a) = exp( -this%alpha * (this%r_basis(a)**2 + r_ij**2) ) * mo_spher_bess_fi_ki_l !* this%r_basis(a) - radial_fun(l,a) = mo_spher_bess_fi_ki_l !* this%r_basis(a) - if(my_do_grad_descriptor) grad_radial_fun(l,a) = -2.0_dp * this%alpha * r_ij * mo_spher_bess_fi_ki_l + & - l*mo_spher_bess_fi_ki_l / r_ij + mo_spher_bess_fi_ki_lp * 2.0_dp * this%alpha * this%r_basis(a) - - enddo - enddo - - radial_coefficient = matmul( radial_fun, this%transform_basis ) - if(my_do_grad_descriptor) grad_radial_coefficient = matmul( grad_radial_fun, this%transform_basis ) * f_cut + radial_coefficient * df_cut - radial_coefficient = radial_coefficient * f_cut - - do l = 0, this%l_max - do m = -l, l - SphericalY_ij(l)%m(m) = SphericalYCartesian(l,m,d_ij) - if(my_do_grad_descriptor) grad_SphericalY_ij(l)%mm(:,m) = GradSphericalYCartesian(l,m,d_ij) - enddo - enddo - - do a = 1, this%n_max - do l = 0, this%l_max - do m = -l, l - !SPEED fourier_so3(l,a,i_species)%m(m) = fourier_so3(l,a,i_species)%m(m) + radial_coefficient(l,a) * SphericalY_ij(l)%m(m) - !SPEED if(my_do_grad_descriptor) grad_fourier_so3(l,a,n_i)%mm(:,m) = grad_fourier_so3(l,a,n_i)%mm(:,m) + & - !SPEED grad_radial_coefficient(l,a) * SphericalY_ij(l)%m(m) * u_ij + radial_coefficient(l,a) * grad_SphericalY_ij(l)%mm(:,m) - fourier_so3_r(l,a,i_species)%m(m) = fourier_so3_r(l,a,i_species)%m(m) + real(radial_coefficient(l,a) * SphericalY_ij(l)%m(m), dp) - fourier_so3_i(l,a,i_species)%m(m) = fourier_so3_i(l,a,i_species)%m(m) + aimag(radial_coefficient(l,a) * SphericalY_ij(l)%m(m)) - if(my_do_grad_descriptor) then - grad_fourier_so3_r(l,a,n_i)%mm(:,m) = grad_fourier_so3_r(l,a,n_i)%mm(:,m) + & - real(grad_radial_coefficient(l,a) * SphericalY_ij(l)%m(m) * u_ij + radial_coefficient(l,a) * grad_SphericalY_ij(l)%mm(:,m), dp) - grad_fourier_so3_i(l,a,n_i)%mm(:,m) = grad_fourier_so3_i(l,a,n_i)%mm(:,m) + & - aimag(grad_radial_coefficient(l,a) * SphericalY_ij(l)%m(m) * u_ij + radial_coefficient(l,a) * grad_SphericalY_ij(l)%mm(:,m)) - endif ! my_do_grad_descriptor - enddo ! m - enddo ! l - enddo ! a - - enddo ! n -! call system_timer("soap_calc 20") - - if(this%global .and. my_do_grad_descriptor) then - global_grad_fourier_so3_r_array(i_desc_i)%x = grad_fourier_so3_r - global_grad_fourier_so3_i_array(i_desc_i)%x = grad_fourier_so3_i - !do n_i = lbound(grad_fourier_so3_r,3), ubound(grad_fourier_so3_r,3) - ! do a = lbound(grad_fourier_so3_r,2), ubound(grad_fourier_so3_r,2) - ! do l = lbound(grad_fourier_so3_r,1), ubound(grad_fourier_so3_r,1) - ! global_grad_fourier_so3_r_array(i_desc_i)%x(l,a,n_i)%mm = grad_fourier_so3_r(l,a,n_i)%mm - ! global_grad_fourier_so3_i_array(i_desc_i)%x(l,a,n_i)%mm = grad_fourier_so3_i(l,a,n_i)%mm - ! enddo ! l - ! enddo ! a - !enddo ! n_i - endif - - if(this%global) then - i_coeff = 0 - do ia = 1, this%n_species*this%n_max - a = rs_index(1,ia) - i_species = rs_index(2,ia) - do l = 0, this%l_max - global_fourier_so3_r_array(i_coeff+1:i_coeff+2*l+1) = global_fourier_so3_r_array(i_coeff+1:i_coeff+2*l+1) + fourier_so3_r(l,a,i_species)%m(:) - global_fourier_so3_i_array(i_coeff+1:i_coeff+2*l+1) = global_fourier_so3_i_array(i_coeff+1:i_coeff+2*l+1) + fourier_so3_i(l,a,i_species)%m(:) - i_coeff = i_coeff + 2*l+1 - enddo - enddo - endif - - i_pow = 0 - do ia = 1, this%n_species*this%n_max - a = rs_index(1,ia) - i_species = rs_index(2,ia) - do jb = 1, ia - b = rs_index(1,jb) - j_species = rs_index(2,jb) - - if(this%diagonal_radial .and. a /= b) cycle - - do l = 0, this%l_max - i_pow = i_pow + 1 - !SPEED descriptor_i(i_pow) = real( dot_product(fourier_so3(l,a,i_species)%m, fourier_so3(l,b,j_species)%m) ) - descriptor_i(i_pow) = dot_product(fourier_so3_r(l,a,i_species)%m, fourier_so3_r(l,b,j_species)%m) + dot_product(fourier_so3_i(l,a,i_species)%m, fourier_so3_i(l,b,j_species)%m) - if(do_two_l_plus_one) descriptor_i(i_pow) = descriptor_i(i_pow) / sqrt(2.0_dp * l + 1.0_dp) - if( ia /= jb ) descriptor_i(i_pow) = descriptor_i(i_pow) * SQRT_TWO - enddo !l - enddo !jb - enddo !ia - - descriptor_i(d) = 0.0_dp - norm_descriptor_i = sqrt(dot_product(descriptor_i,descriptor_i)) - - if(.not. this%global .and. my_do_descriptor) then - if(this%normalise) then - descriptor_out%x(i_desc_i)%data = descriptor_i / norm_descriptor_i - else - descriptor_out%x(i_desc_i)%data = descriptor_i - endif - - descriptor_out%x(i_desc_i)%data(d) = this%covariance_sigma0 - endif - - if(my_do_grad_descriptor) then -! soap_calc 33 takes 0.047 s -! call system_timer("soap_calc 33") - allocate(t_g_r(this%n_max*3, 2*this%l_max+1), t_g_i(this%n_max*3, 2*this%l_max+1)) - allocate(t_f_r(this%n_max*this%n_species, 2*this%l_max+1), t_f_i(this%n_max*this%n_species, 2*this%l_max+1)) - allocate(t_g_f_rr(this%n_max*3, this%n_max*this%n_species), t_g_f_ii(this%n_max*3, this%n_max*this%n_species)) - !do n_i = 1, n_neighbours(at,i,max_dist=this%cutoff) - - n_i = 0 - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij) - if( r_ij >= this%cutoff ) cycle - - n_i = n_i + 1 - - if( species_map(at%Z(j)) == 0 ) cycle - - i_pow = 0 - grad_descriptor_i = 0.0_dp - - !SPEED do ia = 1, this%n_species*this%n_max - !SPEED a = rs_index(1,ia) - !SPEED i_species = rs_index(2,ia) - !SPEED do jb = 1, ia - !SPEED b = rs_index(1,jb) - !SPEED j_species = rs_index(2,jb) - !SPEED do l = 0, this%l_max - !SPEED i_pow = i_pow + 1 - !SPEED if(at%Z(j) == this%species_Z(i_species) .or. this%species_Z(i_species)==0) grad_descriptor_i(i_pow,:) = grad_descriptor_i(i_pow,:) + real( matmul(conjg(grad_fourier_so3(l,a,n_i)%mm),fourier_so3(l,b,j_species)%m) ) - !SPEED if(at%Z(j) == this%species_Z(j_species) .or. this%species_Z(j_species)==0) grad_descriptor_i(i_pow,:) = grad_descriptor_i(i_pow,:) + real( matmul(grad_fourier_so3(l,b,n_i)%mm,conjg(fourier_so3(l,a,i_species)%m)) ) - !SPEED !grad_descriptor_i(i_pow,:) = real( matmul(conjg(grad_fourier_so3(l,a,n_i)%mm),fourier_so3(l,b)%m) + matmul(grad_fourier_so3(l,b,n_i)%mm,conjg(fourier_so3(l,a)%m)) ) - !SPEED if( ia /= jb ) grad_descriptor_i(i_pow, 1:3) = grad_descriptor_i(i_pow, 1:3) * SQRT_TWO - !SPEED enddo !l - !SPEED enddo !jb - !SPEED enddo !ia - - !SPEED do ia = 1, this%n_species*this%n_max - !SPEED a = rs_index(1,ia) - !SPEED i_species = rs_index(2,ia) - !SPEED do jb = 1, ia - !SPEED b = rs_index(1,jb) - !SPEED j_species = rs_index(2,jb) - !SPEED do l = 0, this%l_max - !SPEED i_pow = i_pow + 1 - !SPEED if(at%Z(j) == this%species_Z(i_species) .or. this%species_Z(i_species)==0) grad_descriptor_i(i_pow,:) = grad_descriptor_i(i_pow,:) + & - !SPEED matmul(grad_fourier_so3_r(l,a,n_i)%mm,fourier_so3_r(l,b,j_species)%m) + matmul(grad_fourier_so3_i(l,a,n_i)%mm,fourier_so3_i(l,b,j_species)%m) - !SPEED if(at%Z(j) == this%species_Z(j_species) .or. this%species_Z(j_species)==0) grad_descriptor_i(i_pow,:) = grad_descriptor_i(i_pow,:) + & - !SPEED matmul(grad_fourier_so3_r(l,b,n_i)%mm,fourier_so3_r(l,a,i_species)%m) + matmul(grad_fourier_so3_i(l,b,n_i)%mm,fourier_so3_i(l,a,i_species)%m) - !SPEED if( ia /= jb ) grad_descriptor_i(i_pow, 1:3) = grad_descriptor_i(i_pow, 1:3) * SQRT_TWO - !SPEED enddo !l - !SPEED enddo !jb - !SPEED enddo !ia - - do l=0, this%l_max - do a = 1, this%n_max - do alpha=1, 3 - t_g_r(3*(a-1)+alpha, 1:2*l+1) = grad_fourier_so3_r(l,a,n_i)%mm(alpha,-l:l) - t_g_i(3*(a-1)+alpha, 1:2*l+1) = grad_fourier_so3_i(l,a,n_i)%mm(alpha,-l:l) - enddo - enddo - do ia = 1, this%n_species*this%n_max - a = rs_index(1,ia) - i_species = rs_index(2,ia) - - t_f_r(ia, 1:2*l+1) = fourier_so3_r(l,a,i_species)%m(-l:l) - t_f_i(ia, 1:2*l+1) = fourier_so3_i(l,a,i_species)%m(-l:l) - enddo - call dgemm('N','T',this%n_max*3, this%n_max*this%n_species, 2*l+1, 1.0_dp, & - t_g_r(1,1), size(t_g_r,1), t_f_r(1,1), size(t_f_r,1), 0.0_dp, t_g_f_rr(1,1), size(t_g_f_rr, 1)) - call dgemm('N','T',this%n_max*3, this%n_max*this%n_species, 2*l+1, 1.0_dp, & - t_g_i(1,1), size(t_g_i,1), t_f_i(1,1), size(t_f_i,1), 0.0_dp, t_g_f_ii(1,1), size(t_g_f_ii, 1)) - !t_g_f_rr = matmul(t_g_r,transpose(t_f_r)) - !t_g_f_ii = matmul(t_g_i,transpose(t_f_i)) - - i_pow = l+1 - do ia = 1, this%n_species*this%n_max - a = rs_index(1,ia) - i_species = rs_index(2,ia) - do jb = 1, ia !this%n_species*this%n_max !ia - b = rs_index(1,jb) - j_species = rs_index(2,jb) - - if(this%diagonal_radial .and. a /= b) cycle - - if(at%Z(j) == this%species_Z(i_species) .or. this%species_Z(i_species)==0) grad_descriptor_i(i_pow, 1:3) = grad_descriptor_i(i_pow, 1:3) + t_g_f_rr(3*(a-1)+1:3*a,jb) + t_g_f_ii(3*(a-1)+1:3*a,jb) - if(at%Z(j) == this%species_Z(j_species) .or. this%species_Z(j_species)==0) grad_descriptor_i(i_pow, 1:3) = grad_descriptor_i(i_pow, 1:3) + t_g_f_rr(3*(b-1)+1:3*b,ia) + t_g_f_ii(3*(b-1)+1:3*b,ia) - - - if(do_two_l_plus_one) grad_descriptor_i(i_pow, 1:3) = grad_descriptor_i(i_pow, 1:3) / sqrt(2.0_dp * l + 1.0_dp) - if( ia /= jb ) grad_descriptor_i(i_pow, 1:3) = grad_descriptor_i(i_pow, 1:3) * SQRT_TWO - i_pow = i_pow + this%l_max+1 - enddo - enddo - - !do a = 1, this%n_max - ! do b = 1, a - ! grad_descriptor_i(i_pow, 1:3) = t_g_f_rr(3*(a-1)+1:3*a,b) + t_g_f_ii(3*(a-1)+1:3*a,b) + & - ! t_g_f_rr(3*(b-1)+1:3*b,a) + t_g_f_ii(3*(b-1)+1:3*b,a) - ! if( a /= b ) grad_descriptor_i(i_pow, 1:3) = grad_descriptor_i(i_pow, 1:3) * SQRT_TWO - ! i_pow = i_pow + this%l_max+1 - ! end do - !end do - - end do !l - - grad_descriptor_i(d, 1:3) = 0.0_dp - - if(.not. this%global) then - if( this%normalise ) then - descriptor_out%x(i_desc_i)%grad_data(:,:,n_i) = grad_descriptor_i / norm_descriptor_i - do k = 1, 3 - descriptor_out%x(i_desc_i)%grad_data(:,k,n_i) = descriptor_out%x(i_desc_i)%grad_data(:,k,n_i) - descriptor_i * dot_product(descriptor_i,grad_descriptor_i(:,k)) / norm_descriptor_i**3 - enddo - else - descriptor_out%x(i_desc_i)%grad_data(:,:,n_i) = grad_descriptor_i - endif - - descriptor_out%x(i_desc_i)%grad_data(:,:,0) = descriptor_out%x(i_desc_i)%grad_data(:,:,0) - descriptor_out%x(i_desc_i)%grad_data(:,:,n_i) - endif - enddo !ni - deallocate(t_f_r, t_f_i) - deallocate(t_g_r, t_g_i) - deallocate(t_g_f_rr, t_g_f_ii) -! call system_timer("soap_calc 33") - - do n_i = 1, n_neighbours(at,i,max_dist=this%cutoff) - do a = 1, this%n_max - do l = 0, this%l_max - !SPEED deallocate(grad_fourier_so3(l,a,n_i)%mm) - if(allocated(grad_fourier_so3_r(l,a,n_i)%mm)) deallocate(grad_fourier_so3_r(l,a,n_i)%mm) - if(allocated(grad_fourier_so3_i(l,a,n_i)%mm)) deallocate(grad_fourier_so3_i(l,a,n_i)%mm) - enddo - enddo - enddo - !SPEED deallocate(grad_fourier_so3) - deallocate(grad_fourier_so3_r) - deallocate(grad_fourier_so3_i) - endif - - enddo ! i -!$omp end parallel do - - !SPEED if(allocated(fourier_so3)) then - !SPEED do i_species = 1, this%n_species - !SPEED do a = lbound(fourier_so3,2), ubound(fourier_so3,2) - !SPEED do l = lbound(fourier_so3,1), ubound(fourier_so3,1) - !SPEED deallocate(fourier_so3(l,a,i_species)%m) - !SPEED enddo - !SPEED enddo - !SPEED enddo - !SPEED deallocate(fourier_so3) - !SPEED endif - -!$omp parallel default(none) private(i_species, a, l) - if(allocated(fourier_so3_r)) then - do i_species = lbound(fourier_so3_r,3), ubound(fourier_so3_r,3) - do a = lbound(fourier_so3_r,2), ubound(fourier_so3_r,2) - do l = lbound(fourier_so3_r,1), ubound(fourier_so3_r,1) - deallocate(fourier_so3_r(l,a,i_species)%m) - enddo - enddo - enddo - deallocate(fourier_so3_r) - endif - if(allocated(fourier_so3_i)) then - do i_species = lbound(fourier_so3_i,3), ubound(fourier_so3_i,3) - do a = lbound(fourier_so3_i,2), ubound(fourier_so3_i,2) - do l = lbound(fourier_so3_i,1), ubound(fourier_so3_i,1) - deallocate(fourier_so3_i(l,a,i_species)%m) - enddo - enddo - enddo - deallocate(fourier_so3_i) - endif - - if(allocated(SphericalY_ij)) then - do l = lbound(SphericalY_ij,1), ubound(SphericalY_ij,1) - deallocate(SphericalY_ij(l)%m) - enddo - deallocate(SphericalY_ij) - endif - - if(allocated(grad_SphericalY_ij)) then - do l = lbound(grad_SphericalY_ij,1), ubound(grad_SphericalY_ij,1) - deallocate(grad_SphericalY_ij(l)%mm) - enddo - deallocate(grad_SphericalY_ij) - endif - - if(allocated(radial_fun)) deallocate(radial_fun) - if(allocated(radial_coefficient)) deallocate(radial_coefficient) - if(allocated(grad_radial_fun)) deallocate(grad_radial_fun) - if(allocated(grad_radial_coefficient)) deallocate(grad_radial_coefficient) - if(allocated(descriptor_i)) deallocate(descriptor_i) - if(allocated(grad_descriptor_i)) deallocate(grad_descriptor_i) -!$omp end parallel - - if(this%global) then - allocate(global_fourier_so3_r(0:this%l_max,this%n_max,this%n_species), global_fourier_so3_i(0:this%l_max,this%n_max,this%n_species), & - descriptor_i(d) ) - - i_coeff = 0 - do ia = 1, this%n_species*this%n_max - a = rs_index(1,ia) - i_species = rs_index(2,ia) - do l = 0, this%l_max - allocate(global_fourier_so3_r(l,a,i_species)%m(-l:l)) - allocate(global_fourier_so3_i(l,a,i_species)%m(-l:l)) - global_fourier_so3_r(l,a,i_species)%m(:) = global_fourier_so3_r_array(i_coeff+1:i_coeff+2*l+1) - global_fourier_so3_i(l,a,i_species)%m(:) = global_fourier_so3_i_array(i_coeff+1:i_coeff+2*l+1) - i_coeff = i_coeff + 2*l+1 - enddo - enddo - - i_pow = 0 - do ia = 1, this%n_species*this%n_max - a = rs_index(1,ia) - i_species = rs_index(2,ia) - do jb = 1, ia - b = rs_index(1,jb) - j_species = rs_index(2,jb) - - if(this%diagonal_radial .and. a /= b) cycle - - do l = 0, this%l_max - i_pow = i_pow + 1 - descriptor_i(i_pow) = & - dot_product(global_fourier_so3_r(l,a,i_species)%m, global_fourier_so3_r(l,b,j_species)%m) + & - dot_product(global_fourier_so3_i(l,a,i_species)%m, global_fourier_so3_i(l,b,j_species)%m) - - !if( ia /= jb ) descriptor_out%global_data(i_pow) = descriptor_out%global_data(i_pow) * SQRT_TWO - if(do_two_l_plus_one) descriptor_i(i_pow) = descriptor_i(i_pow) / sqrt(2.0_dp * l + 1.0_dp) - if( ia /= jb ) descriptor_i(i_pow) = descriptor_i(i_pow) * SQRT_TWO - enddo !l - - enddo !jb - enddo !ia - descriptor_i(d) = 0.0_dp - norm_descriptor_i = sqrt(dot_product(descriptor_i,descriptor_i)) - if(my_do_descriptor) then - if(this%normalise) then - descriptor_out%x(1)%data = descriptor_i / norm_descriptor_i - else - descriptor_out%x(1)%data = descriptor_i - endif - descriptor_out%x(1)%data(d) = this%covariance_sigma0 - endif - - if(my_do_grad_descriptor) then - allocate(t_g_r(this%n_max*3, 2*this%l_max+1), t_g_i(this%n_max*3, 2*this%l_max+1)) - allocate(t_f_r(this%n_max*this%n_species, 2*this%l_max+1), t_f_i(this%n_max*this%n_species, 2*this%l_max+1)) - allocate(t_g_f_rr(this%n_max*3, this%n_max*this%n_species), t_g_f_ii(this%n_max*3, this%n_max*this%n_species)) - allocate(grad_descriptor_i(d,3)) - - i_pair = 0 - do i = 1, at%N - - if(i_desc(i) == 0) then - cycle - else - i_desc_i = i_desc(i) - endif - - i_pair = i_pair + 1 - i_pair_i = i_pair ! accumulates \frac{ \partial p^{(j)} }{ \partial r_{ji\alpha} } - - descriptor_out%x(1)%ii(i_pair_i) = i - descriptor_out%x(1)%pos(:,i_pair_i) = 0.0_dp - descriptor_out%x(1)%has_grad_data(i_pair_i) = .true. - descriptor_out%x(1)%grad_data(:,:,i_pair_i) = 0.0_dp - - n_i = 0 - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij, diff = d_ij) - if( r_ij >= this%cutoff ) cycle - - n_i = n_i + 1 - i_pair = i_pair + 1 ! \frac{ \partial p^{(i)} }{ \partial r_{ij\alpha} } - - descriptor_out%x(1)%ii(i_pair) = j - descriptor_out%x(1)%pos(:,i_pair) = d_ij - descriptor_out%x(1)%has_grad_data(i_pair) = .true. - - i_pow = 0 - grad_descriptor_i = 0.0_dp - - do l=0, this%l_max - do a = 1, this%n_max - do alpha=1, 3 - t_g_r(3*(a-1)+alpha, 1:2*l+1) = global_grad_fourier_so3_r_array(i_desc_i)%x(l,a,n_i)%mm(alpha,-l:l) - t_g_i(3*(a-1)+alpha, 1:2*l+1) = global_grad_fourier_so3_i_array(i_desc_i)%x(l,a,n_i)%mm(alpha,-l:l) - enddo - enddo - do ia = 1, this%n_species*this%n_max - a = rs_index(1,ia) - i_species = rs_index(2,ia) - - t_f_r(ia, 1:2*l+1) = global_fourier_so3_r(l,a,i_species)%m(-l:l) - t_f_i(ia, 1:2*l+1) = global_fourier_so3_i(l,a,i_species)%m(-l:l) - enddo - call dgemm('N','T',this%n_max*3, this%n_max*this%n_species, 2*l+1, 1.0_dp, & - t_g_r(1,1), size(t_g_r,1), t_f_r(1,1), size(t_f_r,1), 0.0_dp, t_g_f_rr(1,1), size(t_g_f_rr, 1)) - call dgemm('N','T',this%n_max*3, this%n_max*this%n_species, 2*l+1, 1.0_dp, & - t_g_i(1,1), size(t_g_i,1), t_f_i(1,1), size(t_f_i,1), 0.0_dp, t_g_f_ii(1,1), size(t_g_f_ii, 1)) - !t_g_f_rr = matmul(t_g_r,transpose(t_f_r)) - !t_g_f_ii = matmul(t_g_i,transpose(t_f_i)) - - i_pow = l+1 - do ia = 1, this%n_species*this%n_max - a = rs_index(1,ia) - i_species = rs_index(2,ia) - do jb = 1, ia !this%n_species*this%n_max !ia - b = rs_index(1,jb) - j_species = rs_index(2,jb) - - if(this%diagonal_radial .and. a /= b) cycle - - if(at%Z(j) == this%species_Z(i_species) .or. this%species_Z(i_species)==0) grad_descriptor_i(i_pow, 1:3) = grad_descriptor_i(i_pow, 1:3) + t_g_f_rr(3*(a-1)+1:3*a,jb) + t_g_f_ii(3*(a-1)+1:3*a,jb) - if(at%Z(j) == this%species_Z(j_species) .or. this%species_Z(j_species)==0) grad_descriptor_i(i_pow, 1:3) = grad_descriptor_i(i_pow, 1:3) + t_g_f_rr(3*(b-1)+1:3*b,ia) + t_g_f_ii(3*(b-1)+1:3*b,ia) - - - if(do_two_l_plus_one) grad_descriptor_i(i_pow, 1:3) = grad_descriptor_i(i_pow, 1:3) / sqrt(2.0_dp * l + 1.0_dp) - if( ia /= jb ) grad_descriptor_i(i_pow, 1:3) = grad_descriptor_i(i_pow, 1:3) * SQRT_TWO - i_pow = i_pow + this%l_max+1 - enddo - enddo - - end do !l - - grad_descriptor_i(d, 1:3) = 0.0_dp - if( this%normalise ) then - descriptor_out%x(1)%grad_data(:,:,i_pair) = grad_descriptor_i / norm_descriptor_i - do k = 1, 3 - descriptor_out%x(1)%grad_data(:,k,i_pair) = descriptor_out%x(1)%grad_data(:,k,i_pair) - descriptor_i * dot_product(descriptor_i,grad_descriptor_i(:,k)) / norm_descriptor_i**3 - enddo - else - descriptor_out%x(1)%grad_data(:,:,i_pair) = grad_descriptor_i - endif - - descriptor_out%x(1)%grad_data(:,:,i_pair_i) = descriptor_out%x(1)%grad_data(:,:,i_pair_i) - descriptor_out%x(1)%grad_data(:,:,i_pair) - enddo ! n/n_i - - enddo ! i - - deallocate(grad_descriptor_i) - deallocate(t_f_r, t_f_i) - deallocate(t_g_r, t_g_i) - deallocate(t_g_f_rr, t_g_f_ii) - endif ! my_do_grad_descriptor - - do i_species = lbound(global_fourier_so3_r,3), ubound(global_fourier_so3_r,3) - do a = lbound(global_fourier_so3_r,2), ubound(global_fourier_so3_r,2) - do l = lbound(global_fourier_so3_r,1), ubound(global_fourier_so3_r,1) - deallocate(global_fourier_so3_r(l,a,i_species)%m) - enddo - enddo - enddo - deallocate(global_fourier_so3_r) - do i_species = lbound(global_fourier_so3_i,3), ubound(global_fourier_so3_i,3) - do a = lbound(global_fourier_so3_i,2), ubound(global_fourier_so3_i,2) - do l = lbound(global_fourier_so3_i,1), ubound(global_fourier_so3_i,1) - deallocate(global_fourier_so3_i(l,a,i_species)%m) - enddo - enddo - enddo - deallocate(global_fourier_so3_i) - - if(allocated(descriptor_i)) deallocate(descriptor_i) - endif ! this%global - - if(allocated(global_fourier_so3_r_array)) deallocate(global_fourier_so3_r_array) - if(allocated(global_fourier_so3_i_array)) deallocate(global_fourier_so3_i_array) - - if(allocated(global_grad_fourier_so3_r_array)) then - do i_desc_i = lbound(global_grad_fourier_so3_r_array,1), ubound(global_grad_fourier_so3_r_array,1) - if(allocated(global_grad_fourier_so3_r_array(i_desc_i)%x)) then - do n_i = lbound(global_grad_fourier_so3_r_array(i_desc_i)%x,3), ubound(global_grad_fourier_so3_r_array(i_desc_i)%x,3) - do a = lbound(global_grad_fourier_so3_r_array(i_desc_i)%x,2), ubound(global_grad_fourier_so3_r_array(i_desc_i)%x,2) - do l = lbound(global_grad_fourier_so3_r_array(i_desc_i)%x,1), ubound(global_grad_fourier_so3_r_array(i_desc_i)%x,1) - if(allocated(global_grad_fourier_so3_r_array(i_desc_i)%x(l,a,n_i)%mm)) deallocate(global_grad_fourier_so3_r_array(i_desc_i)%x(l,a,n_i)%mm) - enddo ! l - enddo ! a - enddo ! n_i - deallocate(global_grad_fourier_so3_r_array(i_desc_i)%x) - endif - enddo ! i_desc_i - deallocate(global_grad_fourier_so3_r_array) - endif - if(allocated(global_grad_fourier_so3_i_array)) then - do i_desc_i = lbound(global_grad_fourier_so3_i_array,1), ubound(global_grad_fourier_so3_i_array,1) - if(allocated(global_grad_fourier_so3_i_array(i_desc_i)%x)) then - do n_i = lbound(global_grad_fourier_so3_i_array(i_desc_i)%x,3), ubound(global_grad_fourier_so3_i_array(i_desc_i)%x,3) - do a = lbound(global_grad_fourier_so3_i_array(i_desc_i)%x,2), ubound(global_grad_fourier_so3_i_array(i_desc_i)%x,2) - do l = lbound(global_grad_fourier_so3_i_array(i_desc_i)%x,1), ubound(global_grad_fourier_so3_i_array(i_desc_i)%x,1) - if(allocated(global_grad_fourier_so3_i_array(i_desc_i)%x(l,a,n_i)%mm)) deallocate(global_grad_fourier_so3_i_array(i_desc_i)%x(l,a,n_i)%mm) - enddo ! l - enddo ! a - enddo ! n_i - deallocate(global_grad_fourier_so3_i_array(i_desc_i)%x) - endif - enddo ! i_desc_i - deallocate(global_grad_fourier_so3_i_array) - endif - - if(allocated(rs_index)) deallocate(rs_index) - if(allocated(i_desc)) deallocate(i_desc) - - call system_timer('soap_calc') - - endsubroutine soap_calc - - subroutine AN_monomer_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(AN_monomer), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor - integer :: d, n_descriptors, n_cross, i_desc, i, j, k, n, m, n_index - integer, dimension(3) :: shift_ij, shift_ik - real(dp) :: r_ij, r_ik, r_jk - real(dp), dimension(3) :: d_ij, d_ik, d_jk, u_ij, u_jk - - INIT_ERROR(error) - - call system_timer('AN_monomer_calc') - - if(.not. this%initialised) then - RAISE_ERROR("AN_monomer_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - call finalise(descriptor_out) - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='AN_monomer_calc args_str')) then - RAISE_ERROR("AN_monomer_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("AN_monomer_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - RAISE_ERROR("AN_monomer_calc cannot use atom masks yet.",error) - else - atom_mask_pointer => null() - endif - - endif - - d = AN_monomer_dimensions(this,error) - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - - allocate(descriptor_out%x(n_descriptors)) - do i = 1, n_descriptors - if(my_do_descriptor) then - allocate(descriptor_out%x(i)%data(d)) - descriptor_out%x(i)%data = 0.0_dp - allocate(descriptor_out%x(i)%ci(n_index)) - descriptor_out%x(i)%has_data = .false. - descriptor_out%x(i)%covariance_cutoff = 1.0_dp - endif - if(my_do_grad_descriptor) then - allocate(descriptor_out%x(i)%grad_data(d,3,0:this%N-1)) - allocate(descriptor_out%x(i)%ii(0:this%N-1)) - allocate(descriptor_out%x(i)%pos(3,0:this%N-1)) - allocate(descriptor_out%x(i)%has_grad_data(0:this%N-1)) - descriptor_out%x(i)%grad_data = 0.0_dp - descriptor_out%x(i)%ii = 0 - descriptor_out%x(i)%pos = 0.0_dp - descriptor_out%x(i)%has_grad_data = .false. - - allocate(descriptor_out%x(i)%grad_covariance_cutoff(3,0:this%N-1)) - descriptor_out%x(i)%grad_covariance_cutoff = 0.0_dp - endif - enddo - - if(at%N /= this%N) then - RAISE_ERROR("AN_monomer_calc: number of atoms is "//at%N//" instead of "//this%N,error) - endif - - do i = 1, at%N - - i_desc = 0 - - if(my_do_descriptor) then - if(this%do_atomic) then - descriptor_out%x(i)%ci(1) = i - else - descriptor_out%x(i)%ci(:) = (/(m,m=1,this%N)/) - endif - endif - - if(my_do_grad_descriptor) then - descriptor_out%x(i)%ii(0) = i - descriptor_out%x(i)%pos(:,0) = at%pos(:,i) - descriptor_out%x(i)%has_grad_data(:) = .true. - endif - - do n = 1, n_neighbours(at,i) - j = neighbour(at,i,n,distance=r_ij, cosines=u_ij, shift=shift_ij) - - i_desc = i_desc + 1 - if(my_do_descriptor) then - descriptor_out%x(i)%has_data = .true. - descriptor_out%x(i)%data(i_desc) = r_ij - endif - - if(my_do_grad_descriptor) then - descriptor_out%x(i)%ii(n) = j - descriptor_out%x(i)%pos(:,n) = at%pos(:,j) + matmul(at%lattice,shift_ij) - - descriptor_out%x(i)%grad_data(i_desc,:,n) = u_ij - descriptor_out%x(i)%grad_data(i_desc,:,0) = -u_ij - endif - - do m = 1, n_neighbours(at,i) - if(n >= m) cycle - - k = neighbour(at,i,m,distance=r_ik, shift=shift_ik) - - d_jk = ( at%pos(:,j) + matmul(at%lattice,shift_ij) ) - ( at%pos(:,k) + matmul(at%lattice,shift_ik) ) - r_jk = norm(d_jk) - u_jk = d_jk / r_jk - - i_desc = i_desc + 1 - if(my_do_descriptor) then - descriptor_out%x(i)%has_data = .true. - descriptor_out%x(i)%data(i_desc) = r_jk - endif - - if(my_do_grad_descriptor) then - descriptor_out%x(i)%grad_data(i_desc,:,n) = u_jk - descriptor_out%x(i)%grad_data(i_desc,:,m) = -u_jk - endif - - enddo - enddo - - if(.not. this%do_atomic) exit - - enddo - - call system_timer('AN_monomer_calc') - - endsubroutine AN_monomer_calc - - subroutine general_monomer_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(general_monomer), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor!, use_smooth_cutoff - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor - integer :: d, n_descriptors, n_cross, monomer_size, i, & - i_atomic, j_atomic, k, start, finish, n_index - integer, dimension(3) :: temp_shift - real(dp), dimension(:), allocatable :: dist_vec - real(dp), dimension(:,:), allocatable :: interatomic_distances - real(dp), dimension(:,:,:), allocatable :: interatomic_vectors - integer, dimension(:), allocatable :: atomic_index - integer, dimension(:,:), allocatable :: monomer_index, shifts - logical, dimension(:), allocatable :: associated_to_monomer - - - INIT_ERROR(error) - - call system_timer('general_monomer_calc') - - if(.not. this%initialised) then - RAISE_ERROR("general_monomer_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - call finalise(descriptor_out) - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='general_monomer_calc args_str')) then - RAISE_ERROR("general_monomer_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("general_monomer_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - else - atom_mask_pointer => null() - endif - - endif - - monomer_size=size(this%signature) - d = general_monomer_dimensions(this,error) - - allocate(shifts(monomer_size,3)) - allocate(dist_vec(d)) - allocate(atomic_index(monomer_size)) - allocate(associated_to_monomer(at%N)) - allocate(interatomic_vectors(monomer_size,monomer_size,3)) - allocate(interatomic_distances(monomer_size,monomer_size)) - interatomic_vectors = 0.0_dp - interatomic_distances = 0.0_dp - associated_to_monomer=.False. - - call find_general_monomer(at,monomer_index,this%signature,associated_to_monomer,this%cutoff,this%atom_ordercheck,error) - if(.not. all(associated_to_monomer)) then - !RAISE_ERROR("general_monomer_calc: not all atoms assigned to a monomer", error) - call print("Not all atoms can be assigned to a monomer with atomic numbers "//this%signature) - endif - n_descriptors = size(monomer_index,2) - call print("found "//n_descriptors//" monomers", PRINT_VERBOSE) - n_index = size(this%signature) - - allocate(descriptor_out%x(n_descriptors)) - do i = 1, n_descriptors - if(my_do_descriptor) then - allocate(descriptor_out%x(i)%data(d)) - allocate(descriptor_out%x(i)%ci(n_index)) - descriptor_out%x(i)%data = 0.0_dp - descriptor_out%x(i)%ci = 0 - descriptor_out%x(i)%has_data = .false. - descriptor_out%x(i)%covariance_cutoff = 1.0_dp - endif - if(my_do_grad_descriptor) then - allocate(descriptor_out%x(i)%grad_data(d,3,monomer_size)) - allocate(descriptor_out%x(i)%ii(monomer_size)) - allocate(descriptor_out%x(i)%pos(3,monomer_size)) - allocate(descriptor_out%x(i)%has_grad_data(monomer_size)) - descriptor_out%x(i)%grad_data = 0.0_dp - descriptor_out%x(i)%ii = 0 - descriptor_out%x(i)%pos = 0.0_dp - descriptor_out%x(i)%has_grad_data = .false. - - allocate(descriptor_out%x(i)%grad_covariance_cutoff(3,monomer_size)) - descriptor_out%x(i)%grad_covariance_cutoff = 0.0_dp - endif - enddo - - - do i = 1, n_descriptors - - atomic_index = monomer_index(:,i) !stores the indices of atoms in this monomer -!write(*,*) "THE ATOMS IN THE MONOMER ARE : "// atomic_index - - if(associated(atom_mask_pointer)) then - if(.not. any(atom_mask_pointer(atomic_index))) then - cycle - else - if(.not. all(atom_mask_pointer(atomic_index))) then - RAISE_ERROR("general_monomer_calc: atom mask has to encompass either all or none of the atoms of a monomer",error) - endif - endif - endif - - !calc all positions relative to atom 1 - do i_atomic=2,monomer_size - temp_shift=0 - interatomic_vectors(1,i_atomic,:) = diff_min_image(at,atomic_index(1),atomic_index(i_atomic),shift=temp_shift) - shifts(i_atomic,:) = temp_shift - end do - - !find other relative positions through vector addition - do j_atomic=2,monomer_size - do i_atomic=2,j_atomic-1 - interatomic_vectors(i_atomic,j_atomic,:) = interatomic_vectors(1,j_atomic,:) -interatomic_vectors(1,i_atomic,:) - end do - end do - - !Now convert vectors to scalar distances - do i_atomic=1,monomer_size - do j_atomic=i_atomic+1,monomer_size - interatomic_distances(i_atomic,j_atomic) = norm(interatomic_vectors(i_atomic,j_atomic,:)) - end do - end do -!!$do i_atomic=1,size(interatomic_distances,1) -!!$ write(*,'(6F12.8)') interatomic_distances(i_atomic,:) -!!$end do - !and convert this NxN matrix into the required vector length N(N-1)/2 - start = 1 - finish = monomer_size-1 - do i_atomic=1,monomer_size-1 - dist_vec(start:finish) = interatomic_distances(i_atomic,i_atomic+1:monomer_size) - start = finish+1 - finish=finish + monomer_size-i_atomic-1 - end do - - if(my_do_descriptor) then - descriptor_out%x(i)%ci(:) = atomic_index - descriptor_out%x(i)%has_data = .true. - descriptor_out%x(i)%data = dist_vec**this%power - endif - call print("distances: "//dist_vec, PRINT_VERBOSE) - if(my_do_grad_descriptor) then -!!$write(*,*) "doing grad descriptor" - descriptor_out%x(i)%ii(:) = atomic_index -!!$do i_atomic=1,at%N -!!$write(*,*) at%pos(:,atomic_index(i_atomic)) -!!$end do - descriptor_out%x(i)%pos(:,1) = at%pos(:,atomic_index(1)) - do i_atomic =2,monomer_size - descriptor_out%x(i)%pos(:,i_atomic) = at%pos(:,atomic_index(i_atomic)) + matmul(at%lattice,shifts(i_atomic,:)) - end do - - !build the grad_data matrix - descriptor_out%x(i)%has_grad_data(:) = .true. - do k=1,d - !find the pair of atoms contributing to this descriptor - do i_atomic=1,monomer_size - do j_atomic=i_atomic+1,monomer_size - if (interatomic_distances(i_atomic,j_atomic)==dist_vec(k)) then - descriptor_out%x(i)%grad_data(k,:,i_atomic) = -this%power * dist_vec(k)**(this%power-1.0_dp) * interatomic_vectors(i_atomic,j_atomic,:) / interatomic_distances(i_atomic,j_atomic) ! kth descriptor wrt atom i_atomic - descriptor_out%x(i)%grad_data(k,:,j_atomic) = -descriptor_out%x(i)%grad_data(k,:,i_atomic) ! kth descriptor wrt j_atomic -!write(*,*) "descriptor dimension "//k//" wrt atoms "//atomic_index(i_atomic)//" and "//atomic_index(j_atomic) - end if - end do - end do - end do - - - endif - - enddo - - deallocate(shifts) - deallocate(dist_vec) - deallocate(atomic_index) - deallocate(associated_to_monomer) - deallocate(interatomic_vectors) - deallocate(interatomic_distances) - deallocate(monomer_index) - call system_timer('general_monomer_calc') - - endsubroutine general_monomer_calc - - subroutine com_dimer_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - - type(com_dimer), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor!, use_smooth_cutoff - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor, use_smooth_cutoff, double_count - integer :: n_descriptors, dimer_size, i, j, i_atomic, j_atomic, i_desc, n_index - integer :: monomer_one_size, monomer_two_size, n_monomer_one, n_monomer_two, this_pair, diff_loc - integer, dimension(1) :: unit_array - real(dp), dimension(3) :: diff_one_two, com_pos_one, com_pos_two, transdirvec - real(dp) :: dist, primitive_cutoff, primitive_cutoff_grad - real(dp), dimension(:,:), allocatable :: diffs_one, diffs_two, com_pos_diffs - real(dp), dimension(:), allocatable :: weight_one, weight_two - integer, dimension(:), allocatable :: atomic_index, atomic_index_one, atomic_index_two, pairs_diffs_map - integer, dimension(:,:), allocatable :: monomer_one_index, monomer_two_index, monomer_pairs - logical, dimension(:), allocatable :: associated_to_monomer - - - INIT_ERROR(error) - use_smooth_cutoff = .false. - double_count = .false. - call system_timer('com_dimer_calc') - - if(.not. this%initialised) then - RAISE_ERROR("com_dimer_calc: descriptor object not initialised", error) - endif - - if (.not. has_property(at, 'mass')) then - RAISE_ERROR('com_dimer_calc: Atoms has no mass property', error) - end if - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - monomer_one_size =size(this%signature_one) - monomer_two_size =size(this%signature_two) - dimer_size = monomer_one_size + monomer_two_size - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - call finalise(descriptor_out) - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='com_dimer_calc args_str')) then - RAISE_ERROR("com_dimer_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("com_dimer_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - else - atom_mask_pointer => null() - endif - - endif - - allocate(atomic_index(dimer_size)) - allocate(atomic_index_one(monomer_one_size)) - allocate(atomic_index_two(monomer_two_size)) - allocate(diffs_one(3,monomer_one_size)) - allocate(diffs_two(3,monomer_two_size)) - allocate(weight_one(monomer_one_size)) - allocate(weight_two(monomer_two_size)) - - allocate(associated_to_monomer(at%N)) - associated_to_monomer=.false. - - call find_general_monomer(at,monomer_one_index,this%signature_one,associated_to_monomer,this%monomer_one_cutoff,this%atom_ordercheck,error) - if (this%monomers_identical) then - allocate(monomer_two_index(size(monomer_one_index,1),size(monomer_one_index,2))) - monomer_two_index = monomer_one_index - else - call find_general_monomer(at,monomer_two_index,this%signature_two,associated_to_monomer,this%monomer_two_cutoff,this%atom_ordercheck,error) - end if - - if(.not. all(associated_to_monomer)) then - call print("WARNING: com_dimer_calc: not all atoms assigned to a monomer, if you have molecules present other than the following, this is OK") - call print("signature of molecule 1 ") - call print(this%signature_one) - call print("signature of molecule 2 ") - call print(this%signature_two) - endif - - n_monomer_one = size(monomer_one_index,2) - n_monomer_two = size(monomer_two_index,2) - if (n_monomer_one < 1 .or. n_monomer_two < 1) then - if ( this%strict ) then - RAISE_ERROR("com_dimer_calc failed to find at least one of the monomer types, try increasing monomer cutoffs", error) - else - call print("WARNING: com_dimer_calc failed to find at least one of the monomer types, try increasing monomer cutoffs") - end if - end if - - call system_timer('com_dimer_calc: find_monomer_pairs') - if (this%mpifind) then - call print("Using find_monomer_pairs_MPI", PRINT_NERD) - if(associated(atom_mask_pointer)) then - call find_monomer_pairs_MPI(at,monomer_pairs,com_pos_diffs,pairs_diffs_map,monomer_one_index,monomer_two_index,this%monomers_identical,double_count,this%cutoff,error=error,use_com=.true.,atom_mask=atom_mask_pointer) - else - call find_monomer_pairs_MPI(at,monomer_pairs,com_pos_diffs,pairs_diffs_map,monomer_one_index,monomer_two_index,this%monomers_identical,double_count,this%cutoff,error=error,use_com=.true.) - end if - else - call find_monomer_pairs (at,monomer_pairs,com_pos_diffs,pairs_diffs_map,monomer_one_index,monomer_two_index,this%monomers_identical,double_count,this%cutoff,use_com=.true.,error=error) - end if - call system_timer('com_dimer_calc: find_monomer_pairs') - - if ( size(pairs_diffs_map) < 1) then - if ( this%strict ) then - RAISE_ERROR("com_dimer_calc did not find any monomer pairs to make a dimer", error) - else - call print("WARNING: com_dimer_calc did not find any monomer pairs to make a dimer") - end if - end if - - n_descriptors = size(pairs_diffs_map) - n_index = size(this%signature_one) + size(this%signature_two) - - call print("ready to construct "//n_descriptors //" descriptors",PRINT_NERD) - allocate(descriptor_out%x(n_descriptors)) - loop_descriptor_init: do i = 1, n_descriptors - if(my_do_descriptor) then - allocate(descriptor_out%x(i)%data(1)) - allocate(descriptor_out%x(i)%ci(n_index)) - descriptor_out%x(i)%data = 0.0_dp - descriptor_out%x(i)%ci = 0 - descriptor_out%x(i)%has_data = .false. - descriptor_out%x(i)%covariance_cutoff = 1.0_dp - endif - if(my_do_grad_descriptor) then - allocate(descriptor_out%x(i)%grad_data(1,3,dimer_size)) - allocate(descriptor_out%x(i)%ii(dimer_size)) - allocate(descriptor_out%x(i)%pos(3,dimer_size)) - allocate(descriptor_out%x(i)%has_grad_data(dimer_size)) - descriptor_out%x(i)%grad_data = 0.0_dp - descriptor_out%x(i)%ii = 0 - descriptor_out%x(i)%pos = 0.0_dp - descriptor_out%x(i)%has_grad_data = .false. - - allocate(descriptor_out%x(i)%grad_covariance_cutoff(3,dimer_size)) - descriptor_out%x(i)%grad_covariance_cutoff = 0.0_dp - endif - enddo loop_descriptor_init - - if (n_descriptors > 0) then ! only loop over monomers if we actually found any dimers - i_desc = 0 - loop_monomer_one: do i = 1, n_monomer_one - if (.not. any(monomer_pairs(1,:) .eq. i)) cycle - - !get indices of monomer and calc internal distances - atomic_index_one = monomer_one_index(:,i) - - if(associated(atom_mask_pointer)) then - if(.not. any(atom_mask_pointer(atomic_index_one))) then - cycle - else - if(.not. all(atom_mask_pointer(atomic_index_one))) then - RAISE_ERROR("com_dimer_calc: atom mask has to encompass either all or none of the atoms of monomer one",error) - endif - endif - endif - - do i_atomic=1,monomer_one_size - weight_one(i_atomic) = at%mass(atomic_index_one(i_atomic)) - call print("weight_one("//i_atomic//") = "//weight_one(i_atomic), PRINT_NERD) - end do - call print("weight_one = "//weight_one, PRINT_NERD) - call print("sum(weight_one) = "//sum(weight_one), PRINT_NERD) - weight_one = weight_one / sum(weight_one) - call print("weight_one = "//weight_one, PRINT_NERD) - - com_pos_one = centre_of_mass(at, index_list=atomic_index_one) - !calc atomic positions and shifts relative to mean pos for monomer one, and also distances wrt atom 1 - do i_atomic=1,monomer_one_size - diffs_one(:,i_atomic) = diff_min_image(at,at%pos(:,atomic_index_one(i_atomic)),com_pos_one) - end do - - ! Loop through monomers paired with this one to make dimers - loop_monomer_pairs: do - unit_array = maxloc(monomer_pairs(2,:), monomer_pairs(1,:) .eq. i) ! find a monomer paired with i - this_pair = unit_array(1) - - if (this_pair == 0) exit - - !get indices of monomer two - j = monomer_pairs(2,this_pair) - monomer_pairs(:,this_pair) = 0 ! make sure this pair isn't found again - atomic_index_two = monomer_two_index(:,j) - atomic_index=(/atomic_index_one,atomic_index_two/) - - do i_atomic=1,monomer_two_size - weight_two(i_atomic) = at%mass(atomic_index_two(i_atomic)) - end do - weight_two = weight_two / sum(weight_two) - call print("weight_two="//weight_two, PRINT_NERD) - - com_pos_two = centre_of_mass(at, index_list=atomic_index_two) - - ! calc distances and shifts wrt to mean pos this monomer, and distances wrt its first atom - do j_atomic=1,monomer_two_size - diffs_two(:,j_atomic) = diff_min_image(at,at%pos(:,atomic_index_two(j_atomic)),com_pos_two) - end do - - loop_different_shifts: do - unit_array = maxloc(pairs_diffs_map, pairs_diffs_map .eq. this_pair) ! find repeats of this pair with different shifts - diff_loc = unit_array(1) - if (diff_loc == 0) exit - - i_desc = i_desc + 1 - - diff_one_two = com_pos_diffs(:,diff_loc) ! shift between mean positions of these two monomers - pairs_diffs_map(diff_loc) = 0 ! make sure this shifted pair isn't found again - - ! calculate distance - dist = norm(diff_one_two) - call print("COM distance = "//dist, PRINT_NERD) - - calc_descriptor: if(my_do_descriptor) then - descriptor_out%x(i_desc)%has_data = .true. - if(this%transfer_parameters%do_transfer) then - descriptor_out%x(i_desc)%data = transferfunction(dist, this%transfer_parameters) - else - descriptor_out%x(i_desc)%data = dist - end if - descriptor_out%x(i_desc)%ci(:) = atomic_index - descriptor_out%x(i_desc)%covariance_cutoff = 0.0_dp - primitive_cutoff = coordination_function(dist,this%cutoff,this%cutoff_transition_width) - descriptor_out%x(i_desc)%covariance_cutoff = primitive_cutoff - end if calc_descriptor - - calc_grad_descriptor: if(my_do_grad_descriptor) then !calc grads and update - - descriptor_out%x(i_desc)%ii(:) = atomic_index - descriptor_out%x(i_desc)%has_grad_data(:) = .true. - - primitive_cutoff_grad = dcoordination_function(dist,this%cutoff,this%cutoff_transition_width) - - if(this%transfer_parameters%do_transfer) then - transdirvec = transferfunction_grad(dist, this%transfer_parameters) * diff_one_two / dist - else - transdirvec = diff_one_two / dist - endif - - do i_atomic=1,monomer_one_size - descriptor_out%x(i_desc)%pos(:,i_atomic) = com_pos_one - diffs_one(:,i_atomic) - descriptor_out%x(i_desc)%grad_data(1,:,i_atomic) = - weight_one(i_atomic) * transdirvec ! descriptor wrt atom i_atomic - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,i_atomic) = primitive_cutoff_grad * descriptor_out%x(i_desc)%grad_data(1,:,i_atomic) - end do - - do j_atomic=1,monomer_two_size - descriptor_out%x(i_desc)%pos(:,monomer_one_size+j_atomic) = com_pos_one + diff_one_two - diffs_two(:,j_atomic) - descriptor_out%x(i_desc)%grad_data(1,:,monomer_one_size+j_atomic) = weight_two(j_atomic) * transdirvec ! descriptor wrt atom j_atomic - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,monomer_one_size+j_atomic) = primitive_cutoff_grad * descriptor_out%x(i_desc)%grad_data(1,:,monomer_one_size+j_atomic) - end do - - endif calc_grad_descriptor - enddo loop_different_shifts - enddo loop_monomer_pairs - enddo loop_monomer_one - endif ! (n_descriptors > 0) ... still need to deallocate if no dimers were found: - - - deallocate(monomer_one_index) - deallocate(monomer_two_index) - deallocate(monomer_pairs) - deallocate(com_pos_diffs) - deallocate(pairs_diffs_map) - - deallocate(atomic_index) - deallocate(atomic_index_one) - deallocate(atomic_index_two) - deallocate(weight_one) - deallocate(weight_two) - deallocate(diffs_one) - deallocate(diffs_two) - - deallocate(associated_to_monomer) - - call system_timer('com_dimer_calc') - - endsubroutine com_dimer_calc - - subroutine general_dimer_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - - type(general_dimer), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor!, use_smooth_cutoff - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - real(dp) :: r_one_two - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - character(STRING_LENGTH) :: pers_idces_name - logical :: has_atom_mask_name = .false. - logical :: has_pers_idces_name = .false. - logical :: called_from_lammps = .false. - logical, dimension(:), pointer :: atom_mask_pointer - integer, dimension(:), pointer :: pers_idces_pointer - type(atoms), pointer :: at_ordered - - real(dp) :: com_dist, cutoff_grad - logical :: my_do_descriptor, my_do_grad_descriptor, monomers_identical, use_smooth_cutoff, compound_cutoff - integer :: d, n_descriptors, n_cross, dimer_size, i, j, k, n, m, & - i_atomic, j_atomic, start, finish, i_desc, cutoff_pos, n_index - integer :: monomer_one_size, monomer_two_size, n_monomer_one, n_monomer_two, n_products, this_pair, this_shift,diff_loc - integer, dimension(1) :: unit_array - real(dp), dimension(3) :: diff_one_two, temp_diff, mean_pos_one, mean_pos_two, transdirvec - real(dp), dimension(:), allocatable :: dist_vec, primitive_cutoffs, primitive_cutoff_grads - real(dp), dimension(:,:), allocatable :: interatomic_distances, diffs_one, diffs_two, mean_pos_diffs - real(dp), dimension(:,:,:), allocatable :: interatomic_vectors - integer, dimension(3) :: temp_shift, shift_one_two - real(dp), dimension(:), allocatable :: weight_one, weight_two - integer, dimension(:), allocatable :: atomic_index, atomic_index_one, atomic_index_two, pairs_diffs_map - integer, dimension(:,:), allocatable :: monomer_one_index, monomer_two_index, monomer_pairs - logical, dimension(:), allocatable :: associated_to_monomer - - - INIT_ERROR(error) - use_smooth_cutoff = .false. - call system_timer('general_dimer_calc') - - if(.not. this%initialised) then - RAISE_ERROR("general_dimer_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - monomer_one_size =size(this%signature_one) - monomer_two_size =size(this%signature_two) - dimer_size = monomer_one_size + monomer_two_size - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - call finalise(descriptor_out) - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - call param_register(params, 'pers_idces_name', 'NONE', pers_idces_name, has_value_target=has_pers_idces_name, & - help_string="Name of a property in the atoms object giving persistent indices, i.e. atom IDs that do not change from frame to frame") - call param_register(params, 'lammps', 'F', called_from_lammps, help_string="True if the potential was called from LAMMPS") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='general_dimer_calc args_str')) then - RAISE_ERROR("general_dimer_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if (called_from_lammps .and. .not. (has_atom_mask_name .and. has_pers_idces_name)) then - RAISE_ERROR("general_dimer_calc needs BOTH atom mask and persistent indices if called from LAMMPS", error) - endif - - endif - - if (this%use_com .and. .not. has_property(at, 'mass')) then - RAISE_ERROR('general_dimer_calc: Atoms has no mass property', error) - end if - - d = general_dimer_dimensions(this,error) - - compound_cutoff=.True. - if (count(this%cutoff_contributor) == 1) then - compound_cutoff=.False. - else if (count(this%cutoff_contributor) == 0) then - RAISE_ERROR("general_dimer_calc, initialisation of general dimer did not find a pair of heavy atoms to use for calculating cutoff", error) - end if - - allocate(dist_vec(d)) - allocate(primitive_cutoffs(d)) - allocate(primitive_cutoff_grads(d)) - - allocate(atomic_index(dimer_size)) - allocate(atomic_index_one(monomer_one_size)) - allocate(atomic_index_two(monomer_two_size)) - allocate(diffs_one(3,monomer_one_size)) - allocate(diffs_two(3,monomer_two_size)) - allocate(weight_one(monomer_one_size)) - allocate(weight_two(monomer_two_size)) - - allocate(interatomic_vectors(dimer_size,dimer_size,3)) - allocate(interatomic_distances(dimer_size,dimer_size)) - allocate(associated_to_monomer(at%N)) - interatomic_vectors = 0.0_dp - interatomic_distances = 0.0_dp - associated_to_monomer=.false. - - ! Warning: Potential performance hog! (but descriptors expect the atoms object not to be modified...) - ! Should we waste time sorting if we're not finding monomers based on index alone? - ! (i.e. if atom_ordercheck=T)? - if (called_from_lammps) then - allocate(at_ordered) - at_ordered = at - at_ordered%own_this = .true. - call sort(at_ordered, pers_idces_name, error=error) - else - call shallowcopy(at_ordered, at) - endif - - if( has_atom_mask_name ) then - call assign_property_pointer(at_ordered, trim(atom_mask_name), atom_mask_pointer, error) - else - atom_mask_pointer => null() - endif - - call find_general_monomer(at_ordered,monomer_one_index,this%signature_one,associated_to_monomer,this%monomer_one_cutoff,this%atom_ordercheck,error) - if (this%monomers_identical) then - allocate(monomer_two_index(size(monomer_one_index,1),size(monomer_one_index,2))) - monomer_two_index = monomer_one_index - else - call find_general_monomer(at_ordered,monomer_two_index,this%signature_two,associated_to_monomer,this%monomer_two_cutoff,this%atom_ordercheck,error) - end if - - if(.not. all(associated_to_monomer)) then - call print("WARNING: general_dimer_calc: not all atoms assigned to a monomer, if you have molecules present other than the following, this is OK") - call print("signature of molecule 1 ") - call print(this%signature_one) - call print("signature of molecule 2 ") - call print(this%signature_two) - endif - - n_monomer_one = size(monomer_one_index,2) - n_monomer_two = size(monomer_two_index,2) - if (n_monomer_one < 1 .or. n_monomer_two < 1) then - if ( this%strict ) then - RAISE_ERROR("general_dimer_calc,failed to find at least one of the monomer types, try increasing monomer cutoffs", error) - else - call print("WARNING: general_dimer_calc failed to find at least one of the monomer types, try increasing monomer cutoffs") - end if - end if - - call system_timer('general_dimer_calc: find_monomer_pairs') - if (this%mpifind) then - call print("Using find_monomer_pairs_MPI", PRINT_NERD) - if(associated(atom_mask_pointer)) then - call find_monomer_pairs_MPI(at_ordered,monomer_pairs,mean_pos_diffs,pairs_diffs_map,monomer_one_index,monomer_two_index,this%monomers_identical,this%double_count,this%cutoff,error=error,use_com=this%use_com,atom_mask=atom_mask_pointer) - else - call find_monomer_pairs_MPI(at_ordered,monomer_pairs,mean_pos_diffs,pairs_diffs_map,monomer_one_index,monomer_two_index,this%monomers_identical,this%double_count,this%cutoff,error=error,use_com=this%use_com) - end if - else - call find_monomer_pairs(at_ordered,monomer_pairs,mean_pos_diffs,pairs_diffs_map,monomer_one_index,monomer_two_index,this%monomers_identical,this%double_count,this%cutoff,error=error,use_com=this%use_com) - end if - call system_timer('general_dimer_calc: find_monomer_pairs') - - if ( size(pairs_diffs_map) < 1) then - if ( this%strict ) then - RAISE_ERROR("general_dimer_calc did not find any monomer pairs to make a dimer", error) - else - call print("WARNING: general_dimer_calc did not find any monomer pairs to make a dimer") - end if - end if - - n_descriptors = size(pairs_diffs_map) - call print("ready to construct "//n_descriptors //" descriptors",PRINT_NERD) - - n_index = size(this%signature_one) + size(this%signature_two) - - allocate(descriptor_out%x(n_descriptors)) - do i = 1, n_descriptors - if (my_do_descriptor) then - allocate(descriptor_out%x(i)%data(d)) - allocate(descriptor_out%x(i)%ci(n_index)) - descriptor_out%x(i)%data = 0.0_dp - descriptor_out%x(i)%ci = 0 - descriptor_out%x(i)%has_data = .false. - descriptor_out%x(i)%covariance_cutoff = 1.0_dp - end if - if (my_do_grad_descriptor) then - allocate(descriptor_out%x(i)%grad_data(d,3,dimer_size)) - allocate(descriptor_out%x(i)%ii(dimer_size)) - allocate(descriptor_out%x(i)%pos(3,dimer_size)) - allocate(descriptor_out%x(i)%has_grad_data(dimer_size)) - descriptor_out%x(i)%grad_data = 0.0_dp - descriptor_out%x(i)%ii = 0 - descriptor_out%x(i)%pos = 0.0_dp - descriptor_out%x(i)%has_grad_data = .false. - - allocate(descriptor_out%x(i)%grad_covariance_cutoff(3,dimer_size)) - descriptor_out%x(i)%grad_covariance_cutoff = 0.0_dp - end if - end do - - has_descriptors: if (n_descriptors > 0) then ! only loop over monomers if we actually found any dimers - i_desc = 0 - loop_monomer_one: do i = 1, n_monomer_one - if (.not. any(monomer_pairs(1,:) .eq. i)) cycle - - !get indices of monomer and calc internal distances - atomic_index_one = monomer_one_index(:,i) - - if (associated(atom_mask_pointer)) then - if (.not. any(atom_mask_pointer(atomic_index_one))) then - cycle - else - if (.not. all(atom_mask_pointer(atomic_index_one))) then - if (this%strict_mask) then - RAISE_ERROR("general_dimer_calc: atom mask has to encompass either all or none of the atoms of monomer one",error) - else - call print("general_dimer_calc: atom mask encompasses only part of a monomer; deciding based on first atom.", PRINT_NERD) - if (.not. atom_mask_pointer(atomic_index_one(1))) then - cycle - end if - end if - end if - end if - end if - - if (this%use_com) then - do i_atomic=1,monomer_one_size - weight_one(i_atomic) = at_ordered%mass(atomic_index_one(i_atomic)) - end do - weight_one = weight_one / sum(weight_one) - mean_pos_one = centre_of_mass(at_ordered, index_list=atomic_index_one) - else - weight_one = 1.0_dp / monomer_one_size - mean_pos_one = calc_mean_pos(at_ordered,atomic_index_one) - end if - - - !calc atomic positions and shifts relative to mean pos for monomer one, and also distances wrt atom 1 - do i_atomic=1,monomer_one_size - diffs_one(:,i_atomic) = diff_min_image(at_ordered,at_ordered%pos(:,atomic_index_one(i_atomic)),mean_pos_one) - interatomic_vectors(1,i_atomic,:) = diff_min_image(at_ordered,atomic_index_one(1),atomic_index_one(i_atomic)) - end do - - !find other relative positions through vector addition - do j_atomic=2,monomer_one_size - do i_atomic=2,j_atomic-1 - interatomic_vectors(i_atomic,j_atomic,:) = interatomic_vectors(1,j_atomic,:) -interatomic_vectors(1,i_atomic,:) - end do - end do - - !And convert vectors to scalar distances - do i_atomic=1,monomer_one_size - do j_atomic=i_atomic+1,monomer_one_size - interatomic_distances(i_atomic,j_atomic) = norm(interatomic_vectors(i_atomic,j_atomic,:)) - end do - end do - - ! Loop through monomers paired with this one to make dimers - loop_monomer_pairs: do - unit_array = maxloc(monomer_pairs(2,:), monomer_pairs(1,:) .eq. i) ! find a monomer paired with i - this_pair = unit_array(1) - - if (this_pair == 0) exit - - !get indices of monomer two - j = monomer_pairs(2,this_pair) - monomer_pairs(:,this_pair) = 0 ! make sure this pair isn't found again - atomic_index_two = monomer_two_index(:,j) - atomic_index=(/atomic_index_one,atomic_index_two/) - - if (this%use_com) then - do j_atomic=1,monomer_two_size - weight_two(j_atomic) = at_ordered%mass(atomic_index_two(j_atomic)) - end do - weight_two = weight_two / sum(weight_two) - mean_pos_two = centre_of_mass(at_ordered, index_list=atomic_index_two) - else - weight_two = 1.0_dp / monomer_two_size - mean_pos_two = calc_mean_pos(at_ordered,atomic_index_two) - end if - - ! calc distances and shifts wrt to mean pos this monomer, and distances wrt its first atom - do i_atomic=1,monomer_two_size - diffs_two(:,i_atomic) = diff_min_image(at_ordered,at_ordered%pos(:,atomic_index_two(i_atomic)),mean_pos_two) - interatomic_vectors(monomer_one_size+1,monomer_one_size+i_atomic,:) = diff_min_image(at_ordered,atomic_index_two(1),atomic_index_two(i_atomic)) - end do - - !find other relative positions through vector addition - do j_atomic=monomer_one_size+2,dimer_size - do i_atomic=monomer_one_size+2,j_atomic-1 - interatomic_vectors(i_atomic,j_atomic,:) = interatomic_vectors(monomer_one_size+1,j_atomic,:) - interatomic_vectors(monomer_one_size+1,i_atomic,:) - end do - end do - - !And convert vectors to scalar distances - do i_atomic=monomer_one_size+1,dimer_size - do j_atomic=i_atomic+1,dimer_size - interatomic_distances(i_atomic,j_atomic) = norm(interatomic_vectors(i_atomic,j_atomic,:)) - end do - end do - - loop_pair_shifts: do - unit_array = maxloc(pairs_diffs_map, pairs_diffs_map .eq. this_pair) ! find repeats of this pair with different shifts - diff_loc = unit_array(1) - if (diff_loc == 0) exit - - i_desc = i_desc + 1 - - diff_one_two = mean_pos_diffs(:,diff_loc) ! shift between mean positions of these two monomers - pairs_diffs_map(diff_loc) = 0 ! make sure this shifted pair isn't found again - - com_dist = norm(diff_one_two) - - ! calculate intermolecular distances, also by vector addition - do i_atomic=1,monomer_one_size - do j_atomic = monomer_one_size+1,dimer_size - interatomic_vectors(i_atomic,j_atomic,:) = diffs_one(:,i_atomic) + diff_one_two - diffs_two(:,j_atomic-monomer_one_size) - interatomic_distances(i_atomic,j_atomic) = norm(interatomic_vectors(i_atomic,j_atomic,:)) - end do - end do - - !Now take the whole matrix of scalar distances and combine into 1D array - start = 1 - finish = dimer_size-1 - do i_atomic=1,dimer_size-1 - dist_vec(start:finish) = interatomic_distances(i_atomic,i_atomic+1:dimer_size) - start = finish+1 - finish=finish + dimer_size-i_atomic-1 - end do - call print("dist vec "//dist_vec,PRINT_NERD) - - primitive_cutoffs=1.0_dp - do k=1,d - if (this%cutoff_contributor(k)) then - primitive_cutoffs(k) = coordination_function(dist_vec(k),this%cutoff,this%cutoff_transition_width) - end if - end do - - calc_descriptor: if (my_do_descriptor) then - descriptor_out%x(i_desc)%has_data = .true. - - do_transfer: if (this%transfer_parameters%do_transfer) then - do k=1,d - if (this%is_intermolecular(k)) then - descriptor_out%x(i_desc)%data(k) = transferfunction(dist_vec(k), this%transfer_parameters) - else - ! don't apply transfer function to intra-molecular (bond) distances - descriptor_out%x(i_desc)%data(k) = dist_vec(k) - end if - end do - else - descriptor_out%x(i_desc)%data = dist_vec**this%power - end if do_transfer - - descriptor_out%x(i_desc)%ci(:) = atomic_index - descriptor_out%x(i_desc)%covariance_cutoff = 0.0_dp - - is_com_cutoff: if (this%mpifind) then - descriptor_out%x(i_desc)%covariance_cutoff = coordination_function(com_dist, this%cutoff, this%cutoff_transition_width) - else - - is_compound_cutoff: if (compound_cutoff) then - ! Covariance cutoff is sum of pairwise products of primitive cutoffs for all *inter*molecular distances excluding H atoms - - n_products=0 - do k=1,d - if (this%cutoff_contributor(k)) then - do m=k+1,d - if (this%cutoff_contributor(m)) then - n_products = n_products + 1 - descriptor_out%x(i_desc)%covariance_cutoff = descriptor_out%x(i_desc)%covariance_cutoff + primitive_cutoffs(k)*primitive_cutoffs(m) - end if - end do - end if - end do - ! normalise - descriptor_out%x(i_desc)%covariance_cutoff = descriptor_out%x(i_desc)%covariance_cutoff / n_products - - else ! Covariance cutoff is primitive cutoff, i.e. there is only one pair of heavy atoms - - do k=1,d - if (this%cutoff_contributor(k)) then - cutoff_pos=k - descriptor_out%x(i_desc)%covariance_cutoff = coordination_function(dist_vec(k),this%cutoff,this%cutoff_transition_width) - exit - end if - end do - - end if is_compound_cutoff - - end if is_com_cutoff - end if calc_descriptor - - calc_grad_descriptor: if (my_do_grad_descriptor) then !calc grads and update - - descriptor_out%x(i_desc)%ii(:) = atomic_index - - do i_atomic=1,monomer_one_size - descriptor_out%x(i_desc)%pos(:,i_atomic) = mean_pos_one - diffs_one(:,i_atomic) - end do - do i_atomic=1,monomer_two_size - descriptor_out%x(i_desc)%pos(:,monomer_one_size+i_atomic) = mean_pos_one + diff_one_two - diffs_two(:,i_atomic) - end do - - call print("DIMER "//dimer_size,PRINT_NERD) - call print('DIMER Lattice="10.0000000 0.00000000 0.00000000 0.00000000 10.0000000 0.00000000 0.00000000 0.00000000 10.00000" Properties=Z:I:1:pos:R:3',PRINT_NERD) - do i_atomic=1,dimer_size - call print("DIMER "//at_ordered%Z(atomic_index(i_atomic))//" "//descriptor_out%x(i_desc)%pos(:,i_atomic),PRINT_NERD) - end do - - !build the grad_data matrix - descriptor_out%x(i_desc)%has_grad_data(:) = .true. - - do k=1,d - !get pair of atoms contributing to this component - i_atomic = this%component_atoms(k,1) - j_atomic = this%component_atoms(k,2) - do_transfer_grad: if (this%transfer_parameters%do_transfer .and. this%is_intermolecular(k)) then - descriptor_out%x(i_desc)%grad_data(k,:,i_atomic) = -transferfunction_grad(dist_vec(k), this%transfer_parameters) * interatomic_vectors(i_atomic,j_atomic,:) / interatomic_distances(i_atomic,j_atomic) ! descriptor wrt atom i_atomic, using a transfer function - else - descriptor_out%x(i_desc)%grad_data(k,:,i_atomic) = - this%power * dist_vec(k)**(this%power-1.0_dp) * & - interatomic_vectors(i_atomic,j_atomic,:) / interatomic_distances(i_atomic,j_atomic) ! descriptor wrt atom i_atomic - end if do_transfer_grad - descriptor_out%x(i_desc)%grad_data(k,:,j_atomic) = -descriptor_out%x(i_desc)%grad_data(k,:,i_atomic) ! descriptor wrt j_atomic - end do - - is_com_cutoff_grad: if (this%mpifind) then - transdirvec = diff_one_two / com_dist - - cutoff_grad = dcoordination_function(com_dist, this%cutoff, this%cutoff_transition_width) - do i_atomic=1,monomer_one_size - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,i_atomic) = - weight_one(i_atomic) * transdirvec * cutoff_grad - end do - do j_atomic=1,monomer_two_size - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,monomer_one_size+j_atomic) = weight_two(j_atomic) * transdirvec * cutoff_grad - end do - else - - primitive_cutoff_grads=0.0_dp - do k=1,d - if (this%cutoff_contributor(k)) then - primitive_cutoff_grads(k) = dcoordination_function(dist_vec(k),this%cutoff,this%cutoff_transition_width) - end if - end do - - is_compound_cutoff_grad: if (compound_cutoff) then - - do i_atomic=1,dimer_size ! for each atom in the dimer... - do k=1,d ! ...iterate over all distance... - if (this%cutoff_contributor(k)) then - do m=k+1,d ! ...pairs involved... - if (this%cutoff_contributor(m)) then - if (any(this%component_atoms(k,:) == i_atomic) .or. any(this%component_atoms(m,:) == i_atomic)) then - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,i_atomic) & - = descriptor_out%x(i_desc)%grad_covariance_cutoff(:,i_atomic) & - + primitive_cutoffs(m)*primitive_cutoff_grads(k)*descriptor_out%x(i_desc)%grad_data(k,:,i_atomic) & - + primitive_cutoffs(k)*primitive_cutoff_grads(m)*descriptor_out%x(i_desc)%grad_data(m,:,i_atomic) - end if - end if - end do - end if - end do - end do - !normalisation factor - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,:) = descriptor_out%x(i_desc)%grad_covariance_cutoff(:,:) / n_products - - else - - i_atomic = this%component_atoms(cutoff_pos,1) - j_atomic = this%component_atoms(cutoff_pos,2) - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,i_atomic) = primitive_cutoff_grads(cutoff_pos) *descriptor_out%x(i_desc)%grad_data(cutoff_pos,:,i_atomic) - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,j_atomic) = primitive_cutoff_grads(cutoff_pos) *descriptor_out%x(i_desc)%grad_data(cutoff_pos,:,j_atomic) - - end if is_compound_cutoff_grad - - end if is_com_cutoff_grad - end if calc_grad_descriptor - - end do loop_pair_shifts - end do loop_monomer_pairs - end do loop_monomer_one - end if has_descriptors ! (n_descriptors > 0) ... still need to deallocate if no dimers were found: - - call finalise_ptr(at_ordered) - - deallocate(monomer_one_index) - deallocate(monomer_two_index) - deallocate(monomer_pairs) - deallocate(mean_pos_diffs) - deallocate(pairs_diffs_map) - - deallocate(dist_vec) - deallocate(primitive_cutoffs) - deallocate(primitive_cutoff_grads) - - deallocate(atomic_index) - deallocate(atomic_index_one) - deallocate(atomic_index_two) - deallocate(weight_one) - deallocate(weight_two) - deallocate(diffs_one) - deallocate(diffs_two) - - deallocate(interatomic_vectors) - deallocate(interatomic_distances) - deallocate(associated_to_monomer) - - call system_timer('general_dimer_calc') - - end subroutine general_dimer_calc - - subroutine general_trimer_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - - type(general_trimer), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor!, use_smooth_cutoff - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - real(dp) :: r_one_two - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor, one_two_identical, one_three_identical, two_three_identical, & - use_smooth_cutoff, done_this_monomer, done_this_dimer - - integer :: d, n_descriptors, n_cross, dimer_size, trimer_size, & - i, j, k, n, m, i_atomic, j_atomic, start, finish, i_desc,this_diff,triplet_pos, & - n_index - integer :: monomer_one_size, monomer_two_size, monomer_three_size, n_monomer_one, n_monomer_two, n_monomer_three, n_products, contributor_loc - integer, dimension(1) :: unit_array - real(dp) :: temp_dist - real(dp), dimension(3) :: diff_one_two, diff_one_three,diff_two_three,mean_pos_one,mean_pos_two,mean_pos_three - real(dp), dimension(3) :: grad_cut_one, grad_cut_two, grad_cut_three - real(dp) :: dist_one_two, dist_one_three, dist_two_three, cut12, cut13, cut23, dcut12, dcut13, dcut23 - real(dp), dimension(:), allocatable :: dist_vec, primitive_cutoffs, primitive_cutoff_grads - real(dp), dimension(:,:), allocatable :: interatomic_distances,diffs_one,diffs_two,diffs_three,triplets_diffs - real(dp), dimension(:,:,:), allocatable :: interatomic_vectors - integer, dimension(3) :: temp_shift, shift_one_two,shift_one_three - integer, dimension(:), allocatable :: atomic_index_dimer, atomic_index_trimer, atomic_index_one, atomic_index_two, atomic_index_three,triplets_diffs_map - integer, dimension(:,:), allocatable :: monomer_one_index, monomer_two_index, monomer_three_index, monomer_triplets - logical, dimension(:), allocatable :: associated_to_monomer - logical :: double_count - - INIT_ERROR(error) - use_smooth_cutoff = .false. - double_count=.false. - call system_timer('general_trimer_calc') - - if(.not. this%initialised) then - RAISE_ERROR("general_trimer_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - monomer_one_size =size(this%signature_one) - monomer_two_size =size(this%signature_two) - monomer_three_size =size(this%signature_three) - dimer_size = monomer_one_size + monomer_two_size - trimer_size = monomer_one_size + monomer_two_size + monomer_three_size - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - call finalise(descriptor_out) - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='general_trimer_calc args_str')) then - RAISE_ERROR("general_trimer_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("general_trimer_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - else - atom_mask_pointer => null() - endif - - endif - - d = general_trimer_dimensions(this,error) - - allocate(dist_vec(d)) - allocate(primitive_cutoffs(d)) - allocate(primitive_cutoff_grads(d)) - - allocate(atomic_index_one(monomer_one_size)) - allocate(atomic_index_two(monomer_two_size)) - allocate(atomic_index_three(monomer_three_size)) - allocate(atomic_index_dimer(dimer_size)) - allocate(atomic_index_trimer(trimer_size)) - - allocate(interatomic_vectors(trimer_size,trimer_size,3)) - allocate(interatomic_distances(trimer_size,trimer_size)) - allocate(associated_to_monomer(at%N)) - allocate(diffs_one(3,monomer_one_size)) - allocate(diffs_two(3,monomer_two_size)) - allocate(diffs_three(3,monomer_three_size)) - - interatomic_vectors = 0.0_dp - interatomic_distances = 0.0_dp - associated_to_monomer=.false. - - call find_general_monomer(at,monomer_one_index,this%signature_one,associated_to_monomer,this%monomer_one_cutoff,this%atom_ordercheck,error) - if (this%one_two_identical) then - allocate(monomer_two_index(size(monomer_one_index,1),size(monomer_one_index,2))) - monomer_two_index = monomer_one_index - else - call find_general_monomer(at,monomer_two_index,this%signature_two,associated_to_monomer,this%monomer_two_cutoff,this%atom_ordercheck,error) - end if - if (this%one_three_identical) then - allocate(monomer_three_index(size(monomer_one_index,1),size(monomer_one_index,2))) - monomer_three_index = monomer_one_index - else if (this%two_three_identical) then - allocate(monomer_three_index(size(monomer_two_index,1),size(monomer_two_index,2))) - monomer_three_index = monomer_two_index - else - call find_general_monomer(at,monomer_three_index,this%signature_three,associated_to_monomer,this%monomer_three_cutoff,this%atom_ordercheck,error) - end if - - if(.not. all(associated_to_monomer)) then - if(this%strict) then - RAISE_ERROR("general_trimer_calc: not all atoms assigned to a monomer", error) - else - call print("WARNING: general_trimer_calc: not all atoms assigned to a monomer") - endif - endif - - n_monomer_one = size(monomer_one_index,2) - n_monomer_two = size(monomer_two_index,2) - n_monomer_three = size(monomer_three_index,2) - - if (this%use_com) then - RAISE_ERROR("general_trimer_calc: use_com=T not implemented yet", error) - end if - call system_timer('general_trimer_calc: find_monomer_triplets') - if(this%mpifind) then - call print("Using find_monomer_triplets_MPI", PRINT_NERD) - if(associated(atom_mask_pointer)) then - call find_monomer_triplets_MPI(at,monomer_triplets,triplets_diffs,triplets_diffs_map,monomer_one_index,monomer_two_index,monomer_three_index,this%one_two_identical,this%one_three_identical,this%two_three_identical,this%cutoff,error,use_com=.false.,atom_mask=atom_mask_pointer) - else - call find_monomer_triplets_MPI(at,monomer_triplets,triplets_diffs,triplets_diffs_map,monomer_one_index,monomer_two_index,monomer_three_index,this%one_two_identical,this%one_three_identical,this%two_three_identical,this%cutoff,error,use_com=.false.) - end if - else - call find_monomer_triplets(at,monomer_triplets,triplets_diffs,triplets_diffs_map,monomer_one_index,monomer_two_index,monomer_three_index,this%one_two_identical,this%one_three_identical,this%two_three_identical,this%cutoff,error) - end if - call system_timer('general_trimer_calc: find_monomer_triplets') - call print("monomer_triplets("//size(monomer_triplets,1)//", "//size(monomer_triplets,2)//")", PRINT_NERD) - call print("triplets_diffs("//size(triplets_diffs,1)//", "//size(triplets_diffs,2)//")", PRINT_NERD) - call print("triplets_diffs_map("//size(triplets_diffs_map)//")", PRINT_NERD) - - !call print("monomer_triplets",PRINT_NERD) - !call print(monomer_triplets,PRINT_NERD) - - n_descriptors = size(triplets_diffs_map) - n_index = size(this%signature_one) + size(this%signature_two) + size(this%signature_three) - - call print("ready to construct "//n_descriptors //" descriptors",PRINT_NERD) - allocate(descriptor_out%x(n_descriptors)) - do i = 1, n_descriptors - if(my_do_descriptor) then - allocate(descriptor_out%x(i)%data(d)) - allocate(descriptor_out%x(i)%ci(n_index)) - descriptor_out%x(i)%data = 0.0_dp - descriptor_out%x(i)%ci = 0 - descriptor_out%x(i)%has_data = .false. - descriptor_out%x(i)%covariance_cutoff = 1.0_dp - endif - if(my_do_grad_descriptor) then - allocate(descriptor_out%x(i)%grad_data(d,3,trimer_size)) - allocate(descriptor_out%x(i)%ii(trimer_size)) - allocate(descriptor_out%x(i)%pos(3,trimer_size)) - allocate(descriptor_out%x(i)%has_grad_data(trimer_size)) - descriptor_out%x(i)%grad_data = 0.0_dp - descriptor_out%x(i)%ii = 0 - descriptor_out%x(i)%pos = 0.0_dp - descriptor_out%x(i)%has_grad_data = .false. - - allocate(descriptor_out%x(i)%grad_covariance_cutoff(3,trimer_size)) - descriptor_out%x(i)%grad_covariance_cutoff = 0.0_dp - endif - enddo - - has_descriptors: if (n_descriptors > 0) then ! only loop over monomers if we actually found any trimers - i_desc = 0 - loop_monomer_one: do i = 1, n_monomer_one - if (.not. any(monomer_triplets(1,:) .eq. i)) cycle - done_this_monomer = .false. - !get indices of monomer and calc internal distances - atomic_index_one = monomer_one_index(:,i) !store the indices of atoms in this monomer - - if(associated(atom_mask_pointer)) then - if(.not. any(atom_mask_pointer(atomic_index_one))) then - cycle - else - if(.not. all(atom_mask_pointer(atomic_index_one))) then - RAISE_ERROR("general_trimer_calc: atom mask has to encompass either all or none of the atoms of monomer one",error) - endif - endif - endif - - mean_pos_one = calc_mean_pos(at,atomic_index_one) - - !calc atomic positions and shifts relative to mean pos for monomer one, and also distances wrt atom 1 - do i_atomic=1,monomer_one_size - diffs_one(:,i_atomic) = diff_min_image(at,at%pos(:,atomic_index_one(i_atomic)),mean_pos_one) - interatomic_vectors(1,i_atomic,:) = diff_min_image(at,atomic_index_one(1),atomic_index_one(i_atomic)) - end do - - !find other relative positions through vector addition - do j_atomic=2,monomer_one_size - do i_atomic=2,j_atomic-1 - interatomic_vectors(i_atomic,j_atomic,:) = interatomic_vectors(1,j_atomic,:) -interatomic_vectors(1,i_atomic,:) - end do - end do - - !Now convert vectors to scalar distances - do i_atomic=1,monomer_one_size - do j_atomic=i_atomic+1,monomer_one_size - interatomic_distances(i_atomic,j_atomic) = norm(interatomic_vectors(i_atomic,j_atomic,:)) - end do - end do - - ! Loop through monomers paired with this one to make dimers - loop_monomer_pairs: do - unit_array = maxloc(monomer_triplets(2,:), monomer_triplets(1,:) .eq. i) ! find a monomer paired with i - if (all(unit_array .eq. 0)) exit - - !get indices of monomer two - j = monomer_triplets(2,unit_array(1)) - atomic_index_two = monomer_two_index(:,j) - atomic_index_dimer=(/atomic_index_one,atomic_index_two/) - - mean_pos_two = calc_mean_pos(at,atomic_index_two) - - ! calc distances and shifts wrt to mean pos this monomer, and distances wrt its first atom - do i_atomic=1,monomer_two_size - diffs_two(:,i_atomic) = diff_min_image(at,at%pos(:,atomic_index_two(i_atomic)),mean_pos_two) - interatomic_vectors(monomer_one_size+1,monomer_one_size+i_atomic,:) = diff_min_image(at,atomic_index_two(1),atomic_index_two(i_atomic)) - end do - - !find other relative positions through vector addition - do j_atomic=monomer_one_size+2,dimer_size - do i_atomic=monomer_one_size+2,j_atomic-1 - interatomic_vectors(i_atomic,j_atomic,:) = interatomic_vectors(monomer_one_size+1,j_atomic,:) - interatomic_vectors(monomer_one_size+1,i_atomic,:) - end do - end do - - !And convert vectors to scalar distances - do i_atomic=monomer_one_size+1,dimer_size - do j_atomic=i_atomic+1,dimer_size - interatomic_distances(i_atomic,j_atomic) = norm(interatomic_vectors(i_atomic,j_atomic,:)) - end do - end do - - !! Now make trimers based on this dimer - loop_triplets: do - unit_array = maxloc(monomer_triplets(3,:), monomer_triplets(1,:) .eq. i .and. monomer_triplets(2,:) .eq. j ) ! look for a triplet - if (all(unit_array .eq. 0)) exit - triplet_pos=unit_array(1) - - !get indices of monomer three - k = monomer_triplets(3,triplet_pos) - monomer_triplets(:,triplet_pos) = 0 ! make sure this triplet isn't found again - atomic_index_three = monomer_three_index(:,k) - atomic_index_trimer=(/atomic_index_dimer,atomic_index_three/) - mean_pos_three = calc_mean_pos(at,atomic_index_three) - ! calc distances and shifts wrt to mean pos this monomer, and distances wrt its first atom - do i_atomic=1,monomer_three_size - diffs_three(:,i_atomic) = diff_min_image(at,at%pos(:,atomic_index_three(i_atomic)),mean_pos_three) - interatomic_vectors(dimer_size+1,dimer_size+i_atomic,:) = diff_min_image(at,atomic_index_three(1),atomic_index_three(i_atomic)) - end do - - !find other relative positions through vector addition - do j_atomic=dimer_size+2,trimer_size - do i_atomic=dimer_size+2,j_atomic-1 - interatomic_vectors(i_atomic,j_atomic,:) = interatomic_vectors(dimer_size+1,j_atomic,:) -interatomic_vectors(dimer_size+1,i_atomic,:) - end do - end do - - !Now convert vectors to scalar distances - do i_atomic=dimer_size+1,trimer_size - do j_atomic=i_atomic+1,trimer_size - interatomic_distances(i_atomic,j_atomic) = norm(interatomic_vectors(i_atomic,j_atomic,:)) - end do - end do - - ! Loop over all trimers which can be created from these three monomers, i.e. with different periodic images - loop_trimers: do - unit_array = maxloc(triplets_diffs_map, triplets_diffs_map .eq. triplet_pos) - this_diff = unit_array(1) - if (this_diff == 0) exit - - i_desc = i_desc + 1 - - diff_one_two = triplets_diffs(1:3,this_diff) - diff_one_three = triplets_diffs(4:6,this_diff) - diff_two_three = diff_one_three - diff_one_two - triplets_diffs_map(this_diff)=0 ! make sure this shifted triplet isn't found again - dist_one_two = norm(diff_one_two) - dist_one_three = norm(diff_one_three) - dist_two_three = norm(diff_two_three) - - ! calculate intermolecular distances, monomers one and two - do i_atomic=1,monomer_one_size - do j_atomic = monomer_one_size+1,dimer_size - interatomic_vectors(i_atomic,j_atomic,:) = diffs_one(:,i_atomic) + diff_one_two - diffs_two(:,j_atomic-monomer_one_size) - interatomic_distances(i_atomic,j_atomic) = norm(interatomic_vectors(i_atomic,j_atomic,:)) - end do - end do - - ! calculate intermolecular distances, monomers one and three - do i_atomic=1,monomer_one_size - do j_atomic = dimer_size+1,trimer_size - interatomic_vectors(i_atomic,j_atomic,:) = diffs_one(:,i_atomic) + diff_one_three - diffs_three(:,j_atomic-dimer_size) - interatomic_distances(i_atomic,j_atomic) = norm(interatomic_vectors(i_atomic,j_atomic,:)) - end do - end do - - ! calculate intermolecular distances, monomers two and three - do i_atomic=monomer_one_size+1,dimer_size - do j_atomic = dimer_size+1,trimer_size - interatomic_vectors(i_atomic,j_atomic,:) = diffs_two(:,i_atomic-monomer_one_size) + diff_two_three - diffs_three(:,j_atomic-dimer_size) - interatomic_distances(i_atomic,j_atomic) = norm(interatomic_vectors(i_atomic,j_atomic,:)) - end do - end do - - !Now take the whole matrix of scalar distances and combine into 1D array - start = 1 - finish=trimer_size-1 - do i_atomic=1,trimer_size-1 - dist_vec(start:finish) = interatomic_distances(i_atomic,i_atomic+1:trimer_size) - start = finish+1 - finish=finish + trimer_size-i_atomic-1 - end do - call print( "list of distances: "//dist_vec,PRINT_NERD) - - calc_descriptor: if(my_do_descriptor) then - descriptor_out%x(i_desc)%has_data = .true. - descriptor_out%x(i_desc)%data = dist_vec**this%power - descriptor_out%x(i_desc)%ci(:) = atomic_index_trimer - - cutoff_type: if (this%mpifind) then - cut12 = coordination_function(dist_one_two, this%cutoff, this%cutoff_transition_width) - cut13 = coordination_function(dist_one_three, this%cutoff, this%cutoff_transition_width) - cut23 = coordination_function(dist_two_three, this%cutoff, this%cutoff_transition_width) - descriptor_out%x(i_desc)%covariance_cutoff = (cut12*cut13 + cut12*cut23 + cut13*cut23)/3.0_dp - else - descriptor_out%x(i_desc)%covariance_cutoff = 0.0_dp - - primitive_cutoffs=1.0_dp - - do k=1,d - if (this%cutoff_contributor(k)) then - primitive_cutoffs(k) = coordination_function(dist_vec(k),this%cutoff,this%cutoff_transition_width) - end if - end do - n_products=0 - do k=1,d - if (this%cutoff_contributor(k)) then - do m=k+1,d - if (this%cutoff_contributor(m)) then - n_products=n_products+1 - descriptor_out%x(i_desc)%covariance_cutoff = descriptor_out%x(i_desc)%covariance_cutoff + primitive_cutoffs(k)*primitive_cutoffs(m) - end if - end do - end if - end do - ! normalise - descriptor_out%x(i_desc)%covariance_cutoff = descriptor_out%x(i_desc)%covariance_cutoff / n_products - end if cutoff_type - end if calc_descriptor - - calc_grad_descriptor: if(my_do_grad_descriptor) then !calc grads and update - - descriptor_out%x(i_desc)%ii(:) = atomic_index_trimer - do i_atomic=1,monomer_one_size - descriptor_out%x(i_desc)%pos(:,i_atomic) = mean_pos_one - diffs_one(:,i_atomic) - end do - do i_atomic=1,monomer_two_size - descriptor_out%x(i_desc)%pos(:,monomer_one_size+i_atomic) = mean_pos_one + diff_one_two - diffs_two(:,i_atomic) - end do - do i_atomic=1,monomer_three_size - descriptor_out%x(i_desc)%pos(:,dimer_size+i_atomic) = mean_pos_one + diff_one_three - diffs_three(:,i_atomic) - end do - - call print("TRIM 9",PRINT_NERD) - call print('TRIM Lattice="10.0000000 0.00000000 0.00000000 0.00000000 10.0000000 0.00000000 0.00000000 0.00000000 10.00000" Properties=Z:I:1:pos:R:3',PRINT_NERD) - do i_atomic=1,trimer_size - call print("TRIM "//at%Z(atomic_index_trimer(i_atomic))//" "//descriptor_out%x(i_desc)%pos(:,i_atomic),PRINT_NERD) - end do - - !build the grad_data matrix - descriptor_out%x(i_desc)%has_grad_data(:) = .true. - do k=1,d - i_atomic = this%component_atoms(k,1) - j_atomic = this%component_atoms(k,2) - descriptor_out%x(i_desc)%grad_data(k,:,i_atomic) = - this%power * dist_vec(k)**(this%power-1.0_dp) * interatomic_vectors(i_atomic,j_atomic,:) / interatomic_distances(i_atomic,j_atomic) ! descriptor wrt atom i_atomic - descriptor_out%x(i_desc)%grad_data(k,:,j_atomic) = -descriptor_out%x(i_desc)%grad_data(k,:,i_atomic) ! descriptor wrt j_atomic - end do - - cutoff_type_grad: if (this%mpifind) then - cut12 = coordination_function(dist_one_two, this%cutoff, this%cutoff_transition_width) - cut13 = coordination_function(dist_one_three, this%cutoff, this%cutoff_transition_width) - cut23 = coordination_function(dist_two_three, this%cutoff, this%cutoff_transition_width) - dcut12 = dcoordination_function(dist_one_two, this%cutoff, this%cutoff_transition_width) - dcut13 = dcoordination_function(dist_one_three, this%cutoff, this%cutoff_transition_width) - dcut23 = dcoordination_function(dist_two_three, this%cutoff, this%cutoff_transition_width) - !descriptor_out%x(i_desc)%covariance_cutoff = (cut12*cut13 + cut12*cut23 + cut13*cut23)/3.0_dp - grad_cut_one = (- diff_one_two / dist_one_two * dcut12 * (cut13+cut23) & - - diff_one_three / dist_one_three * dcut13 * (cut12+cut23)) / 3.0_dp - grad_cut_two = ( diff_one_two / dist_one_two * dcut12 * (cut13+cut23) & - - diff_two_three / dist_two_three * dcut23 * (cut12+cut13)) / 3.0_dp - grad_cut_three = (diff_one_three / dist_one_three * dcut13 * (cut12+cut23) & - + diff_two_three / dist_two_three * dcut23 * (cut12+cut13)) / 3.0_dp - do i_atomic=1,monomer_one_size - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,i_atomic) = grad_cut_one / real(monomer_one_size,dp) - end do - do i_atomic=1,monomer_two_size - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,monomer_one_size+i_atomic) = grad_cut_two / real(monomer_two_size,dp) - end do - do i_atomic=1,monomer_three_size - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,dimer_size+i_atomic) = grad_cut_three / real(monomer_three_size,dp) - end do - else - primitive_cutoff_grads=0.0_dp - do k=1,d - if (this%cutoff_contributor(k)) then - primitive_cutoff_grads(k) = dcoordination_function(dist_vec(k),this%cutoff,this%cutoff_transition_width) - end if - end do - - do i_atomic=1,trimer_size - do k=1,d - if (this%cutoff_contributor(k) ) then - do m=k+1,d - if (this%cutoff_contributor(m)) then - if (any(this%component_atoms(k,:) == i_atomic) .or. any(this%component_atoms(m,:) == i_atomic)) then - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,i_atomic) = descriptor_out%x(i_desc)%grad_covariance_cutoff(:,i_atomic) & - + primitive_cutoffs(m)*primitive_cutoff_grads(k)*descriptor_out%x(i_desc)%grad_data(k,:,i_atomic) & - + primitive_cutoffs(k)*primitive_cutoff_grads(m)*descriptor_out%x(i_desc)%grad_data(m,:,i_atomic) - end if - end if - end do - end if - end do - end do - - !normalisation factor - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,:) = descriptor_out%x(i_desc)%grad_covariance_cutoff(:,:) / n_products - end if cutoff_type_grad - - end if calc_grad_descriptor - - end do loop_trimers - end do loop_triplets - end do loop_monomer_pairs - end do loop_monomer_one - end if has_descriptors ! (n_descriptors > 0) ... still need to deallocate if no trimers were found: - - deallocate(monomer_one_index) - deallocate(monomer_two_index) - deallocate(monomer_three_index) - if (allocated(monomer_triplets)) deallocate(monomer_triplets) - if (allocated(triplets_diffs)) deallocate(triplets_diffs) - if (allocated(triplets_diffs_map)) deallocate(triplets_diffs_map) - - deallocate(dist_vec) - deallocate(primitive_cutoffs) - deallocate(primitive_cutoff_grads) - - deallocate(atomic_index_dimer) - deallocate(atomic_index_trimer) - deallocate(atomic_index_one) - deallocate(atomic_index_two) - deallocate(atomic_index_three) - deallocate(diffs_one) - deallocate(diffs_two) - deallocate(diffs_three) - - deallocate(interatomic_vectors) - deallocate(interatomic_distances) - deallocate(associated_to_monomer) - - - call system_timer('general_trimer_calc') - - endsubroutine general_trimer_calc - - subroutine rdf_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(rdf), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor - integer :: d, i, j, n, i_n, l_n_neighbours, i_desc, n_descriptors, n_cross, n_index - integer, dimension(3) :: shift - real(dp) :: r_ij, f_cut, df_cut - real(dp), dimension(3) :: u_ij - real(dp), dimension(:), allocatable :: rdf_ij - - INIT_ERROR(error) - - call system_timer('rdf_calc') - - if(.not. this%initialised) then - RAISE_ERROR("rdf_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='rdf_calc args_str')) then - RAISE_ERROR("rdf_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("rdf_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - else - atom_mask_pointer => null() - endif - - endif - - call finalise(descriptor_out) - - d = rdf_dimensions(this,error) - allocate(rdf_ij(d)) - - if(associated(atom_mask_pointer)) then - call descriptor_sizes(this,at,n_descriptors,n_cross, & - mask=atom_mask_pointer,n_index=n_index,error=error) - else - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - endif - - allocate(descriptor_out%x(n_descriptors)) - i_desc = 0 - do i = 1, at%N - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - if(associated(atom_mask_pointer)) then - if(.not. atom_mask_pointer(i)) cycle - endif - - i_desc = i_desc + 1 - if(my_do_descriptor) then - allocate(descriptor_out%x(i_desc)%data(d)) - descriptor_out%x(i_desc)%data = 0.0_dp - allocate(descriptor_out%x(i_desc)%ci(n_index)) - descriptor_out%x(i_desc)%has_data = .false. - - descriptor_out%x(i_desc)%covariance_cutoff = 1.0_dp - endif - if(my_do_grad_descriptor) then - l_n_neighbours = n_neighbours(at,i,max_dist=this%cutoff) - - allocate(descriptor_out%x(i_desc)%grad_data(d,3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%ii(0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%pos(3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%has_grad_data(0:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_data = 0.0_dp - descriptor_out%x(i_desc)%ii = 0 - descriptor_out%x(i_desc)%pos = 0.0_dp - descriptor_out%x(i_desc)%has_grad_data = .false. - - allocate(descriptor_out%x(i_desc)%grad_covariance_cutoff(3,0:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_covariance_cutoff = 0.0_dp - endif - enddo - - i_desc = 0 - do i = 1, at%N - - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - if(associated(atom_mask_pointer)) then - if(.not. atom_mask_pointer(i)) cycle - endif - i_desc = i_desc + 1 - - if(my_do_descriptor) then - descriptor_out%x(i_desc)%ci(1) = i - descriptor_out%x(i_desc)%has_data = .true. - endif - if(my_do_grad_descriptor) then - descriptor_out%x(i_desc)%ii(0) = i - descriptor_out%x(i_desc)%pos(:,0) = at%pos(:,i) - descriptor_out%x(i_desc)%has_grad_data(0) = .true. - endif - - i_n = 0 - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij, cosines = u_ij, shift=shift) - - if( r_ij >= this%cutoff ) cycle - i_n = i_n + 1 - - rdf_ij = exp( -0.5_dp * (r_ij - this%r_gauss)**2 / this%w_gauss**2 ) - f_cut = coordination_function(r_ij,this%cutoff,this%transition_width) - - if(my_do_descriptor) & - descriptor_out%x(i_desc)%data = descriptor_out%x(i_desc)%data + rdf_ij * f_cut - - if(my_do_grad_descriptor) then - df_cut = dcoordination_function(r_ij,this%cutoff,this%transition_width) - - descriptor_out%x(i_desc)%ii(i_n) = j - descriptor_out%x(i_desc)%pos(:,i_n) = at%pos(:,j) + matmul(at%lattice,shift) - descriptor_out%x(i_desc)%has_grad_data(i_n) = .true. - - descriptor_out%x(i_desc)%grad_data(:,:,i_n) = ( - ( rdf_ij * (r_ij - this%r_gauss) / this%w_gauss**2 ) * f_cut + rdf_ij * df_cut ) .outer. u_ij - descriptor_out%x(i_desc)%grad_data(:,:,0) = descriptor_out%x(i_desc)%grad_data(:,:,0) - descriptor_out%x(i_desc)%grad_data(:,:,i_n) - endif - enddo - enddo - - if(allocated(rdf_ij)) deallocate(rdf_ij) - - call system_timer('rdf_calc') - - endsubroutine rdf_calc - - subroutine as_distance_2b_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(as_distance_2b), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(descriptor) :: my_coordination - type(descriptor_data) :: descriptor_coordination - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor, Zi1, Zi2, Zj1, Zj2 - integer :: d, n_descriptors, n_cross, i_desc, i, j, k, n, m, & - n_neighbours_coordination_i, n_neighbours_coordination_ij, n_index - integer, dimension(3) :: shift - real(dp) :: r_ij, r_ik, r_jk, cos_ijk, cos_jik, f_cut_i, f_cut_j, f_cut_ij, f_cut_ik, f_cut_jk, f_cut_as_i, f_cut_as_j, rho_i, rho_j - real(dp), dimension(3) :: u_ij, u_ik, u_jk - - INIT_ERROR(error) - call system_timer('as_distance_2b_calc') - - if(.not. this%initialised) then - RAISE_ERROR("as_distance_2b_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - call finalise(descriptor_out) - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='as_distance_2b_calc args_str')) then - RAISE_ERROR("as_distance_2b_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("as_distance_2b_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - RAISE_ERROR("as_distance_2b_calc cannot use atom masks yet.",error) - else - atom_mask_pointer => null() - endif - - endif - - d = as_distance_2b_dimensions(this,error) - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - - - allocate(descriptor_out%x(n_descriptors)) - i_desc = 0 - do i = 1, at%N - Zi1 = (this%Z1 == 0) .or. (at%Z(i) == this%Z1) - Zi2 = (this%Z2 == 0) .or. (at%Z(i) == this%Z2) - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance=r_ij, cosines=u_ij) - - if(r_ij > this%max_cutoff .or. r_ij < this%min_cutoff) cycle - - Zj1 = (this%Z1 == 0) .or. (at%Z(j) == this%Z1) - Zj2 = (this%Z2 == 0) .or. (at%Z(j) == this%Z2) - if( .not. ( ( Zi1 .and. Zj2 ) .or. ( Zi2 .and. Zj1 ) ) ) cycle ! this pair doesn't belong to the descriptor type - - rho_i = 0.0_dp - f_cut_i = 0.0_dp - - do m = 1, n_neighbours(at,i) - k = neighbour(at, i, m, distance=r_ik, cosines=u_ik) - - if(r_ik > this%coordination_cutoff) cycle - - cos_ijk = dot_product(u_ij,u_ik) - f_cut_ik = coordination_function(r_ik,this%coordination_cutoff,this%coordination_transition_width) - - f_cut_i = f_cut_i + f_cut_ik - rho_i = rho_i + 0.5_dp * ( erf(cos_ijk/this%overlap_alpha) + 1.0_dp ) * f_cut_ik**2 - enddo - - rho_i = rho_i / f_cut_i - - if(rho_i > this%as_cutoff) cycle - - rho_j = 0.0_dp - f_cut_j = 0.0_dp - - do m = 1, n_neighbours(at,j) - k = neighbour(at, j, m, distance=r_jk, cosines=u_jk) - - if(r_jk > this%coordination_cutoff) cycle - - cos_jik = dot_product(-u_ij,u_jk) - f_cut_jk = coordination_function(r_jk,this%coordination_cutoff,this%coordination_transition_width) - - f_cut_j = f_cut_j + f_cut_jk - rho_j = rho_j + 0.5_dp * ( erf(cos_jik/this%overlap_alpha) + 1.0_dp ) * f_cut_jk**2 - enddo - - if(rho_j > this%as_cutoff) cycle - ! all three conditions fulfilled: pair within lower and upper cutoff, asymmetricity lower than threshold - - i_desc = i_desc + 1 - if(my_do_descriptor) then - allocate(descriptor_out%x(i_desc)%data(d)) - descriptor_out%x(i_desc)%data = 0.0_dp - allocate(descriptor_out%x(i_desc)%ci(n_index)) - descriptor_out%x(i_desc)%has_data = .false. - endif - - if(my_do_grad_descriptor) then - n_neighbours_coordination_ij = n_neighbours(at,i,max_dist=this%coordination_cutoff) + & - n_neighbours(at,j,max_dist=this%coordination_cutoff) + 2 - - allocate(descriptor_out%x(i_desc)%grad_data(d,3,0:1+n_neighbours_coordination_ij)) - allocate(descriptor_out%x(i_desc)%ii(0:1+n_neighbours_coordination_ij)) - allocate(descriptor_out%x(i_desc)%pos(3,0:1+n_neighbours_coordination_ij)) - allocate(descriptor_out%x(i_desc)%has_grad_data(0:1+n_neighbours_coordination_ij)) - descriptor_out%x(i_desc)%grad_data = 0.0_dp - descriptor_out%x(i_desc)%ii = 0 - descriptor_out%x(i_desc)%pos = 0.0_dp - descriptor_out%x(i_desc)%has_grad_data = .false. - - allocate(descriptor_out%x(i_desc)%grad_covariance_cutoff(3,0:1+n_neighbours_coordination_ij)) - descriptor_out%x(i_desc)%grad_covariance_cutoff = 0.0_dp - endif - enddo - enddo - - i_desc = 0 - do i = 1, at%N - Zi1 = (this%Z1 == 0) .or. (at%Z(i) == this%Z1) - Zi2 = (this%Z2 == 0) .or. (at%Z(i) == this%Z2) - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij, cosines = u_ij, shift=shift) - - if(r_ij > this%max_cutoff .or. r_ij < this%min_cutoff) cycle - - Zj1 = (this%Z1 == 0) .or. (at%Z(j) == this%Z1) - Zj2 = (this%Z2 == 0) .or. (at%Z(j) == this%Z2) - if( .not. ( ( Zi1 .and. Zj2 ) .or. ( Zi2 .and. Zj1 ) ) ) cycle ! this pair doesn't belong to the descriptor type - - rho_i = 0.0_dp - f_cut_i = 0.0_dp - - do m = 1, n_neighbours(at,i) - k = neighbour(at, i, m, distance=r_ik, cosines=u_ik) - - if(r_ik > this%coordination_cutoff) cycle - - cos_ijk = dot_product(u_ij,u_ik) - f_cut_ik = coordination_function(r_ik,this%coordination_cutoff,this%coordination_transition_width) - - f_cut_i = f_cut_i + f_cut_ik - rho_i = rho_i + 0.5_dp * ( erf(cos_ijk/this%overlap_alpha) + 1.0_dp ) * f_cut_ik**2 - enddo - - rho_i = rho_i / f_cut_i - - if(rho_i > this%as_cutoff) cycle - - rho_j = 0.0_dp - f_cut_j = 0.0_dp - - do m = 1, n_neighbours(at,j) - k = neighbour(at, j, m, distance=r_jk, cosines=u_jk) - - if(r_jk > this%coordination_cutoff) cycle - - cos_jik = dot_product(-u_ij,u_jk) - f_cut_jk = coordination_function(r_jk,this%coordination_cutoff,this%coordination_transition_width) - - f_cut_j = f_cut_j + f_cut_jk - rho_j = rho_j + 0.5_dp * ( erf(cos_jik/this%overlap_alpha) + 1.0_dp ) * f_cut_jk**2 - enddo - - if(rho_j > this%as_cutoff) cycle - ! all three conditions fulfilled: pair within lower and upper cutoff, asymmetricity lower than threshold - - i_desc = i_desc + 1 - - f_cut_ij = coordination_function(r_ij,this%max_cutoff,this%max_transition_width,this%min_cutoff,this%min_transition_width) - f_cut_as_i = coordination_function(rho_i,this%as_cutoff, this%as_transition_width) - f_cut_as_j = coordination_function(rho_j,this%as_cutoff, this%as_transition_width) - - if(my_do_descriptor) then - descriptor_out%x(i_desc)%ci(1:2) = (/i,j/) - - descriptor_out%x(i_desc)%has_data = .true. - - descriptor_out%x(i_desc)%data(1) = r_ij - descriptor_out%x(i_desc)%data(2) = f_cut_i + f_cut_j - descriptor_out%x(i_desc)%data(3) = (f_cut_i - f_cut_j)**2 - - descriptor_out%x(i_desc)%covariance_cutoff = f_cut_ij * f_cut_as_i * f_cut_as_j - endif - if(my_do_grad_descriptor) then - n_neighbours_coordination_i = n_neighbours(at,i,max_dist=this%coordination_cutoff) - - descriptor_out%x(i_desc)%ii(0) = i - descriptor_out%x(i_desc)%pos(:,0) = at%pos(:,i) - descriptor_out%x(i_desc)%has_grad_data(0) = .true. - descriptor_out%x(i_desc)%grad_data(1,:,0) = -u_ij(:) - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,0) = -dcoordination_function(r_ij,this%coordination_cutoff,this%coordination_transition_width)*u_ij - - !descriptor_out%x(i_desc)%ii(1) = j - !descriptor_out%x(i_desc)%pos(:,1) = at%pos(:,j) + matmul(at%lattice,shift) - !descriptor_out%x(i_desc)%has_grad_data(1) = .true. - !descriptor_out%x(i_desc)%grad_data(1,:,1) = u_ij(:) - !descriptor_out%x(i_desc)%grad_covariance_cutoff(:,1) = -descriptor_out%x(i_desc)%grad_covariance_cutoff(:,0) - - !descriptor_out%x(i_desc)%ii(2:n_neighbours_coordination_i+2) = descriptor_coordination%x(i)%ii(:) - !descriptor_out%x(i_desc)%pos(:,2:n_neighbours_coordination_i+2) = descriptor_coordination%x(i)%pos(:,:) - !descriptor_out%x(i_desc)%has_grad_data(2:n_neighbours_coordination_i+2) = descriptor_coordination%x(i)%has_grad_data(:) - !descriptor_out%x(i_desc)%grad_data(2,:,2:n_neighbours_coordination_i+2) = descriptor_coordination%x(i)%grad_data(1,:,:) - !descriptor_out%x(i_desc)%grad_data(3,:,2:n_neighbours_coordination_i+2) = 2.0_dp*(descriptor_coordination%x(i)%data(1) - descriptor_coordination%x(j)%data(1))*& - ! descriptor_coordination%x(i)%grad_data(1,:,:) - - !descriptor_out%x(i_desc)%ii(n_neighbours_coordination_i+3:) = descriptor_coordination%x(j)%ii(:) - !descriptor_out%x(i_desc)%pos(:,n_neighbours_coordination_i+3:) = descriptor_coordination%x(j)%pos(:,:) - !descriptor_out%x(i_desc)%has_grad_data(n_neighbours_coordination_i+3:) = descriptor_coordination%x(j)%has_grad_data(:) - !descriptor_out%x(i_desc)%grad_data(2,:,n_neighbours_coordination_i+3:) = descriptor_coordination%x(j)%grad_data(1,:,:) - !descriptor_out%x(i_desc)%grad_data(3,:,n_neighbours_coordination_i+3:) = -2.0_dp*(descriptor_coordination%x(i)%data(1) - descriptor_coordination%x(j)%data(1))*& - ! descriptor_coordination%x(j)%grad_data(1,:,:) - - endif - enddo - enddo - - call finalise(my_coordination) - call finalise(descriptor_coordination) - - call system_timer('as_distance_2b_calc') - - endsubroutine as_distance_2b_calc - - subroutine molecule_lo_d_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(molecule_lo_d), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor!, use_smooth_cutoff - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor - integer :: d, n_descriptors, n_cross, i, j, i_atomic, j_atomic, k, & - start, finish, molecule_size, i_component, i_desc, n_index - integer, dimension(3) :: temp_shift - real(dp), dimension(:), allocatable :: dist_vec - real(dp), dimension(:,:), allocatable :: interatomic_distances - real(dp), dimension(:,:,:), allocatable :: interatomic_vectors - integer, dimension(:), allocatable :: atomic_index - integer, dimension(:,:), allocatable :: shifts - logical, dimension(:), allocatable :: associated_to_molecule - - - INIT_ERROR(error) - - call system_timer('molecule_lo_d_calc') - - if(.not. this%initialised) then - RAISE_ERROR("molecule_lo_d_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - call finalise(descriptor_out) - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='molecule_lo_d_calc args_str')) then - RAISE_ERROR("molecule_lo_d_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("molecule_lo_d_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - RAISE_ERROR("molecule_lo_d_calc cannot use atom masks yet.",error) - else - atom_mask_pointer => null() - endif - - endif - - molecule_size=this%n_atoms - d = molecule_lo_d_dimensions(this,error) - - if (this%atom_ordercheck) then - do i=1,molecule_size - if (this%template_atoms%Z(i) /= at%Z(i)) then - call print("atoms in all input frams should be in the same order as this template : ") - call print(this%template_atoms) - RAISE_ERROR("molecule_lo_d_calc: atoms not in same order as in template used to teach", error) - end if - end do - end if - - allocate(shifts(molecule_size,3)) - allocate(dist_vec(this%max_dimension)) - allocate(atomic_index(molecule_size)) - - allocate(associated_to_molecule(at%N)) - associated_to_molecule=.True. - do i=1,molecule_size - atomic_index(i) = i - end do - - - allocate(interatomic_vectors(molecule_size,molecule_size,3)) - allocate(interatomic_distances(molecule_size,molecule_size)) - interatomic_vectors = 0.0_dp - interatomic_distances = 0.0_dp - -! call find_general_monomer(at,monomer_index,this%signature,associated_to_monomer,this%cutoff,this%atom_ordercheck,error) - - if(.not. all(associated_to_molecule)) then - RAISE_ERROR("molecule_lo_d_calc: not all atoms assigned to a monomer", error) - endif - - n_descriptors = 1 ! currently no support for finding multiple nontrivial molecules, otherwise would be size(monomer_index,2) - n_index = this%n_atoms - - allocate(descriptor_out%x(n_descriptors)) - do i = 1, n_descriptors - if(my_do_descriptor) then - allocate(descriptor_out%x(i)%data(d)) - allocate(descriptor_out%x(i)%ci(n_index)) - descriptor_out%x(i)%data = 0.0_dp - descriptor_out%x(i)%has_data = .false. - descriptor_out%x(i)%covariance_cutoff = 1.0_dp - endif - if(my_do_grad_descriptor) then - allocate(descriptor_out%x(i)%grad_data(d,3,molecule_size)) - allocate(descriptor_out%x(i)%ii(molecule_size)) - allocate(descriptor_out%x(i)%pos(3,molecule_size)) - allocate(descriptor_out%x(i)%has_grad_data(molecule_size)) - descriptor_out%x(i)%grad_data = 0.0_dp - descriptor_out%x(i)%ii = 0 - descriptor_out%x(i)%pos = 0.0_dp - descriptor_out%x(i)%has_grad_data = .false. - - allocate(descriptor_out%x(i)%grad_covariance_cutoff(3,molecule_size)) - descriptor_out%x(i)%grad_covariance_cutoff = 0.0_dp - endif - enddo - - - do i_desc = 1, n_descriptors - - !atomic_index = monomer_index(:,i) !for fixed ordering don't need this - ! for now calculate all O(N^2) distances and just pick out the ones we want - - !calc all positions relative to atom 1 - do i_atomic=2,molecule_size - temp_shift=0 - interatomic_vectors(1,i_atomic,:) = diff_min_image(at,atomic_index(1),atomic_index(i_atomic),shift=temp_shift) - shifts(i_atomic,:) = temp_shift - end do - - !find other relative positions through vector addition - do j_atomic=2,molecule_size - do i_atomic=2,j_atomic-1 - interatomic_vectors(i_atomic,j_atomic,:) = interatomic_vectors(1,j_atomic,:) -interatomic_vectors(1,i_atomic,:) - end do - end do - - !Now convert vectors to scalar distances - do i_atomic=1,molecule_size - do j_atomic=i_atomic+1,molecule_size - interatomic_distances(i_atomic,j_atomic) = norm(interatomic_vectors(i_atomic,j_atomic,:)) - end do - end do - - !and convert this NxN matrix into the required vector length N(N-1)/2 - start = 1 - finish = molecule_size-1 - do i_atomic=1,molecule_size-1 - dist_vec(start:finish) = interatomic_distances(i_atomic,i_atomic+1:molecule_size) - start = finish+1 - finish=finish + molecule_size-i_atomic-1 - end do - - - - if(my_do_descriptor) then - descriptor_out%x(i_desc)%ci(:) = atomic_index - descriptor_out%x(i_desc)%has_data = .true. - if(this%desctype == 0) then - descriptor_out%x(i_desc)%data = dist_vec(this%included_components) ! here's where we pick out the components - else if(this%desctype == 1) then - descriptor_out%x(i_desc)%data = 1.0_dp / dist_vec(this%included_components) - else if(this%desctype == 2) then - do k=1,d - i_component = this%included_components(k) - i_atomic = this%component_atoms(i_component,1) - j_atomic = this%component_atoms(i_component,2) - descriptor_out%x(i_desc)%data(k) = real(at%Z(i_atomic)*at%Z(j_atomic)) / dist_vec(i_component) - end do - else if(this%desctype == 3) then - descriptor_out%x(i_desc)%data = exp(-dist_vec(this%included_components)) - else if(this%desctype < 0) then - descriptor_out%x(i_desc)%data = dist_vec(this%included_components)**this%desctype - else - RAISE_ERROR("molecule_lo_d_calc: not implemented descriptor type",error) - end if - endif -!call print(descriptor_out%x(i_desc)%data) -!!$ -!!$ do i_component=1,d -!!$ write(*,*) 'component : ',i_component -!!$ write(*,*) 'value : ',descriptor_out%x(i_desc)%data(i_component) -!!$ write(*,*) 'atoms : ',this%component_atoms(this%included_components(i_component),:) -!!$ write(*,*) 'dist_mat_entry : ',interatomic_distances(this%component_atoms(this%included_components(i_component),1),this%component_atoms(this%included_components(i_component),2)) -!!$ end do - - if(my_do_grad_descriptor) then - - descriptor_out%x(i_desc)%ii(:) = atomic_index - descriptor_out%x(i_desc)%pos(:,1) = at%pos(:,atomic_index(1)) - do i_atomic =2,molecule_size - descriptor_out%x(i_desc)%pos(:,i_atomic) = at%pos(:,atomic_index(i_atomic)) + matmul(at%lattice,shifts(i_atomic,:)) - end do - - !build the grad_data matrix - descriptor_out%x(i_desc)%has_grad_data(:) = .true. - - - do k=1,d - !get pair of atoms contributing to this component - i_component = this%included_components(k) - i_atomic = this%component_atoms(i_component,1) - j_atomic = this%component_atoms(i_component,2) - - if(this%desctype == 0) then - descriptor_out%x(i_desc)%grad_data(k,:,i_atomic) = -interatomic_vectors(i_atomic,j_atomic,:) / interatomic_distances(i_atomic,j_atomic) ! descriptor wrt atom i_atomic - else if(this%desctype == 1) then - descriptor_out%x(i_desc)%grad_data(k,:,i_atomic) = interatomic_vectors(i_atomic,j_atomic,:) / interatomic_distances(i_atomic,j_atomic)**3 ! descriptor wrt atom i_atomic - else if(this%desctype == 2) then - descriptor_out%x(i_desc)%grad_data(k,:,i_atomic) = real(at%Z(i_atomic)*at%Z(j_atomic)) * interatomic_vectors(i_atomic,j_atomic,:) / interatomic_distances(i_atomic,j_atomic)**3 ! descriptor wrt atom i_atomic - else if(this%desctype == 3) then - descriptor_out%x(i_desc)%grad_data(k,:,i_atomic) = interatomic_vectors(i_atomic,j_atomic,:) / interatomic_distances(i_atomic,j_atomic) * exp(-interatomic_distances(i_atomic,j_atomic)) - else if(this%desctype < 0) then - descriptor_out%x(i_desc)%grad_data(k,:,i_atomic) = -real(this%desctype) * interatomic_vectors(i_atomic,j_atomic,:) * interatomic_distances(i_atomic,j_atomic)**(this%desctype-2) - else - RAISE_ERROR("molecule_lo_d_calc: not implemented descriptortype",error) - end if - descriptor_out%x(i_desc)%grad_data(k,:,j_atomic) = -descriptor_out%x(i_desc)%grad_data(k,:,i_atomic) ! descriptor wrt j_atomic -! call print(descriptor_out%x(i_desc)%grad_data(k,:,:)) - end do - - endif - - enddo - deallocate(shifts) - deallocate(dist_vec) - deallocate(atomic_index) - deallocate(interatomic_vectors) - deallocate(interatomic_distances) - - call system_timer('molecule_lo_d_calc') - - endsubroutine molecule_lo_d_calc - - subroutine alex_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(alex), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor - - integer :: i, j, n, d, p, q, r, a, b, c, n_i, n_radial, pp, i_desc, & - l_n_neighbours, desc_index, n_cross, n_descriptors, n_index - integer, dimension(3) :: shift_ij - real(dp) :: r_ij - real(dp), dimension(3) :: d_ij - real(dp), dimension(:), allocatable :: neighbour_dists - real(dp), dimension(:,:), allocatable :: neighbour_vecs - integer, dimension(total_elements) :: species_map - real(dp), allocatable :: S0(:), S1(:,:), S2(:,:,:), S0der(:,:,:), S1der(:,:,:,:), S2der(:,:,:,:,:) - - INIT_ERROR(error) - - call system_timer('alex_calc') - - if(.not. this%initialised) then - RAISE_ERROR("alex_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='alex_calc args_str')) then - RAISE_ERROR("alex_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("alex_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - else - atom_mask_pointer => null() - endif - - endif - - species_map = 0 - do i = 1, size(this%species_Z) - if(this%species_Z(i) == 0) then - species_map = 1 - else - species_map(this%species_Z(i)) = i - endif - enddo - - call finalise(descriptor_out) - - d = alex_dimensions(this,error) - - if(associated(atom_mask_pointer)) then - call descriptor_sizes(this,at,n_descriptors,n_cross, & - mask=atom_mask_pointer,n_index=n_index,error=error) - else - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - endif - - allocate(descriptor_out%x(n_descriptors)) - - n_radial = this%power_max-this%power_min+1 - - i_desc = 0 - do i = 1, at%N - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - if(associated(atom_mask_pointer)) then - if(.not. atom_mask_pointer(i)) cycle - endif - i_desc = i_desc + 1 - - if(my_do_descriptor) then - allocate(descriptor_out%x(i_desc)%data(d)) - descriptor_out%x(i_desc)%data = 0.0_dp - allocate(descriptor_out%x(i_desc)%ci(n_index)) - descriptor_out%x(i_desc)%has_data = .false. - descriptor_out%x(i_desc)%covariance_cutoff = 1.0_dp - endif - if(my_do_grad_descriptor) then - l_n_neighbours = n_neighbours(at,i,max_dist=this%cutoff) - - allocate(descriptor_out%x(i_desc)%grad_data(d,3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%ii(0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%pos(3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%has_grad_data(0:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_data = 0.0_dp - descriptor_out%x(i_desc)%ii = 0 - descriptor_out%x(i_desc)%pos = 0.0_dp - descriptor_out%x(i_desc)%has_grad_data = .false. - - allocate(descriptor_out%x(i_desc)%grad_covariance_cutoff(3,0:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_covariance_cutoff = 0.0_dp - endif - enddo - - - i_desc = 0 - do i = 1, at%N - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - if(associated(atom_mask_pointer)) then - if(.not. atom_mask_pointer(i)) cycle - endif - i_desc = i_desc + 1 - - if(my_do_descriptor) then - descriptor_out%x(i_desc)%ci(1) = i - descriptor_out%x(i_desc)%has_data = .true. - endif - if(my_do_grad_descriptor) then - descriptor_out%x(i_desc)%ii(0) = i - descriptor_out%x(i_desc)%pos(:,0) = at%pos(:,i) - descriptor_out%x(i_desc)%has_grad_data(0) = .true. - endif - - ! number of neighbours for the current atom within the descriptor cutoff - l_n_neighbours = n_neighbours(at,i,max_dist=this%cutoff) - allocate(neighbour_vecs(3,l_n_neighbours), neighbour_dists(l_n_neighbours)) - allocate(S0(n_radial), S1(3,n_radial), S2(3,3,n_radial)) - if(my_do_grad_descriptor) then - allocate( & - S0der(n_radial,l_n_neighbours,3), & - S1der(3,n_radial,l_n_neighbours,3), & - S2der(3,3,n_radial,l_n_neighbours,3) ) - endif - - n_i = 0 - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij, diff=d_ij) - if( r_ij >= this%cutoff ) cycle - n_i = n_i + 1 - neighbour_vecs(:,n_i) = d_ij - neighbour_dists(n_i) = r_ij - end do - - do p = 1,n_radial - pp = -(p+this%power_min-1) - S0(p) = sum(neighbour_dists**pp) - if(my_do_grad_descriptor) then - do n_i = 1, l_n_neighbours - S0der(p,n_i,:) = pp * neighbour_dists(n_i)**(pp-2) * neighbour_vecs(:,n_i) - enddo - endif - - S1(:,p) = matmul(neighbour_vecs, neighbour_dists**pp) - !do a = 1,3 - !S1(a, p) = sum(neighbour_vecs(a,:)*neighbour_dists**pp) - !end do - if(my_do_grad_descriptor) then - do n_i = 1, l_n_neighbours - do a = 1,3 - S1der(a,p,n_i,:) = pp * neighbour_dists(n_i)**(pp-2) * neighbour_vecs(a,n_i) * neighbour_vecs(:,n_i) - S1der(a,p,n_i,a) = S1der(a,p,n_i,a) + neighbour_dists(n_i)**pp - end do - enddo - endif - - !do a=1,3 - do b=1,3 - S2(:,b,p) = matmul(neighbour_vecs, neighbour_vecs(b,:)*neighbour_dists**pp) - !S2(a,b,p) = sum(neighbour_vecs(a,:)*neighbour_vecs(b,:)*neighbour_dists**pp) - end do - !end do - - if(my_do_grad_descriptor) then - do n_i = 1, l_n_neighbours - do a = 1,3 - do b = 1,3 - S2der(a,b,p,n_i,:) = pp * neighbour_dists(n_i)**(pp-2) * neighbour_vecs(a,n_i) * neighbour_vecs(b,n_i) * neighbour_vecs(:,n_i) - end do - end do - - do a = 1,3 - do b = 1,3 - S2der(a,b,p,n_i,b) = S2der(a,b,p,n_i,b) + neighbour_dists(n_i)**pp * neighbour_vecs(a,n_i) - S2der(a,b,p,n_i,a) = S2der(a,b,p,n_i,a) + neighbour_dists(n_i)**pp * neighbour_vecs(b,n_i) - end do - end do - enddo - endif - end do - - descriptor_out%x(i_desc)%data(1:n_radial) = S0 - descriptor_out%x(i_desc)%data(n_radial+1:n_radial+n_radial**2) = reshape(matmul(transpose(S1), S1), (/n_radial**2/)) - desc_index = n_radial+n_radial**2+1 - do p = 1,n_radial - do q = 1,n_radial - descriptor_out%x(i_desc)%data(desc_index) = sum(S2(:,:,p) * S2(:,:,q)) - desc_index = desc_index + 1 - end do - end do - - do p = 1,n_radial - do q = 1,n_radial - do r = 1,n_radial - descriptor_out%x(i_desc)%data(desc_index) = dot_product(S1(:,p), matmul(S2(:,:,q), S1(:,r))) - desc_index = desc_index + 1 - end do - end do - end do - - if(my_do_grad_descriptor) then - n_i = 0 - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij, shift=shift_ij) - if( r_ij >= this%cutoff ) cycle - - n_i = n_i + 1 - - descriptor_out%x(i_desc)%ii(n_i) = j - descriptor_out%x(i_desc)%pos(:,n_i) = at%pos(:,j) + matmul(at%lattice,shift_ij) - descriptor_out%x(i_desc)%has_grad_data(n_i) = .true. - - descriptor_out%x(i_desc)%grad_data(1:n_radial,:,n_i) = S0der(:,n_i,:) - - desc_index = n_radial + 1 - do p = 1,n_radial - do q = 1,n_radial - do a = 1, 3 - do c = 1, 3 - descriptor_out%x(i_desc)%grad_data(desc_index,c,n_i) = descriptor_out%x(i_desc)%grad_data(desc_index,c,n_i) + & - S1der(a,p,n_i,c)*S1(a,q) + S1(a,p)*S1der(a,q,n_i,c) - enddo - enddo - desc_index = desc_index + 1 - enddo - enddo - - do p = 1, n_radial - do q = 1, n_radial - do a = 1, 3 - do b = 1, 3 - do c = 1, 3 - descriptor_out%x(i_desc)%grad_data(desc_index,c,n_i) = descriptor_out%x(i_desc)%grad_data(desc_index,c,n_i) + & - S2der(a,b,p,n_i,c)*S2(a,b,q) + S2(a,b,p)*S2der(a,b,q,n_i,c) - enddo - enddo - enddo - desc_index = desc_index + 1 - enddo - enddo - - do p = 1, n_radial - do q = 1, n_radial - do r = 1, n_radial - do a = 1, 3 - do b = 1, 3 - do c = 1, 3 - descriptor_out%x(i_desc)%grad_data(desc_index,c,n_i) = descriptor_out%x(i_desc)%grad_data(desc_index,c,n_i) + & - S1der(a,p,n_i,c) * S2(a,b,q) * S1(b,r) + & - S1(a,p) * S2der(a,b,q,n_i,c) * S1(b,r) + & - S1(a,p) * S2(a,b,q) * S1der(b,r,n_i,c) - enddo - enddo - enddo - desc_index = desc_index + 1 - enddo - enddo - enddo - enddo - - descriptor_out%x(i_desc)%grad_data(:,:,0) = descriptor_out%x(i_desc)%grad_data(:,:,0) - descriptor_out%x(i_desc)%grad_data(:,:,n_i) - deallocate(S0der, S1der, S2der) - endif - - deallocate(neighbour_vecs, neighbour_dists, S0, S1, S2) - enddo - - - call system_timer('alex_calc') - - endsubroutine alex_calc - - subroutine distance_Nb_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(distance_Nb), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - - logical :: my_do_descriptor, my_do_grad_descriptor - integer :: d, n_descriptors, n_cross, i_desc, i_data, i, j, ii, jj, kk, ll, & - iConnectivity, n_index - integer, dimension(3) :: s_i, s_j - real(dp) :: r_ij, fcut_connectivity - real(dp), dimension(3) :: dfcut_connectivity - real(dp), dimension(3) :: d_ij - integer, dimension(:,:,:), allocatable :: atoms_in_descriptors - real(dp), dimension(:,:), allocatable :: fcut_pair, dfcut_pair - real(dp), dimension(:,:,:), allocatable :: directions - - logical, dimension(:), pointer :: atom_mask_pointer => null() - - INIT_ERROR(error) - - call system_timer('distance_Nb_calc') - - if(.not. this%initialised) then - RAISE_ERROR("distance_Nb_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - call finalise(descriptor_out) - - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='distance_Nb_calc args_str')) then - RAISE_ERROR("distance_Nb_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - atom_mask_pointer => null() - - if( has_atom_mask_name ) then - if( .not. this%compact_clusters ) then - RAISE_ERROR("distance_Nb_calc: MPI ready only for compact_clusters=T type of distance_Nb.", error) - endif - - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("distance_Nb_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - else - atom_mask_pointer => null() - endif - - endif - - d = distance_Nb_dimensions(this,error) - if(associated(atom_mask_pointer)) then - call descriptor_sizes(this,at,n_descriptors,n_cross, & - mask = atom_mask_pointer,n_index=n_index, error=error) - else - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - endif - - allocate(descriptor_out%x(n_descriptors)) - do i = 1, n_descriptors - if(my_do_descriptor) then - allocate(descriptor_out%x(i)%data(d)) - descriptor_out%x(i)%data = 0.0_dp - allocate(descriptor_out%x(i)%ci(n_index)) - descriptor_out%x(i)%ci = 0 - descriptor_out%x(i)%has_data = .false. - descriptor_out%x(i)%covariance_cutoff = 1.0_dp - endif - if(my_do_grad_descriptor) then - allocate(descriptor_out%x(i)%grad_data(d,3,this%order)) - allocate(descriptor_out%x(i)%ii(this%order)) - allocate(descriptor_out%x(i)%pos(3,this%order)) - allocate(descriptor_out%x(i)%has_grad_data(this%order)) - descriptor_out%x(i)%grad_data = 0.0_dp - descriptor_out%x(i)%ii = 0 - descriptor_out%x(i)%pos = 0.0_dp - descriptor_out%x(i)%has_grad_data = .false. - - allocate(descriptor_out%x(i)%grad_covariance_cutoff(3,this%order)) - descriptor_out%x(i)%grad_covariance_cutoff = 0.0_dp - endif - enddo - - if(associated(atom_mask_pointer)) then - call distance_Nb_calc_get_clusters(this,at,atoms_in_descriptors=atoms_in_descriptors,mask=atom_mask_pointer,error=error) - else - call distance_Nb_calc_get_clusters(this,at,atoms_in_descriptors=atoms_in_descriptors,error=error) - endif - - allocate(fcut_pair(this%order,this%order)) - if( my_do_grad_descriptor ) then - allocate(dfcut_pair(this%order,this%order), directions(3,this%order,this%order)) - endif - - do i_desc = 1, n_descriptors - if( this%order == 1 ) then - descriptor_out%x(i_desc)%data = 0.0_dp - if( my_do_grad_descriptor ) descriptor_out%x(i_desc)%grad_data = 0.0_dp - else - i_data = 0 - do ii = 1, this%order - i = atoms_in_descriptors(1,ii,i_desc) - s_i = atoms_in_descriptors(2:4,ii,i_desc) - do jj = ii+1, this%order - i_data = i_data + 1 - j = atoms_in_descriptors(1,jj,i_desc) - s_j = atoms_in_descriptors(2:4,jj,i_desc) - d_ij = at%pos(:,j) - at%pos(:,i) + matmul(at%lattice,s_j-s_i) - r_ij = sqrt(sum(d_ij**2)) - - fcut_pair(jj,ii) = coordination_function(r_ij,this%cutoff,this%cutoff_transition_width) - fcut_pair(ii,jj) = fcut_pair(jj,ii) - - descriptor_out%x(i_desc)%data(i_data) = r_ij - if( my_do_grad_descriptor ) then - dfcut_pair(ii,jj) = dcoordination_function(r_ij,this%cutoff,this%cutoff_transition_width) - dfcut_pair(jj,ii) = dfcut_pair(ii,jj) - - directions(:,ii,jj) = d_ij / r_ij - directions(:,jj,ii) = - directions(:,ii,jj) - descriptor_out%x(i_desc)%grad_data(i_data,:,jj) = directions(:,ii,jj) - descriptor_out%x(i_desc)%grad_data(i_data,:,ii) = & - - descriptor_out%x(i_desc)%grad_data(i_data,:,jj) - endif - enddo - enddo - - descriptor_out%x(i_desc)%covariance_cutoff = 0.0_dp - if ( this%compact_clusters ) then - - descriptor_out%x(i_desc)%covariance_cutoff = 1.0_dp - - do jj = 2, this%order - descriptor_out%x(i_desc)%covariance_cutoff = descriptor_out%x(i_desc)%covariance_cutoff * fcut_pair(jj,1) - enddo - - if( my_do_grad_descriptor ) then - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,1) = 0.0_dp - do kk = 2, this%order - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,kk) = 1.0_dp - do jj = 2, this%order - if( jj == kk ) then - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,kk) = & - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,kk) * dfcut_pair(jj,1) * (-directions(:,jj,1)) - else - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,kk) = & - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,kk) * fcut_pair(jj,1) - endif - enddo - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,1) = & - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,1) - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,kk) - enddo - endif - - - else - do iConnectivity = 1, size(this%monomerConnectivities,3) - - fcut_connectivity = 1.0_dp - - do ii = 1, this%order - do jj = ii+1, this%order - if( this%monomerConnectivities(jj,ii,iConnectivity) ) then - fcut_connectivity = fcut_connectivity * fcut_pair(jj,ii) - else - fcut_connectivity = fcut_connectivity * ( 1.0_dp - fcut_pair(jj,ii) ) - endif - enddo - enddo - descriptor_out%x(i_desc)%covariance_cutoff = descriptor_out%x(i_desc)%covariance_cutoff + fcut_connectivity - - if( my_do_grad_descriptor ) then - do kk = 1, this%order - do ll = kk+1, this%order - dfcut_connectivity = 1.0_dp - do ii = 1, this%order - do jj = ii+1, this%order - if( this%monomerConnectivities(jj,ii,iConnectivity) ) then - if( kk == ii .and. ll == jj ) then - dfcut_connectivity = dfcut_connectivity * dfcut_pair(jj,ii) * directions(:,ll,kk) - elseif( kk == jj .and. ll == ii ) then - dfcut_connectivity = dfcut_connectivity * dfcut_pair(jj,ii) * directions(:,ll,kk) - else - dfcut_connectivity = dfcut_connectivity * fcut_pair(jj,ii) - endif - else - if( kk == ii .and. ll == jj ) then - dfcut_connectivity = - dfcut_connectivity * dfcut_pair(jj,ii) * directions(:,ll,kk) - elseif( kk == jj .and. ll == ii) then - dfcut_connectivity = - dfcut_connectivity * dfcut_pair(jj,ii) * directions(:,ll,kk) - else - dfcut_connectivity = dfcut_connectivity * ( 1.0_dp - fcut_pair(jj,ii) ) - endif - endif - enddo !jj - enddo !ii - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,kk) = descriptor_out%x(i_desc)%grad_covariance_cutoff(:,kk) + & - dfcut_connectivity - descriptor_out%x(i_desc)%grad_covariance_cutoff(:,ll) = descriptor_out%x(i_desc)%grad_covariance_cutoff(:,ll) - & - dfcut_connectivity - enddo !ll - enddo !kk - endif - - enddo - endif - - endif - - descriptor_out%x(i_desc)%ci = atoms_in_descriptors(1,:,i_desc) - descriptor_out%x(i_desc)%has_data = .true. - if( my_do_grad_descriptor ) then - descriptor_out%x(i_desc)%ii = descriptor_out%x(i_desc)%ci - descriptor_out%x(i_desc)%pos = at%pos(:,descriptor_out%x(i_desc)%ii) + & - matmul(at%lattice,atoms_in_descriptors(2:4,:,i_desc)) - descriptor_out%x(i_desc)%has_grad_data = .true. - endif - - enddo - - if(allocated(atoms_in_descriptors)) deallocate(atoms_in_descriptors) - if(allocated(fcut_pair)) deallocate(fcut_pair) - if(allocated(dfcut_pair)) deallocate(dfcut_pair) - if(allocated(directions)) deallocate(directions) - - call system_timer('distance_Nb_calc') - - endsubroutine distance_Nb_calc - - subroutine distance_Nb_calc_get_clusters(this,at,atoms_in_descriptors,n_descriptors,mask,error) - - type(distance_Nb), intent(in) :: this - type(atoms), intent(in) :: at - integer, dimension(:,:,:), intent(out), allocatable, optional :: atoms_in_descriptors - integer, intent(out), optional :: n_descriptors - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: error - - integer, dimension(:,:,:), allocatable :: my_atoms_in_descriptors - - if( present(atoms_in_descriptors) ) then - call distance_Nb_calc_neighbour_loop(this,at,atoms_in_descriptors,n_descriptors=n_descriptors,mask=mask,error=error) - else - call distance_Nb_calc_neighbour_loop(this,at,my_atoms_in_descriptors,n_descriptors=n_descriptors,mask=mask,error=error) - if(allocated(my_atoms_in_descriptors)) deallocate(my_atoms_in_descriptors) - endif - - endsubroutine distance_Nb_calc_get_clusters - -! recursive subroutine distance_Nb_calc_neighbour_loop(this,at,atoms_in_descriptors,n_descriptors,error) -! -! type(distance_Nb), intent(in) :: this -! type(atoms), intent(in) :: at -! integer, dimension(:,:,:), intent(inout), allocatable :: atoms_in_descriptors -! integer, intent(out), optional :: n_descriptors -! integer, intent(out), optional :: error -! -! integer, save :: current_order = 0 -! integer :: i, j, n, order, i_desc, d -! real(dp) :: r_ij -! integer, dimension(3) :: shift_i, shift_j, shift_ij -! integer, dimension(:,:), allocatable :: current_descriptor -! -! type(LinkedList_i2d), pointer :: LL_atoms_in_descriptors => null() -! -! INIT_ERROR(error) -! -! current_order = current_order + 1 -! -! if( current_order == 1 ) then -! allocate(current_descriptor(4,1)) -! -! do i = 1, at%N -! if( any( at%Z(i) == this%Z ) .or. any( 0 == this%Z ) ) then -! current_descriptor(:,1) = (/i,0,0,0/) -! call append(LL_atoms_in_descriptors,current_descriptor,error) -! endif -! enddo -! -! deallocate(current_descriptor) -! call retrieve(LL_atoms_in_descriptors,atoms_in_descriptors) -! call finalise(LL_atoms_in_descriptors) -! if( this%order > 1 ) & -! call distance_Nb_calc_neighbour_loop(this,at,atoms_in_descriptors = atoms_in_descriptors,n_descriptors=n_descriptors,error=error) -! -! if( present(n_descriptors) ) n_descriptors = size(atoms_in_descriptors,3) -! else -! if( .not. allocated(atoms_in_descriptors) ) then -! RAISE_ERROR("distance_Nb_calc_neighbour_loop: atoms_in_descriptors must be allocated",error) -! endif -! -! allocate(current_descriptor(4,current_order)) -! do i_desc = 1, size(atoms_in_descriptors,3) -! do order = 1, size(atoms_in_descriptors,2) -! i = atoms_in_descriptors(1,order,i_desc) -! shift_i = atoms_in_descriptors(2:4,order,i_desc) -! loop_n: do n = 1, n_neighbours(at,i) -! j = neighbour(at,i,n,distance = r_ij, shift = shift_ij) -! -! if( r_ij > this%cutoff ) cycle -! if( .not. is_subset(this%Z, at%Z( (/j,atoms_in_descriptors(1,:,i_desc)/) ), error) .and. all(this%Z /= 0) ) cycle -! -! shift_j = shift_ij + shift_i -! -! current_descriptor(:,1:current_order-1) = atoms_in_descriptors(:,:,i_desc) -! current_descriptor(:,current_order) = (/j, shift_j/) -! if( order_and_check_for_duplicates(current_descriptor,at) ) then -! do d = current_order, 1, -1 -! current_descriptor(2:4,d) = current_descriptor(2:4,d) - current_descriptor(2:4,1) -! enddo -! if( .not. is_in_LinkedList(LL_atoms_in_descriptors,current_descriptor,error) ) & -! call append(LL_atoms_in_descriptors,current_descriptor,error) -! endif -! enddo loop_n -! enddo -! enddo -! -! deallocate(current_descriptor) -! call retrieve(LL_atoms_in_descriptors,atoms_in_descriptors) -! call finalise(LL_atoms_in_descriptors) -! if( current_order < this%order ) & -! call distance_Nb_calc_neighbour_loop(this,at,atoms_in_descriptors = atoms_in_descriptors,n_descriptors=n_descriptors,error=error) -! endif -! -! current_order = current_order - 1 -! -! endsubroutine distance_Nb_calc_neighbour_loop - - recursive subroutine distance_Nb_calc_neighbour_loop(this,at,atoms_in_descriptors,n_descriptors,mask,error) - - type(distance_Nb), intent(in) :: this - type(atoms), intent(in) :: at - integer, dimension(:,:,:), intent(inout), allocatable :: atoms_in_descriptors - integer, intent(out), optional :: n_descriptors - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: error - - integer, save :: current_order = 0 - integer :: i, j, n, order, i_desc, d - real(dp) :: r_ij - integer, dimension(3) :: shift_i, shift_j, shift_ij - integer, dimension(:,:), allocatable :: current_descriptor - - type(Table) :: Table_atoms_in_descriptors, Table_atoms_in_descriptors_uniq - - INIT_ERROR(error) - - current_order = current_order + 1 - - if( current_order == 1 ) then - call initialise(Table_atoms_in_descriptors, Nint = 4*current_order, Nreal = 0, Nstr = 0, Nlogical = 0, error=error) - allocate(current_descriptor(4,1)) - - do i = 1, at%N - if( any( at%Z(i) == this%Z ) .or. any( 0 == this%Z ) ) then - if( present(mask) ) then - if( .not. mask(i) ) cycle - endif - - current_descriptor(:,1) = (/i,0,0,0/) - call append(Table_atoms_in_descriptors,current_descriptor(:,1)) - endif - enddo - - deallocate(current_descriptor) - - allocate(atoms_in_descriptors(4,1,Table_atoms_in_descriptors%N)) - atoms_in_descriptors = reshape(Table_atoms_in_descriptors%int(:,1:Table_atoms_in_descriptors%N),(/4,1,Table_atoms_in_descriptors%N/)) - - call finalise(Table_atoms_in_descriptors) - - if( this%order > 1 ) & - call distance_Nb_calc_neighbour_loop(this,at,atoms_in_descriptors = atoms_in_descriptors,n_descriptors=n_descriptors,error=error) - - if( present(n_descriptors) ) n_descriptors = size(atoms_in_descriptors,3) - else - if( .not. allocated(atoms_in_descriptors) ) then - RAISE_ERROR("distance_Nb_calc_neighbour_loop: atoms_in_descriptors must be allocated",error) - endif - - call initialise(Table_atoms_in_descriptors, Nint = 4*current_order, Nreal = 0, Nstr = 0, Nlogical = 0, error=error) - allocate(current_descriptor(4,current_order)) - - do i_desc = 1, size(atoms_in_descriptors,3) - do order = 1, merge(1,size(atoms_in_descriptors,2),this%compact_clusters) !size(atoms_in_descriptors,2) - ! if compact_clusters == T, only neighbours of the first (central) atom is considered - i = atoms_in_descriptors(1,order,i_desc) - shift_i = atoms_in_descriptors(2:4,order,i_desc) - loop_n: do n = 1, n_neighbours(at,i) - j = neighbour(at,i,n,distance = r_ij, shift = shift_ij) - - if( r_ij > this%cutoff ) cycle - if( .not. is_subset(this%Z, at%Z( (/j,atoms_in_descriptors(1,:,i_desc)/) ), error) .and. all(this%Z /= 0) ) cycle - - shift_j = shift_ij + shift_i - - current_descriptor(:,1:current_order-1) = atoms_in_descriptors(:,:,i_desc) - current_descriptor(:,current_order) = (/j, shift_j/) - if( order_and_check_for_duplicates(current_descriptor(:,merge(2,1,this%compact_clusters):),at) ) then - ! if compact_clusters == T, leave first atom alone - do d = current_order, 1, -1 - current_descriptor(2:4,d) = current_descriptor(2:4,d) - current_descriptor(2:4,1) - enddo - call append(Table_atoms_in_descriptors,reshape(current_descriptor,(/4*current_order/))) - - !if( .not. is_in_LinkedList(LL_atoms_in_descriptors,current_descriptor,error) ) & - ! call append(LL_atoms_in_descriptors,current_descriptor,error) - endif - enddo loop_n - enddo - enddo - - deallocate(current_descriptor,atoms_in_descriptors) - call initialise(Table_atoms_in_descriptors_uniq, Nint = 4*current_order, Nreal = 0, Nstr = 0, Nlogical = 0, error=error) - - if( Table_atoms_in_descriptors%N > 0 ) then - call heap_sort(Table_atoms_in_descriptors%int(:,1:Table_atoms_in_descriptors%N)) - call append(Table_atoms_in_descriptors_uniq,Table_atoms_in_descriptors%int(:,1)) - do i_desc = 2, Table_atoms_in_descriptors%N - if( .not. all( Table_atoms_in_descriptors%int(:,i_desc) == Table_atoms_in_descriptors%int(:,i_desc-1) ) ) & - call append(Table_atoms_in_descriptors_uniq,Table_atoms_in_descriptors%int(:,i_desc)) - enddo - endif - - allocate(atoms_in_descriptors(4,current_order,Table_atoms_in_descriptors_uniq%N)) - atoms_in_descriptors = reshape(Table_atoms_in_descriptors_uniq%int(:,1:Table_atoms_in_descriptors_uniq%N),(/4,current_order,Table_atoms_in_descriptors_uniq%N/)) - - call finalise(Table_atoms_in_descriptors) - call finalise(Table_atoms_in_descriptors_uniq) - - if( current_order < this%order ) & - call distance_Nb_calc_neighbour_loop(this,at,atoms_in_descriptors = atoms_in_descriptors,n_descriptors=n_descriptors,error=error) - endif - - current_order = current_order - 1 - - endsubroutine distance_Nb_calc_neighbour_loop - - function order_and_check_for_duplicates(array,at) - integer, dimension(:,:), intent(inout) :: array - type(atoms), intent(in) :: at - logical :: order_and_check_for_duplicates - - integer :: ii, jj, n - integer, dimension(size(array,1)) :: tmp - logical :: do_swap - - integer, dimension(size(array,1)+1,size(array,2)) :: Z_array - - Z_array(1,:) = at%Z(array(1,:)) - Z_array(2:,:) = array(:,:) - - call heap_sort(Z_array) - - do ii = 2, size(Z_array,2) - if( all( Z_array(:,ii-1) == Z_array(:,ii) ) ) then - order_and_check_for_duplicates = .false. - return - endif - enddo - - array(:,:) = Z_array(2:,:) - - order_and_check_for_duplicates = .true. - - endfunction order_and_check_for_duplicates - - function is_subset(set,subset,error) - logical :: is_subset - integer, dimension(:), intent(in) :: set, subset - integer, optional, intent(out) :: error - - logical, dimension(size(set)) :: found - integer :: i, j - - INIT_ERROR(error) - if( size(set) < size(subset) ) then - RAISE_ERROR("is_subset: size of set must be greater than or equal to the size of subset",error) - endif - - found = .false. - loop_i: do i = 1, size(subset) - do j = 1, size(set) - if(set(j) == subset(i) .and. .not. found(j)) then - found(j) = .true. - cycle loop_i - endif - enddo - enddo loop_i - - is_subset = ( count(found) == size(subset) ) - - endfunction is_subset - - subroutine soap_express_calc(this,at,descriptor_out,do_descriptor,do_grad_descriptor,args_str,error) - type(soap_express), intent(in) :: this - type(atoms), intent(in) :: at - type(descriptor_data), intent(out) :: descriptor_out - logical, intent(in), optional :: do_descriptor, do_grad_descriptor - character(len=*), intent(in), optional :: args_str - integer, optional, intent(out) :: error - - type(Dictionary) :: params - character(STRING_LENGTH) :: atom_mask_name - logical :: has_atom_mask_name - logical, dimension(:), pointer :: atom_mask_pointer - - logical :: my_do_descriptor, my_do_grad_descriptor - integer :: a, b, d, i, j, k, l, m, n, i_n, l_n_neighbours, & - i_desc, n_descriptors, n_cross, n_index, i_pow - integer, dimension(3) :: shift - real(dp) :: r_ij, phi, atom_sigma_angular, atom_sigma_radial, r_ij_sigma_angular_scaled, & - amplitude, multiplicity, atom_sigma_radial_scaled - real(dp), dimension(3) :: u_ij - real(dp), dimension(this%angular_array_size) :: plm_array - complex(dp), dimension(this%angular_array_size) :: eimphi - complex(dp), dimension(:,:), allocatable :: exp_coeff_angular - real(dp), dimension(:,:), allocatable :: exp_coeff_radial - real(dp), dimension(:), allocatable :: descriptor_i - complex(dp), dimension(:,:), allocatable :: fourier_so3_array - - INIT_ERROR(error) - - call system_timer('soap_express_calc') - - if(.not. this%initialised) then - RAISE_ERROR("soap_express_calc: descriptor object not initialised", error) - endif - - my_do_descriptor = optional_default(.false., do_descriptor) - my_do_grad_descriptor = optional_default(.false., do_grad_descriptor) - - if( .not. my_do_descriptor .and. .not. my_do_grad_descriptor ) return - - atom_mask_pointer => null() - if(present(args_str)) then - call initialise(params) - - call param_register(params, 'atom_mask_name', 'NONE', atom_mask_name, has_value_target=has_atom_mask_name, & - help_string="Name of a logical property in the atoms object. For atoms where this property is true descriptors are " // & - "calculated.") - - if (.not. param_read_line(params,args_str,ignore_unknown=.true.,task='coordination_calc args_str')) then - RAISE_ERROR("soap_express_calc failed to parse args_str='"//trim(args_str)//"'", error) - endif - - call finalise(params) - - if( has_atom_mask_name ) then - if (.not. assign_pointer(at, trim(atom_mask_name), atom_mask_pointer)) then - RAISE_ERROR("soap_express_calc did not find "//trim(atom_mask_name)//" property in the atoms object.", error) - endif - else - atom_mask_pointer => null() - endif - - endif - - call finalise(descriptor_out) - - d = soap_express_dimensions(this,error) - - allocate(fourier_so3_array(this%angular_array_size,this%n_max)) - allocate(descriptor_i(d)) - - if(associated(atom_mask_pointer)) then - call descriptor_sizes(this,at,n_descriptors,n_cross, & - mask=atom_mask_pointer,n_index=n_index,error=error) - else - call descriptor_sizes(this,at,n_descriptors,n_cross,n_index=n_index,error=error) - endif - - allocate(descriptor_out%x(n_descriptors)) - i_desc = 0 - do i = 1, at%N - if(associated(atom_mask_pointer)) then - if(.not. atom_mask_pointer(i)) cycle - endif - - i_desc = i_desc + 1 - if(my_do_descriptor) then - allocate(descriptor_out%x(i_desc)%data(d)) - descriptor_out%x(i_desc)%data = 0.0_dp - allocate(descriptor_out%x(i_desc)%ci(n_index)) - descriptor_out%x(i_desc)%has_data = .false. - - descriptor_out%x(i_desc)%covariance_cutoff = 1.0_dp - endif - if(my_do_grad_descriptor) then - l_n_neighbours = n_neighbours(at,i,max_dist=this%cutoff) - - allocate(descriptor_out%x(i_desc)%grad_data(d,3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%ii(0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%pos(3,0:l_n_neighbours)) - allocate(descriptor_out%x(i_desc)%has_grad_data(0:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_data = 0.0_dp - descriptor_out%x(i_desc)%ii = 0 - descriptor_out%x(i_desc)%pos = 0.0_dp - descriptor_out%x(i_desc)%has_grad_data = .false. - - allocate(descriptor_out%x(i_desc)%grad_covariance_cutoff(3,0:l_n_neighbours)) - descriptor_out%x(i_desc)%grad_covariance_cutoff = 0.0_dp - endif - enddo - - i_desc = 0 - do i = 1, at%N - - if(associated(atom_mask_pointer)) then - if(.not. atom_mask_pointer(i)) cycle - endif - i_desc = i_desc + 1 - - if(my_do_descriptor) then - descriptor_out%x(i_desc)%ci(1) = i - descriptor_out%x(i_desc)%has_data = .true. - endif - if(my_do_grad_descriptor) then - descriptor_out%x(i_desc)%ii(0) = i - descriptor_out%x(i_desc)%pos(:,0) = at%pos(:,i) - descriptor_out%x(i_desc)%has_grad_data(0) = .true. - endif - - allocate(exp_coeff_angular(this%angular_array_size, n_neighbours(at,i, max_dist = this%cutoff))) - allocate(exp_coeff_radial(this%n_max, n_neighbours(at,i, max_dist = this%cutoff))) - - i_n = 0 - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij, cosines = u_ij, shift=shift) - - if( r_ij >= this%cutoff ) cycle - i_n = i_n + 1 - - phi = atan2( u_ij(2), u_ij(1) ) - - atom_sigma_angular = this%atom_sigma_angular + this%atom_sigma_scaling_angular * r_ij - - r_ij_sigma_angular_scaled = r_ij / atom_sigma_angular - - call descriptor_soap_express_get_eimphi_conjg( this, phi, r_ij_sigma_angular_scaled, eimphi ) - call descriptor_soap_express_get_plm_array(this, u_ij(3), plm_array) - - exp_coeff_angular(:,i_n) = this%Y_lm_prefactor * plm_array * eimphi / atom_sigma_angular**2 - call descriptor_soap_express_get_radial_array( this, r_ij, exp_coeff_radial(:,i_n) ) - - if( .false. )then -! This is the "inverse power" scaling originally proposed - amplitude = 1.0_dp / (1.0_dp + this%amplitude_scaling*r_ij) - else -! This is the polynomial scaling that made it to the paper - if( this%amplitude_scaling == 0 )then - amplitude = 1.0_dp - else if( this%amplitude_scaling == 1 )then - amplitude = 1.0_dp * ( 1.d0 + 2.d0*(r_ij/this%cutoff)**3 - 3.d0*(r_ij/this%cutoff)**2 ) - else - amplitude = 1.0_dp * ( 1.d0 + 2.d0*(r_ij/this%cutoff)**3 - 3.d0*(r_ij/this%cutoff)**2 )**this%amplitude_scaling - end if - endif - atom_sigma_radial_scaled = this%atom_sigma_radial + this%atom_sigma_scaling_radial*r_ij - exp_coeff_radial(1:this%n_max, i_n) = exp_coeff_radial(1:this%n_max, i_n) * amplitude / atom_sigma_radial_scaled - enddo - -! This results from the change of variable in the -! overlap integrals. We only need this if we want to -! know the actual value of the expansion coefficients. -! Since this is a global factor, once we have normalized -! the SOAP vectors it does not have an effect anymore. - exp_coeff_radial = exp_coeff_radial * sqrt(this%cutoff) - - fourier_so3_array = CPLX_ZERO - i_n = 0 - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij) - - if( r_ij >= this%cutoff ) cycle - i_n = i_n + 1 - - do a = 1, this%n_max - do l = 0, this%l_max - do m = 0, l - - k = 1 + (l*(l+1)) / 2 + m -! It is messy with the prefactor in spherical harmonics but we need to be sure because of the central atom below - fourier_so3_array(k, a) = fourier_so3_array(k, a) + 4.0_dp*PI * exp_coeff_radial(a, i_n) * & - exp_coeff_angular(k,i_n) - - enddo - enddo - enddo - enddo - if( this%central_weight > 0.0_dp )then - fourier_so3_array(1, 1:this%n_max) = fourier_so3_array(1, 1:this%n_max) + this%central_weight / sqrt(4.0_dp*PI) * & - PI**0.25_dp * sqrt(this%atom_sigma_radial / 2.0_dp) * & - matmul(this%basis_transformation_coefficients, this%overlap(1:this%n_max, this%n_max)) - end if - - if(my_do_descriptor) then - descriptor_i = 0.0_dp - i_pow = 0 - do a = 1, this%n_max - do b = a, this%n_max - do l = 0, this%l_max - i_pow = i_pow+1 - do m = 0, l - k = 1 + (l*(l+1))/2 + m - multiplicity = 1.0_dp - if( a /= b ) multiplicity = multiplicity * SQRT_TWO - if( m > 0 ) multiplicity = multiplicity * 2.0_dp - descriptor_i(i_pow) = descriptor_i(i_pow) + multiplicity * real(fourier_so3_array(k, a) * & - conjg(fourier_so3_array(k, b))) - enddo - enddo - enddo - enddo - descriptor_out%x(i_desc)%data = descriptor_i / sqrt(dot_product(descriptor_i, descriptor_i)) - endif - - if(my_do_grad_descriptor) then - RAISE_ERROR("soap_express_calc: derivatives not implemented yet.", error) - endif - - deallocate(exp_coeff_angular) - deallocate(exp_coeff_radial) - - enddo - - deallocate(fourier_so3_array) - deallocate(descriptor_i) - - call system_timer('soap_express_calc') - - endsubroutine soap_express_calc - - function descriptor_dimensions(this,error) - type(descriptor), intent(in) :: this - integer, optional, intent(out) :: error - integer :: descriptor_dimensions - - INIT_ERROR(error) - - selectcase(this%descriptor_type) - case(DT_BISPECTRUM_SO4) - descriptor_dimensions = bispectrum_SO4_dimensions(this%descriptor_bispectrum_SO4,error) - case(DT_BISPECTRUM_SO3) - descriptor_dimensions = bispectrum_SO3_dimensions(this%descriptor_bispectrum_SO3,error) - case(DT_BEHLER) - descriptor_dimensions = behler_dimensions(this%descriptor_behler,error) - case(DT_DISTANCE_2b) - descriptor_dimensions = distance_2b_dimensions(this%descriptor_distance_2b,error) - case(DT_COORDINATION) - descriptor_dimensions = coordination_dimensions(this%descriptor_coordination,error) - case(DT_ANGLE_3B) - descriptor_dimensions = angle_3b_dimensions(this%descriptor_angle_3b,error) - case(DT_CO_ANGLE_3B) - descriptor_dimensions = co_angle_3b_dimensions(this%descriptor_co_angle_3b,error) - case(DT_CO_DISTANCE_2b) - descriptor_dimensions = co_distance_2b_dimensions(this%descriptor_co_distance_2b,error) - case(DT_COSNX) - descriptor_dimensions = cosnx_dimensions(this%descriptor_cosnx,error) - case(DT_TRIHIS) - descriptor_dimensions = trihis_dimensions(this%descriptor_trihis,error) - case(DT_WATER_MONOMER) - descriptor_dimensions = water_monomer_dimensions(this%descriptor_water_monomer,error) - case(DT_WATER_DIMER) - descriptor_dimensions = water_dimer_dimensions(this%descriptor_water_dimer,error) - case(DT_A2_DIMER) - descriptor_dimensions = A2_dimer_dimensions(this%descriptor_A2_dimer,error) - case(DT_AB_DIMER) - descriptor_dimensions = AB_dimer_dimensions(this%descriptor_AB_dimer,error) - case(DT_BOND_REAL_SPACE) - descriptor_dimensions = bond_real_space_dimensions(this%descriptor_bond_real_space,error) - case(DT_ATOM_REAL_SPACE) - descriptor_dimensions = atom_real_space_dimensions(this%descriptor_atom_real_space,error) - case(DT_POWER_SO3) - descriptor_dimensions = power_so3_dimensions(this%descriptor_power_so3,error) - case(DT_POWER_SO4) - descriptor_dimensions = power_so4_dimensions(this%descriptor_power_so4,error) - case(DT_SOAP) - descriptor_dimensions = soap_dimensions(this%descriptor_soap,error) - case(DT_AN_MONOMER) - descriptor_dimensions = AN_monomer_dimensions(this%descriptor_AN_monomer,error) - case(DT_GENERAL_MONOMER) - descriptor_dimensions = general_monomer_dimensions(this%descriptor_general_monomer,error) - case(DT_GENERAL_DIMER) - descriptor_dimensions = general_dimer_dimensions(this%descriptor_general_dimer,error) - case(DT_GENERAL_TRIMER) - descriptor_dimensions = general_trimer_dimensions(this%descriptor_general_trimer,error) - case(DT_RDF) - descriptor_dimensions = rdf_dimensions(this%descriptor_rdf,error) - case(DT_AS_DISTANCE_2b) - descriptor_dimensions = as_distance_2b_dimensions(this%descriptor_as_distance_2b,error) - case(DT_MOLECULE_LO_D) - descriptor_dimensions = molecule_lo_d_dimensions(this%descriptor_molecule_lo_d,error) - case(DT_ALEX) - descriptor_dimensions = alex_dimensions(this%descriptor_alex,error) - case(DT_COM_DIMER) - descriptor_dimensions = com_dimer_dimensions(this%descriptor_com_dimer,error) - case(DT_DISTANCE_Nb) - descriptor_dimensions = distance_Nb_dimensions(this%descriptor_distance_Nb,error) - case(DT_SOAP_EXPRESS) - descriptor_dimensions = soap_express_dimensions(this%descriptor_soap_express,error) - case default - RAISE_ERROR("descriptor_dimensions: unknown descriptor type "//this%descriptor_type,error) - endselect - - endfunction descriptor_dimensions - - function bispectrum_SO4_dimensions(this,error) result(i) - type(bispectrum_SO4), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - integer :: j, j1, j2 - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("bispectrum_SO4_dimensions: descriptor object not initialised", error) - endif - - i = 0 - do j1 = 0, this%j_max - j2 = j1 - !do j2 = 0, this%j_max - do j = abs(j1-j2), min(this%j_max,j1+j2) - if( mod(j1+j2+j,2) == 1 ) cycle - i = i + 1 - enddo - !enddo - enddo - - endfunction bispectrum_SO4_dimensions - - function bispectrum_SO3_dimensions(this,error) result(i) - type(bispectrum_SO3), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - integer :: a, l1, l2, l - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("bispectrum_SO3_dimensions: descriptor object not initialised", error) - endif - - i = 0 - do a = 1, this%n_max - do l1 = 0, this%l_max - l2 = l1 - !do l2 = 0, this%l_max - do l = abs(l1-l2), min(this%l_max,l1+l2) - if( mod(l1,2)==1 .and. mod(l2,2)==1 .and. mod(l,2)==1 ) cycle - i = i + 1 - enddo - !enddo - enddo - enddo - - endfunction bispectrum_SO3_dimensions - - function behler_dimensions(this,error) result(i) - type(behler), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("behler_dimensions: descriptor object not initialised", error) - endif - - i = this%n_g2 + this%n_g3 - - endfunction behler_dimensions - - function distance_2b_dimensions(this,error) result(i) - type(distance_2b), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("distance_2b_dimensions: descriptor object not initialised", error) - endif - - i = this%n_exponents - - endfunction distance_2b_dimensions - - function coordination_dimensions(this,error) result(i) - type(coordination), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("coordination_dimensions: descriptor object not initialised", error) - endif - - i = 1 - - endfunction coordination_dimensions - - function angle_3b_dimensions(this,error) result(i) - type(angle_3b), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("angle_3b_dimensions: descriptor object not initialised", error) - endif - - i = 3 - - endfunction angle_3b_dimensions - - function co_angle_3b_dimensions(this,error) result(i) - type(co_angle_3b), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("co_angle_3b_dimensions: descriptor object not initialised", error) - endif - - i = 4 - - endfunction co_angle_3b_dimensions - - function co_distance_2b_dimensions(this,error) result(i) - type(co_distance_2b), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("co_distance_2b_dimensions: descriptor object not initialised", error) - endif - - i = 3 - - endfunction co_distance_2b_dimensions - - function cosnx_dimensions(this,error) result(i) - type(cosnx), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("cosnx_dimensions: descriptor object not initialised", error) - endif - - i = this%n_max*(this%l_max+1) - - endfunction cosnx_dimensions - - function trihis_dimensions(this,error) result(i) - type(trihis), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("trihis_dimensions: descriptor object not initialised", error) - endif - - i = this%n_gauss - - endfunction trihis_dimensions - - function water_monomer_dimensions(this,error) result(i) - type(water_monomer), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("water_monomer_dimensions: descriptor object not initialised", error) - endif - - i = 3 - - endfunction water_monomer_dimensions - - function water_dimer_dimensions(this,error) result(i) - type(water_dimer), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("water_dimer_dimensions: descriptor object not initialised", error) - endif - - i = 15 - - endfunction water_dimer_dimensions - - function A2_dimer_dimensions(this,error) result(i) - type(A2_dimer), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("A2_dimer_dimensions: descriptor object not initialised", error) - endif - - i = 6 - - endfunction A2_dimer_dimensions - - function AB_dimer_dimensions(this,error) result(i) - type(AB_dimer), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("AB_dimer_dimensions: descriptor object not initialised", error) - endif - - i = 6 - - endfunction AB_dimer_dimensions - - function bond_real_space_dimensions(this,error) result(i) - type(bond_real_space), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("bond_real_space_dimensions: descriptor object not initialised", error) - endif - - i = 2 + (1 + 2 * this%max_neighbours) * this%max_neighbours - - endfunction bond_real_space_dimensions - - function atom_real_space_dimensions(this,error) result(i) - type(atom_real_space), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("atom_real_space_dimensions: descriptor object not initialised", error) - endif - - i = 2 * (this%l_max+1)**2 + 2 - - endfunction atom_real_space_dimensions - - function power_so3_dimensions(this,error) result(i) - type(power_so3), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("power_so3_dimensions: descriptor object not initialised", error) - endif - - i = this%n_max*(this%l_max+1) - - endfunction power_so3_dimensions - - function power_SO4_dimensions(this,error) result(i) - type(power_SO4), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("power_SO4_dimensions: descriptor object not initialised", error) - endif - - i = this%j_max + 1 - - endfunction power_SO4_dimensions - - function soap_dimensions(this,error) result(i) - type(soap), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("soap_dimensions: descriptor object not initialised", error) - endif - - !i = (this%l_max+1) * ( this%n_max * (this%n_max+1) / 2 ) * ( this%n_species * (this%n_species+1) / 2 ) + 1 - !i = (this%l_max+1) * this%n_max**2 * this%n_species**2 + 1 - if(this%diagonal_radial) then - i = (this%l_max+1) * this%n_max * this%n_species * (this%n_species+1) / 2 + 1 - else - i = (this%l_max+1) * ( (this%n_max*this%n_species)*(this%n_max*this%n_species+1) ) / 2 + 1 - endif - - endfunction soap_dimensions - - function AN_monomer_dimensions(this,error) result(i) - type(AN_monomer), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("AN_monomer_dimensions: descriptor object not initialised", error) - endif - - i = this%N * (this%N - 1) / 2 - - endfunction AN_monomer_dimensions - - function general_monomer_dimensions(this,error) result(i) - type(general_monomer), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("general_monomer_dimensions: descriptor object not initialised", error) - endif - if(.not. this%permutation_data%initialised) then - RAISE_ERROR("general_monomer_dimensions: descriptor object's permutation data not initialised", error) - endif - - i = size(this%permutation_data%dist_vec) - - endfunction general_monomer_dimensions - - function com_dimer_dimensions(this,error) result(i) - type(com_dimer), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("com_dimer_dimensions: descriptor object not initialised", error) - endif - - i = 1 - - endfunction com_dimer_dimensions - - function general_dimer_dimensions(this,error) result(i) - type(general_dimer), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("general_dimer_dimensions: descriptor object not initialised", error) - endif - if(.not. this%permutation_data%initialised) then - RAISE_ERROR("general_dimer_dimensions: descriptor object's permutation data not initialised", error) - endif - - i = size(this%permutation_data%dist_vec) - - endfunction general_dimer_dimensions - - - function general_trimer_dimensions(this,error) result(i) - type(general_trimer), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("general_trimer_dimensions: descriptor object not initialised", error) - endif - if(.not. this%permutation_data%initialised) then - RAISE_ERROR("general_trimer_dimensions: descriptor object's permutation data not initialised", error) - endif - - i = size(this%permutation_data%dist_vec) - - endfunction general_trimer_dimensions - - function rdf_dimensions(this,error) result(i) - type(rdf), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("rdf_dimensions: descriptor object not initialised", error) - endif - - i = this%n_gauss - - endfunction rdf_dimensions - - function as_distance_2b_dimensions(this,error) result(i) - type(as_distance_2b), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("as_distance_2b_dimensions: descriptor object not initialised", error) - endif - - i = 3 - - endfunction as_distance_2b_dimensions - - function molecule_lo_d_dimensions(this,error) result(i) - type(molecule_lo_d), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("molecule_lo_d_dimensions: descriptor object not initialised", error) - endif - if(.not. this%permutation_data%initialised) then - RAISE_ERROR("molecule_lo_d_dimensions: descriptor object's permutation data not initialised", error) - endif - - i = size(this%included_components) - - endfunction molecule_lo_d_dimensions - - function alex_dimensions(this,error) result(i) - type(alex), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i, nradial - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("alex_dimensions: descriptor object not initialised", error) - endif - - nradial = this%power_max-this%power_min + 1 - i = nradial+2*nradial**2+nradial**3 - - endfunction alex_dimensions - - function distance_Nb_dimensions(this,error) result(i) - type(distance_Nb), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("distance_Nb_dimensions: descriptor object not initialised", error) - endif - - i = max(1,this%order * ( this%order - 1 ) / 2) - - endfunction distance_Nb_dimensions - - function soap_express_dimensions(this,error) result(i) - type(soap_express), intent(in) :: this - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("soap_express_dimensions: descriptor object not initialised", error) - endif - - i = ( this%l_max+1 ) * ( this%n_max*(this%n_max+1) ) / 2 + 1 - - endfunction soap_express_dimensions - - function descriptor_cutoff(this,error) - type(descriptor), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: descriptor_cutoff - - INIT_ERROR(error) - - selectcase(this%descriptor_type) - case(DT_BISPECTRUM_SO4) - descriptor_cutoff = cutoff(this%descriptor_bispectrum_SO4,error) - case(DT_BISPECTRUM_SO3) - descriptor_cutoff = cutoff(this%descriptor_bispectrum_SO3,error) - case(DT_BEHLER) - descriptor_cutoff = cutoff(this%descriptor_behler,error) - case(DT_DISTANCE_2b) - descriptor_cutoff = cutoff(this%descriptor_distance_2b,error) - case(DT_COORDINATION) - descriptor_cutoff = cutoff(this%descriptor_coordination,error) - case(DT_ANGLE_3B) - descriptor_cutoff = cutoff(this%descriptor_angle_3b,error) - case(DT_CO_ANGLE_3B) - descriptor_cutoff = cutoff(this%descriptor_co_angle_3b,error) - case(DT_CO_DISTANCE_2b) - descriptor_cutoff = cutoff(this%descriptor_co_distance_2b,error) - case(DT_COSNX) - descriptor_cutoff = cutoff(this%descriptor_cosnx,error) - case(DT_TRIHIS) - descriptor_cutoff = cutoff(this%descriptor_trihis,error) - case(DT_WATER_MONOMER) - descriptor_cutoff = cutoff(this%descriptor_water_monomer,error) - case(DT_WATER_DIMER) - descriptor_cutoff = cutoff(this%descriptor_water_dimer,error) - case(DT_A2_DIMER) - descriptor_cutoff = cutoff(this%descriptor_A2_dimer,error) - case(DT_AB_DIMER) - descriptor_cutoff = cutoff(this%descriptor_AB_dimer,error) - case(DT_BOND_REAL_SPACE) - descriptor_cutoff = cutoff(this%descriptor_bond_real_space,error) - case(DT_ATOM_REAL_SPACE) - descriptor_cutoff = cutoff(this%descriptor_atom_real_space,error) - case(DT_POWER_SO3) - descriptor_cutoff = cutoff(this%descriptor_power_so3,error) - case(DT_POWER_SO4) - descriptor_cutoff = cutoff(this%descriptor_power_so4,error) - case(DT_SOAP) - descriptor_cutoff = cutoff(this%descriptor_soap,error) - case(DT_AN_MONOMER) - descriptor_cutoff = cutoff(this%descriptor_AN_monomer,error) - case(DT_GENERAL_MONOMER) - descriptor_cutoff = cutoff(this%descriptor_general_monomer,error) - case(DT_GENERAL_DIMER) - descriptor_cutoff = cutoff(this%descriptor_general_dimer,error) - case(DT_GENERAL_TRIMER) - descriptor_cutoff = cutoff(this%descriptor_general_trimer,error) - case(DT_RDF) - descriptor_cutoff = cutoff(this%descriptor_rdf,error) - case(DT_MOLECULE_LO_D) - descriptor_cutoff = cutoff(this%descriptor_molecule_lo_d,error) - case(DT_ALEX) - descriptor_cutoff = cutoff(this%descriptor_alex,error) - case(DT_COM_DIMER) - descriptor_cutoff = cutoff(this%descriptor_com_dimer,error) - case(DT_DISTANCE_Nb) - descriptor_cutoff = cutoff(this%descriptor_distance_Nb,error) - case(DT_SOAP_EXPRESS) - descriptor_cutoff = cutoff(this%descriptor_soap_express,error) - case default - RAISE_ERROR("descriptor_cutoff: unknown descriptor type "//this%descriptor_type,error) - endselect - - endfunction descriptor_cutoff - - function bispectrum_SO4_cutoff(this,error) - type(bispectrum_SO4), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: bispectrum_SO4_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("bispectrum_SO4_cutoff: descriptor object not initialised", error) - endif - - bispectrum_SO4_cutoff = this%cutoff - - endfunction bispectrum_SO4_cutoff - - function bispectrum_SO3_cutoff(this,error) - type(bispectrum_SO3), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: bispectrum_SO3_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("bispectrum_SO3_cutoff: descriptor object not initialised", error) - endif - - bispectrum_SO3_cutoff = this%cutoff - - endfunction bispectrum_SO3_cutoff - - function behler_cutoff(this,error) - type(behler), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: behler_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("behler_cutoff: descriptor object not initialised", error) - endif - - behler_cutoff = this%cutoff - - endfunction behler_cutoff - - function distance_2b_cutoff(this,error) - type(distance_2b), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: distance_2b_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("distance_2b_cutoff: descriptor object not initialised", error) - endif - - distance_2b_cutoff = this%cutoff - - endfunction distance_2b_cutoff - - function co_distance_2b_cutoff(this,error) - type(co_distance_2b), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: co_distance_2b_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("co_distance_2b_cutoff: descriptor object not initialised", error) - endif - - co_distance_2b_cutoff = this%cutoff - - endfunction co_distance_2b_cutoff - - function coordination_cutoff(this,error) - type(coordination), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: coordination_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("coordination_cutoff: descriptor object not initialised", error) - endif - - coordination_cutoff = this%cutoff - - endfunction coordination_cutoff - - function angle_3b_cutoff(this,error) - type(angle_3b), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: angle_3b_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("angle_3b_cutoff: descriptor object not initialised", error) - endif - - angle_3b_cutoff = this%cutoff - - endfunction angle_3b_cutoff - - function co_angle_3b_cutoff(this,error) - type(co_angle_3b), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: co_angle_3b_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("co_angle_3b_cutoff: descriptor object not initialised", error) - endif - - co_angle_3b_cutoff = this%cutoff - - endfunction co_angle_3b_cutoff - - function cosnx_cutoff(this,error) - type(cosnx), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: cosnx_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("cosnx_cutoff: descriptor object not initialised", error) - endif - - cosnx_cutoff = this%cutoff - - endfunction cosnx_cutoff - - function trihis_cutoff(this,error) - type(trihis), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: trihis_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("trihis_cutoff: descriptor object not initialised", error) - endif - - trihis_cutoff = this%cutoff - - endfunction trihis_cutoff - - function water_monomer_cutoff(this,error) - type(water_monomer), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: water_monomer_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("water_monomer_cutoff: descriptor object not initialised", error) - endif - - water_monomer_cutoff = this%cutoff - - endfunction water_monomer_cutoff - - function water_dimer_cutoff(this,error) - type(water_dimer), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: water_dimer_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("water_dimer_cutoff: descriptor object not initialised", error) - endif - - water_dimer_cutoff = this%cutoff - - endfunction water_dimer_cutoff - - function A2_dimer_cutoff(this,error) - type(A2_dimer), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: A2_dimer_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("A2_dimer_cutoff: descriptor object not initialised", error) - endif - - A2_dimer_cutoff = this%cutoff - - endfunction A2_dimer_cutoff - - function AB_dimer_cutoff(this,error) - type(AB_dimer), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: AB_dimer_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("AB_dimer_cutoff: descriptor object not initialised", error) - endif - - AB_dimer_cutoff = this%cutoff - - endfunction AB_dimer_cutoff - - function bond_real_space_cutoff(this,error) - type(bond_real_space), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: bond_real_space_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("bond_real_space_cutoff: descriptor object not initialised", error) - endif - - bond_real_space_cutoff = max(this%cutoff, this%bond_cutoff) - - endfunction bond_real_space_cutoff - - function atom_real_space_cutoff(this,error) - type(atom_real_space), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: atom_real_space_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("atom_real_space_cutoff: descriptor object not initialised", error) - endif - - atom_real_space_cutoff = this%cutoff - - endfunction atom_real_space_cutoff - - function power_so3_cutoff(this,error) - type(power_so3), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: power_so3_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("power_so3_cutoff: descriptor object not initialised", error) - endif - - power_so3_cutoff = this%cutoff - - endfunction power_so3_cutoff - - function power_so4_cutoff(this,error) - type(power_so4), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: power_so4_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("power_so4_cutoff: descriptor object not initialised", error) - endif - - power_so4_cutoff = this%cutoff - - endfunction power_so4_cutoff - - function soap_cutoff(this,error) - type(soap), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: soap_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("soap_cutoff: descriptor object not initialised", error) - endif - - soap_cutoff = this%cutoff - - endfunction soap_cutoff - - function AN_monomer_cutoff(this,error) - type(AN_monomer), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: AN_monomer_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("AN_monomer_cutoff: descriptor object not initialised", error) - endif - - AN_monomer_cutoff = this%cutoff - - endfunction AN_monomer_cutoff - - function general_monomer_cutoff(this,error) - type(general_monomer), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: general_monomer_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("general_monomer_cutoff: descriptor object not initialised", error) - endif - - general_monomer_cutoff = this%cutoff - - endfunction general_monomer_cutoff - - function com_dimer_cutoff(this,error) - type(com_dimer), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: com_dimer_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("com_dimer_cutoff: descriptor object not initialised", error) - endif - - com_dimer_cutoff = this%cutoff - - endfunction com_dimer_cutoff - - function general_dimer_cutoff(this,error) - type(general_dimer), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: general_dimer_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("general_dimer_cutoff: descriptor object not initialised", error) - endif - - general_dimer_cutoff = this%cutoff - - endfunction general_dimer_cutoff - - function general_trimer_cutoff(this,error) - type(general_trimer), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: general_trimer_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("general_trimer_cutoff: descriptor object not initialised", error) - endif - - general_trimer_cutoff = this%cutoff - - endfunction general_trimer_cutoff - - function rdf_cutoff(this,error) - type(rdf), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: rdf_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("rdf_cutoff: descriptor object not initialised", error) - endif - - rdf_cutoff = this%cutoff - - endfunction rdf_cutoff - - function as_distance_2b_cutoff(this,error) - type(as_distance_2b), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: as_distance_2b_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("as_distance_2b_cutoff: descriptor object not initialised", error) - endif - - as_distance_2b_cutoff = this%max_cutoff - - endfunction as_distance_2b_cutoff - - function molecule_lo_d_cutoff(this,error) - type(molecule_lo_d), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: molecule_lo_d_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("molecule_lo_d_cutoff: descriptor object not initialised", error) - endif - - molecule_lo_d_cutoff = this%cutoff - - endfunction molecule_lo_d_cutoff - - function alex_cutoff(this,error) - type(alex), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: alex_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("alex_cutoff: descriptor object not initialised", error) - endif - - alex_cutoff = this%cutoff - - endfunction alex_cutoff - - function distance_Nb_cutoff(this,error) - type(distance_Nb), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: distance_Nb_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("distance_Nb_cutoff: descriptor object not initialised", error) - endif - - distance_Nb_cutoff = this%cutoff - - endfunction distance_Nb_cutoff - - function soap_express_cutoff(this,error) - type(soap_express), intent(in) :: this - integer, optional, intent(out) :: error - real(dp) :: soap_express_cutoff - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("soap_express_cutoff: descriptor object not initialised", error) - endif - - soap_express_cutoff = this%cutoff - - endfunction soap_express_cutoff - - subroutine descriptor_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(descriptor), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - INIT_ERROR(error) - - selectcase(this%descriptor_type) - case(DT_BISPECTRUM_SO4) - call bispectrum_SO4_sizes(this%descriptor_bispectrum_SO4,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_BISPECTRUM_SO3) - call bispectrum_SO3_sizes(this%descriptor_bispectrum_SO3,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_BEHLER) - call behler_sizes(this%descriptor_behler,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_DISTANCE_2b) - call distance_2b_sizes(this%descriptor_distance_2b,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_COORDINATION) - call coordination_sizes(this%descriptor_coordination,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_ANGLE_3B) - call angle_3b_sizes(this%descriptor_angle_3b,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_CO_ANGLE_3B) - call co_angle_3b_sizes(this%descriptor_co_angle_3b,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_CO_DISTANCE_2b) - call co_distance_2b_sizes(this%descriptor_co_distance_2b,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_COSNX) - call cosnx_sizes(this%descriptor_cosnx,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_TRIHIS) - call trihis_sizes(this%descriptor_trihis,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_WATER_MONOMER) - call water_monomer_sizes(this%descriptor_water_monomer,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_WATER_DIMER) - call water_dimer_sizes(this%descriptor_water_dimer,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_A2_DIMER) - call A2_dimer_sizes(this%descriptor_A2_dimer,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_AB_DIMER) - call AB_dimer_sizes(this%descriptor_AB_dimer,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_BOND_REAL_SPACE) - call bond_real_space_sizes(this%descriptor_bond_real_space,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_ATOM_REAL_SPACE) - call atom_real_space_sizes(this%descriptor_atom_real_space,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_POWER_SO3) - call power_so3_sizes(this%descriptor_power_so3,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_POWER_SO4) - call power_so4_sizes(this%descriptor_power_so4,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_SOAP) - call soap_sizes(this%descriptor_soap,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_AN_MONOMER) - call AN_monomer_sizes(this%descriptor_AN_monomer,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_GENERAL_MONOMER) - call general_monomer_sizes(this%descriptor_general_monomer,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_GENERAL_DIMER) - call general_dimer_sizes(this%descriptor_general_dimer,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_GENERAL_TRIMER) - call general_trimer_sizes(this%descriptor_general_trimer,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_RDF) - call rdf_sizes(this%descriptor_rdf,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_AS_DISTANCE_2b) - call as_distance_2b_sizes(this%descriptor_as_distance_2b,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_MOLECULE_LO_D) - call molecule_lo_d_sizes(this%descriptor_molecule_lo_d,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_ALEX) - call alex_sizes(this%descriptor_alex,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_COM_DIMER) - call com_dimer_sizes(this%descriptor_com_dimer,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_DISTANCE_Nb) - call distance_Nb_sizes(this%descriptor_distance_Nb,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case(DT_SOAP_EXPRESS) - call soap_express_sizes(this%descriptor_soap_express,at, & - n_descriptors,n_cross,mask=mask,n_index=n_index,error=error) - case default - RAISE_ERROR("descriptor_sizes: unknown descriptor type "//this%descriptor_type,error) - endselect - - endsubroutine descriptor_sizes - - subroutine bispectrum_SO4_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(bispectrum_SO4), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("bispectrum_SO4_sizes: descriptor object not initialised", error) - endif - - n_descriptors = 0 - n_cross = 0 - - do i = 1, at%N - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - if(present(mask)) then - if(.not. mask(i)) cycle - endif - n_descriptors = n_descriptors + 1 - n_cross = n_cross + n_neighbours(at,i,max_dist=this%cutoff) + 1 - enddo - - if( present(n_index) ) n_index = 1 - - endsubroutine bispectrum_SO4_sizes - - subroutine bispectrum_SO3_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(bispectrum_SO3), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("bispectrum_SO3_sizes: descriptor object not initialised", error) - endif - - n_descriptors = 0 - n_cross = 0 - - do i = 1, at%N - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - if(present(mask)) then - if(.not. mask(i)) cycle - endif - n_descriptors = n_descriptors + 1 - n_cross = n_cross + n_neighbours(at,i,max_dist=this%cutoff) + 1 - enddo - - if( present(n_index) ) n_index = 1 - - endsubroutine bispectrum_SO3_sizes - - subroutine behler_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(behler), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("behler_sizes: descriptor object not initialised", error) - endif - - n_descriptors = 0 - n_cross = 0 - do i = 1, at%N - if(present(mask)) then - if(.not. mask(i)) cycle - endif - n_descriptors = n_descriptors + 1 - n_cross = n_cross + n_neighbours(at,i,max_dist=this%cutoff) + 1 - enddo - - if( present(n_index) ) n_index = 1 - - endsubroutine behler_sizes - - subroutine distance_2b_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(distance_2b), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer :: i, j, n - logical :: Zi1, Zi2, Zj1, Zj2 - real(dp) :: r_ij - - logical :: needs_resid - integer, dimension(:), pointer :: resid_pointer - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("distance_2b_sizes: descriptor object not initialised", error) - endif - - needs_resid = this%only_intra .or. this%only_inter - if (needs_resid) then - if (.not. assign_pointer(at, trim(this%resid_name), resid_pointer)) then - RAISE_ERROR("distance_2b_sizes did not find "//trim(this%resid_name)//" property (residue id) in the atoms object.", error) - end if - else - resid_pointer => null() - end if - - n_descriptors = 0 - n_cross = 0 - - do i = 1, at%N - if(present(mask)) then - if(.not. mask(i)) cycle - endif - - Zi1 = (this%Z1 == 0) .or. (at%Z(i) == this%Z1) - Zi2 = (this%Z2 == 0) .or. (at%Z(i) == this%Z2) - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance=r_ij) - if(r_ij >= this%cutoff) cycle -!if(r_ij < 3.5_dp) cycle - - Zj1 = (this%Z1 == 0) .or. (at%Z(j) == this%Z1) - Zj2 = (this%Z2 == 0) .or. (at%Z(j) == this%Z2) - if( .not. ( ( Zi1 .and. Zj2 ) .or. ( Zi2 .and. Zj1 ) ) ) cycle ! this pair doesn't belong to the descriptor type - - if (needs_resid) then - if (this%only_intra .and. resid_pointer(i) /= resid_pointer(j)) cycle - if (this%only_inter .and. resid_pointer(i) == resid_pointer(j)) cycle - end if - - n_descriptors = n_descriptors + 1 - enddo - enddo - - n_cross = n_descriptors*2 - - if( present(n_index) ) n_index = 2 - - endsubroutine distance_2b_sizes - - subroutine coordination_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(coordination), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("coordination_sizes: descriptor object not initialised", error) - endif - - n_descriptors = 0 - n_cross = 0 - do i = 1, at%N - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - if(present(mask)) then - if(.not. mask(i)) cycle - endif - n_descriptors = n_descriptors + 1 - n_cross = n_cross + n_neighbours(at,i,max_dist=this%cutoff) + 1 - enddo - - if( present(n_index) ) n_index = 1 - - endsubroutine coordination_sizes - - subroutine angle_3b_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(angle_3b), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer :: i, j, k, n, m - real(dp) :: r_ij, r_ik - logical :: Zk1, Zk2, Zj1, Zj2 - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("angle_3b_sizes: descriptor object not initialised", error) - endif - - n_descriptors = 0 - n_cross = 0 - - do i = 1, at%N - if( (this%Z /=0) .and. (at%Z(i) /= this%Z) ) cycle - if(present(mask)) then - if(.not. mask(i)) cycle - endif - - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij) - if( r_ij >= this%cutoff ) cycle - - Zj1 = (this%Z1 == 0) .or. (at%Z(j) == this%Z1) - Zj2 = (this%Z2 == 0) .or. (at%Z(j) == this%Z2) - - do m = 1, n_neighbours(at,i) - if( n == m ) cycle - - k = neighbour(at, i, m, distance = r_ik) - if( r_ik >= this%cutoff ) cycle - - Zk1 = (this%Z1 == 0) .or. (at%Z(k) == this%Z1) - Zk2 = (this%Z2 == 0) .or. (at%Z(k) == this%Z2) - if( .not. ( ( Zk1 .and. Zj2 ) .or. ( Zk2 .and. Zj1 ) ) ) cycle ! this pair doesn't belong to the descriptor type - - n_descriptors = n_descriptors + 1 - enddo - enddo - enddo - n_cross = n_descriptors * 3 - - if( present(n_index) ) n_index = 1 - - endsubroutine angle_3b_sizes - - subroutine co_angle_3b_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(co_angle_3b), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer :: i, j, k, n, m, n_neighbours_coordination - real(dp) :: r_ij, r_ik - logical :: Zk1, Zk2, Zj1, Zj2 - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("co_angle_3b_sizes: descriptor object not initialised", error) - endif - - n_descriptors = 0 - n_cross = 0 - - do i = 1, at%N - if( (this%Z /=0) .and. (at%Z(i) /= this%Z) ) cycle - if(present(mask)) then - if(.not. mask(i)) cycle - endif - - n_neighbours_coordination = n_neighbours(at,i,max_dist=this%coordination_cutoff) - - do n = 1, n_neighbours(at,i) - j = neighbour(at, i, n, distance = r_ij) - if( r_ij >= this%cutoff ) cycle - - Zj1 = (this%Z1 == 0) .or. (at%Z(j) == this%Z1) - Zj2 = (this%Z2 == 0) .or. (at%Z(j) == this%Z2) - - do m = 1, n_neighbours(at,i) - if( n == m ) cycle - k = neighbour(at, i, m, distance = r_ik) - if( r_ik >= this%cutoff ) cycle - - Zk1 = (this%Z1 == 0) .or. (at%Z(k) == this%Z1) - Zk2 = (this%Z2 == 0) .or. (at%Z(k) == this%Z2) - if( .not. ( ( Zk1 .and. Zj2 ) .or. ( Zk2 .and. Zj1 ) ) ) cycle ! this pair doesn't belong to the descriptor type - - n_descriptors = n_descriptors + 1 - n_cross = n_cross + 3 + n_neighbours_coordination - enddo - enddo - enddo - - if( present(n_index) ) n_index = 1 - - endsubroutine co_angle_3b_sizes - - subroutine co_distance_2b_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(co_distance_2b), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - real(dp) :: r_ij - integer :: i, j, n - logical :: Zi1, Zi2, Zj1, Zj2 - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("co_distance_2b_sizes: descriptor object not initialised", error) - endif - - n_descriptors = 0 - n_cross = 0 - - do i = 1, at%N - if(present(mask)) then - if(.not. mask(i)) cycle - endif - Zi1 = (this%Z1 == 0) .or. (at%Z(i) == this%Z1) - Zi2 = (this%Z2 == 0) .or. (at%Z(i) == this%Z2) - do n = 1, n_neighbours(at,i) - j = neighbour(at,i,n,distance=r_ij) - if( r_ij >= this%cutoff ) cycle -!if( r_ij < 3.5_dp ) cycle - - - Zj1 = (this%Z1 == 0) .or. (at%Z(j) == this%Z1) - Zj2 = (this%Z2 == 0) .or. (at%Z(j) == this%Z2) - if( .not. ( ( Zi1 .and. Zj2 ) .or. ( Zi2 .and. Zj1 ) ) ) cycle ! this pair doesn't belong to the descriptor type - - n_descriptors = n_descriptors + 1 - n_cross = n_cross + 4 + n_neighbours(at,i,max_dist=this%coordination_cutoff) + n_neighbours(at,j,max_dist=this%coordination_cutoff) - enddo - enddo - - if( present(n_index) ) n_index = 2 - - endsubroutine co_distance_2b_sizes - - subroutine cosnx_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(cosnx), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("cosnx_sizes: descriptor object not initialised", error) - endif - - n_descriptors = 0 - n_cross = 0 - - do i = 1, at%N - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - if(present(mask)) then - if(.not. mask(i)) cycle - endif - n_descriptors = n_descriptors + 1 - n_cross = n_cross + n_neighbours(at,i,max_dist=this%cutoff) + 1 - enddo - - if( present(n_index) ) n_index = 1 - - endsubroutine cosnx_sizes - - subroutine trihis_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(trihis), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("trihis_sizes: descriptor object not initialised", error) - endif - - n_descriptors = at%N - - n_cross = 0 - - do i = 1, at%N - if(present(mask)) then - if(.not. mask(i)) cycle - endif - n_cross = n_cross + n_neighbours(at,i) + 1 - enddo - - if( present(n_index) ) n_index = 1 - - endsubroutine trihis_sizes - - subroutine water_monomer_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(water_monomer), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("water_monomer_sizes: descriptor object not initialised", error) - endif - - n_descriptors = 0 - n_cross = 0 - - do i = 1, at%N - if(at%Z(i) == 8) then - if(present(mask)) then - if(.not. mask(i)) cycle - endif - n_descriptors = n_descriptors + 1 - n_cross = n_cross + 3 - endif - enddo - - if( present(n_index) ) n_index = 3 - - endsubroutine water_monomer_sizes - - subroutine water_dimer_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(water_dimer), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer :: i, j, n - real(dp) :: r_ij - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("water_dimer_sizes: descriptor object not initialised", error) - endif - - n_descriptors = 0 - n_cross = 0 -call print("mask present ? "//present(mask)) - do i = 1, at%N - if(at%Z(i) == 8) then - if(present(mask)) then - if(.not. mask(i)) cycle - endif - do n = 1, n_neighbours(at,i) - j = neighbour(at,i,n,distance=r_ij) - if(at%Z(j) == 8 .and. r_ij < this%cutoff) then - n_descriptors = n_descriptors + 1 - n_cross = n_cross + 6 - endif - enddo - endif - enddo - - if( present(n_index) ) n_index = 6 - - endsubroutine water_dimer_sizes - - subroutine A2_dimer_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(A2_dimer), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer :: i, j, iA1, iA2, iB1, iB2 - integer, dimension(at%N) :: A2_monomer_index - real(dp) :: r_A1_A2, r_B1_B2, r_A1_B1, r_A1_B2, r_A2_B1, r_A2_B2 - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("A2_dimer_sizes: descriptor object not initialised", error) - endif - - call find_A2_monomer(at,this%atomic_number, this%monomer_cutoff, A2_monomer_index) - - n_descriptors = 0 - n_cross = 0 - - do i = 1, at%N - iA1 = i - iA2 = neighbour(at,i,A2_monomer_index(i),distance=r_A1_A2) - if( iA1 > iA2 ) cycle - - do j = i + 1, at%N - iB1 = j - iB2 = neighbour(at,j,A2_monomer_index(j),distance=r_B1_B2) - if( iB1 > iB2 ) cycle - - r_A1_B1 = distance_min_image(at,iA1,iB1) - r_A1_B2 = distance_min_image(at,iA1,iB2) - - r_A2_B1 = distance_min_image(at,iA2,iB1) - r_A2_B2 = distance_min_image(at,iA2,iB2) - - if( all( (/r_A1_A2,r_B1_B2,r_A1_B1,r_A1_B2,r_A2_B1,r_A2_B2/) < this%cutoff) ) then - n_descriptors = n_descriptors + 1 - n_cross = n_cross + 4 - endif - enddo - enddo - - if( present(n_index) ) n_index = 4 - - endsubroutine A2_dimer_sizes - - subroutine AB_dimer_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(AB_dimer), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer :: i, j, n_monomers, iA1, iA2, iB1, iB2 - integer, dimension(:,:), allocatable :: AB_monomer_index - real(dp) :: r_A1_A2, r_B1_B2, r_A1_B1, r_A1_B2, r_A2_B1, r_A2_B2 - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("A2_dimer_sizes: descriptor object not initialised", error) - endif - - if( count(at%Z == this%atomic_number1) == count(at%Z == this%atomic_number2) ) then - n_monomers = count(at%Z == this%atomic_number1) - else - RAISE_ERROR("AB_dimer_sizes: number of monomer atoms 1 ("//count(at%Z == this%atomic_number1)//") not equal to number of monomer atoms 2 ("//count(at%Z == this%atomic_number1)//")",error) - endif - - allocate(AB_monomer_index(2,n_monomers)) - call find_AB_monomer(at,(/this%atomic_number1,this%atomic_number2/), this%monomer_cutoff, AB_monomer_index) - - n_descriptors = 0 - n_cross = 0 - - do i = 1, n_monomers - iA1 = AB_monomer_index(1,i) - iB1 = AB_monomer_index(2,i) - do j = i + 1, n_monomers - iA2 = AB_monomer_index(1,j) - iB2 = AB_monomer_index(2,j) - - r_A1_B1 = distance_min_image(at,iA1,iB1) - r_A2_B2 = distance_min_image(at,iA2,iB2) - - r_A1_A2 = distance_min_image(at,iA1,iA2) - r_B1_B2 = distance_min_image(at,iB1,iB2) - - r_A1_B2 = distance_min_image(at,iA1,iB2) - r_A2_B1 = distance_min_image(at,iA2,iB1) - - if( all( (/r_A1_A2,r_B1_B2,r_A1_B1,r_A1_B2,r_A2_B1,r_A2_B2/) < this%cutoff) ) then - n_descriptors = n_descriptors + 1 - n_cross = n_cross + 4 - endif - enddo - enddo - - deallocate(AB_monomer_index) - - if( present(n_index) ) n_index = 4 - - endsubroutine AB_dimer_sizes - - subroutine bond_real_space_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(bond_real_space), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - type(atoms) :: at_copy - integer :: i, j, k, n, m, shift_j(3) - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("bond_real_space_sizes: descriptor object not initialised", error) - endif - - n_descriptors = 0 - n_cross = 0 - - do i = 1, at%N - n_descriptors = n_descriptors + n_neighbours(at, i, max_dist=this%bond_cutoff) - - do n = 1, n_neighbours(at, i) - j = neighbour(at, i, n, shift=shift_j, max_dist=this%bond_cutoff) - - if(j == 0) cycle - - at_copy = at - call add_atoms(at_copy, 0.5_dp * (at%pos(:,i) + at%pos(:,j) + matmul(at%lattice,shift_j)), 1) - call calc_connect(at_copy) - - do m = 1, n_neighbours(at_copy, at%N + 1) - k = neighbour(at_copy, at%N + 1, m, max_dist=this%cutoff) - - if(k == 0) cycle - - if(at_copy%pos(:,k) .feq. at_copy%pos(:,at%N + 1)) cycle - - n_cross = n_cross + 1 - enddo - - call finalise(at_copy) - enddo - enddo - - if( present(n_index) ) n_index = 2 - - endsubroutine bond_real_space_sizes - - subroutine atom_real_space_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(atom_real_space), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("atom_real_space_sizes: descriptor object not initialised", error) - endif - - n_descriptors = at%N - n_cross = 0 - - do i = 1, at%N - if(present(mask)) then - if(.not. mask(i)) cycle - endif - n_cross = n_cross + n_neighbours(at,i,max_dist=this%cutoff)*2 - enddo - - if( present(n_index) ) n_index = 1 - - endsubroutine atom_real_space_sizes - - subroutine power_so3_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(power_so3), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("power_so3_sizes: descriptor object not initialised", error) - endif - - n_descriptors = 0 - n_cross = 0 - - do i = 1, at%N - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - if(present(mask)) then - if(.not. mask(i)) cycle - endif - n_descriptors = n_descriptors + 1 - n_cross = n_cross + n_neighbours(at,i,max_dist=this%cutoff) + 1 - enddo - - if( present(n_index) ) n_index = 1 - - endsubroutine power_so3_sizes - - subroutine power_SO4_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(power_SO4), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("power_SO4_sizes: descriptor object not initialised", error) - endif - - n_descriptors = 0 - n_cross = 0 - - do i = 1, at%N - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - if(present(mask)) then - if(.not. mask(i)) cycle - endif - n_descriptors = n_descriptors + 1 - n_cross = n_cross + n_neighbours(at,i,max_dist=this%cutoff) + 1 - enddo - - if( present(n_index) ) n_index = 1 - - endsubroutine power_SO4_sizes - - subroutine soap_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(soap), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("soap_sizes: descriptor object not initialised", error) - endif - - n_descriptors = 0 - n_cross = 0 - - do i = 1, at%N - if( .not. any( at%Z(i) == this%Z ) .and. .not. any(this%Z == 0) ) cycle - if(present(mask)) then - if(.not. mask(i)) cycle - endif - n_descriptors = n_descriptors + 1 - n_cross = n_cross + n_neighbours(at,i,max_dist=this%cutoff) + 1 - enddo - - if(this%global) then - n_descriptors = 1 - if( present(n_index) ) then - if( any(this%Z == 0) ) then - n_index = at%N - else - n_index = count( (/(any(at%Z(i)==this%Z),i=1,at%N)/) ) - endif - endif - else - if( present(n_index) ) n_index = 1 - endif - - endsubroutine soap_sizes - - subroutine AN_monomer_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(AN_monomer), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("AN_monomer: descriptor object not initialised", error) - endif - - n_descriptors = 0 - n_cross = 0 - - do i = 1, at%N - n_descriptors = n_descriptors + 1 - n_cross = n_cross + this%N - if(.not.this%do_atomic) exit - enddo - - if(this%do_atomic) then - if( present(n_index) ) n_index = 1 - else - if( present(n_index) ) n_index = this%N - endif - - endsubroutine AN_monomer_sizes - - subroutine general_monomer_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(general_monomer), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer, dimension(:,:), allocatable :: monomer_index - integer :: i - logical, dimension(:), allocatable :: associated_to_monomer - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("general_monomer_sizes: descriptor object not initialised", error) - endif - - allocate(associated_to_monomer(at%N)) - associated_to_monomer=.false. - - call find_general_monomer(at,monomer_index,this%signature,associated_to_monomer,this%cutoff,this%atom_ordercheck,error) - n_descriptors = size(monomer_index,2) - n_cross=size(monomer_index) - if(.not. all(associated_to_monomer)) then - if(this%strict) then - RAISE_ERROR("general_monomer_sizes: not all atoms assigned to a monomer", error) - else - call print("WARNING: general_monomer_sizes: not all atoms assigned to a monomer") - endif - endif - - deallocate(monomer_index) - deallocate(associated_to_monomer) - - if( present(n_index) ) n_index = size(this%signature) - - endsubroutine general_monomer_sizes - - subroutine com_dimer_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - - type(com_dimer), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer, dimension(:,:), allocatable :: monomer_one_index, monomer_two_index, monomer_pairs - integer, dimension(:), allocatable :: pairs_diffs_map - real(dp), dimension(:,:), allocatable :: mean_pos_diffs - logical, dimension(:), allocatable :: associated_to_monomer - logical :: double_count - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("com_dimer_sizes: descriptor object not initialised", error) - endif - - double_count = .false. - - allocate(associated_to_monomer(at%N)) - associated_to_monomer=.false. - - call find_general_monomer(at,monomer_one_index,this%signature_one,associated_to_monomer,this%monomer_one_cutoff,this%atom_ordercheck,error) - if (this%monomers_identical) then - allocate(monomer_two_index(size(monomer_one_index,1),size(monomer_one_index,2))) - monomer_two_index = monomer_one_index - else - call find_general_monomer(at,monomer_two_index,this%signature_two,associated_to_monomer,this%monomer_two_cutoff,this%atom_ordercheck,error) - end if - - if(.not. all(associated_to_monomer)) then - if(this%strict) then - RAISE_ERROR("com_dimer_sizes: not all atoms assigned to a monomer", error) - else - call print("WARNING: com_dimer_sizes: not all atoms assigned to a monomer") - endif - endif - - if (this%mpifind) then - call print("Using find_monomer_pairs_MPI", PRINT_NERD) - call find_monomer_pairs_MPI(at,monomer_pairs,mean_pos_diffs,pairs_diffs_map,monomer_one_index,monomer_two_index,this%monomers_identical,double_count,this%cutoff,error=error,use_com=.true.) - else - call find_monomer_pairs(at,monomer_pairs,mean_pos_diffs,pairs_diffs_map,monomer_one_index,monomer_two_index,this%monomers_identical,double_count,this%cutoff,error=error,use_com=.true.) - end if - n_descriptors = size(pairs_diffs_map) - n_cross=n_descriptors*(size(this%signature_one)+size(this%signature_two)) - - deallocate(associated_to_monomer) - deallocate(pairs_diffs_map) - deallocate(monomer_pairs) - deallocate(monomer_one_index) - deallocate(monomer_two_index) - deallocate(mean_pos_diffs) - - if( present(n_index) ) n_index = size(this%signature_one) + size(this%signature_two) - - endsubroutine com_dimer_sizes - - subroutine general_dimer_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - - type(general_dimer), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer, dimension(:,:), allocatable :: monomer_one_index, monomer_two_index, monomer_pairs - integer, dimension(:), allocatable :: pairs_diffs_map - real(dp), dimension(:,:), allocatable :: mean_pos_diffs - logical, dimension(:), allocatable :: associated_to_monomer - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("general_dimer_sizes: descriptor object not initialised", error) - endif - - allocate(associated_to_monomer(at%N)) - associated_to_monomer=.false. - - call find_general_monomer(at,monomer_one_index,this%signature_one,associated_to_monomer,this%monomer_one_cutoff,this%atom_ordercheck,error) - if (this%monomers_identical) then - allocate(monomer_two_index(size(monomer_one_index,1),size(monomer_one_index,2))) - monomer_two_index = monomer_one_index - else - call find_general_monomer(at,monomer_two_index,this%signature_two,associated_to_monomer,this%monomer_two_cutoff,this%atom_ordercheck,error) - end if - - if(.not. all(associated_to_monomer)) then - if(this%strict) then - RAISE_ERROR("general_dimer_sizes: not all atoms assigned to a monomer", error) - else - call print("WARNING: general_dimer_sizes: not all atoms assigned to a monomer") - endif - endif - - if (this%mpifind) then - call print("Using find_monomer_pairs_MPI", PRINT_NERD) - call find_monomer_pairs_MPI(at,monomer_pairs,mean_pos_diffs,pairs_diffs_map,monomer_one_index,monomer_two_index,this%monomers_identical,this%double_count,this%cutoff,error=error,use_com=this%use_com) - else - call find_monomer_pairs(at,monomer_pairs,mean_pos_diffs,pairs_diffs_map,monomer_one_index,monomer_two_index,this%monomers_identical,this%double_count,this%cutoff,error=error,use_com=this%use_com) - end if - n_descriptors = size(pairs_diffs_map) - n_cross=n_descriptors*(size(this%signature_one)+size(this%signature_two)) - - deallocate(associated_to_monomer) - deallocate(pairs_diffs_map) - deallocate(monomer_pairs) - deallocate(monomer_one_index) - deallocate(monomer_two_index) - deallocate(mean_pos_diffs) - - if( present(n_index) ) n_index = size(this%signature_one) + size(this%signature_two) - endsubroutine general_dimer_sizes - - subroutine general_trimer_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - - type(general_trimer), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer, dimension(:), allocatable :: triplets_diffs_map - integer, dimension(:,:), allocatable :: monomer_one_index, monomer_two_index, monomer_three_index, monomer_triplets - real(dp), dimension(:,:), allocatable :: triplets_diffs - logical, dimension(:), allocatable :: associated_to_monomer - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("general_trimer_sizes: descriptor object not initialised", error) - endif - - allocate(associated_to_monomer(at%N)) - associated_to_monomer=.false. - - call find_general_monomer(at,monomer_one_index,this%signature_one,associated_to_monomer,this%monomer_one_cutoff,this%atom_ordercheck,error) - if (this%one_two_identical) then - allocate(monomer_two_index(size(monomer_one_index,1),size(monomer_one_index,2))) - monomer_two_index = monomer_one_index - else - call find_general_monomer(at,monomer_two_index,this%signature_two,associated_to_monomer,this%monomer_two_cutoff,this%atom_ordercheck,error) - end if - if (this%one_three_identical) then - allocate(monomer_three_index(size(monomer_one_index,1),size(monomer_one_index,2))) - monomer_three_index = monomer_one_index - else if (this%two_three_identical) then - allocate(monomer_three_index(size(monomer_two_index,1),size(monomer_two_index,2))) - monomer_three_index = monomer_two_index - else - call find_general_monomer(at,monomer_three_index,this%signature_three,associated_to_monomer,this%monomer_three_cutoff,this%atom_ordercheck,error) - end if - - if(.not. all(associated_to_monomer)) then - if(this%strict) then - RAISE_ERROR("general_trimer_sizes: not all atoms assigned to a monomer", error) - else - call print("WARNING: general_trimer_sizes: not all atoms assigned to a monomer") - endif - endif - - if (this%use_com) then - RAISE_ERROR("general_trimer_calc: use_com=T not implemented yet", error) - end if - if(this%mpifind) then - call print("Using find_monomer_triplets_MPI", PRINT_NERD) - call find_monomer_triplets_MPI(at,monomer_triplets,triplets_diffs,triplets_diffs_map,monomer_one_index,monomer_two_index,monomer_three_index,this%one_two_identical,this%one_three_identical,this%two_three_identical,this%cutoff,error,use_com=.false.) - else - call find_monomer_triplets(at,monomer_triplets,triplets_diffs,triplets_diffs_map,monomer_one_index,monomer_two_index,monomer_three_index,this%one_two_identical,this%one_three_identical,this%two_three_identical,this%cutoff,error) - end if - n_descriptors = size(triplets_diffs_map) - n_cross=n_descriptors*(size(this%signature_one)+size(this%signature_two)+size(this%signature_three)) - - deallocate(monomer_one_index) - deallocate(monomer_two_index) - deallocate(monomer_three_index) - if(allocated(monomer_triplets)) deallocate(monomer_triplets) - if(allocated(triplets_diffs)) deallocate(triplets_diffs) - deallocate(associated_to_monomer) - - if( present(n_index) ) n_index = size(this%signature_one) + & - size(this%signature_two) + size(this%signature_three) - - endsubroutine general_trimer_sizes - - subroutine rdf_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(rdf), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("rdf_sizes: descriptor object not initialised", error) - endif - - n_descriptors = 0 - n_cross = 0 - do i = 1, at%N - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - if(present(mask)) then - if(.not. mask(i)) cycle - endif - n_descriptors = n_descriptors + 1 - n_cross = n_cross + n_neighbours(at,i,max_dist=this%cutoff) + 1 - enddo - - if( present(n_index) ) n_index = 1 - - endsubroutine rdf_sizes - - subroutine as_distance_2b_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(as_distance_2b), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - real(dp) :: r_ij - integer :: i, j, n - logical :: Zi1, Zi2, Zj1, Zj2 - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("as_distance_2b_sizes: descriptor object not initialised", error) - endif - - n_descriptors = 0 - n_cross = 0 - - do i = 1, at%N - Zi1 = (this%Z1 == 0) .or. (at%Z(i) == this%Z1) - Zi2 = (this%Z2 == 0) .or. (at%Z(i) == this%Z2) - do n = 1, n_neighbours(at,i) - j = neighbour(at,i,n,distance=r_ij) - if( r_ij > this%max_cutoff ) cycle - - Zj1 = (this%Z1 == 0) .or. (at%Z(j) == this%Z1) - Zj2 = (this%Z2 == 0) .or. (at%Z(j) == this%Z2) - if( .not. ( ( Zi1 .and. Zj2 ) .or. ( Zi2 .and. Zj1 ) ) ) cycle ! this pair doesn't belong to the descriptor type - - n_descriptors = n_descriptors + 1 - n_cross = n_cross + 4 + n_neighbours(at,i,max_dist=this%coordination_cutoff) + n_neighbours(at,j,max_dist=this%coordination_cutoff) - enddo - enddo - - if( present(n_index) ) n_index = 2 - - endsubroutine as_distance_2b_sizes - - subroutine molecule_lo_d_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(molecule_lo_d), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer, dimension(:,:), allocatable :: monomer_index - integer :: i - logical, dimension(:), allocatable :: associated_to_monomer - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("molecule_lo_d_sizes: descriptor object not initialised", error) - endif - - n_descriptors=1 - n_cross = this%n_atoms - -!!$ allocate(associated_to_monomer(at%N)) -!!$ associated_to_monomer=.false. -!!$ -!!$ call find_general_monomer(at,monomer_index,this%signature,associated_to_monomer,this%cutoff,this%atom_ordercheck,error) -!!$ n_descriptors = size(monomer_index,2) -!!$ n_cross=size(monomer_index) - - if( present(n_index) ) n_index = this%n_atoms - - endsubroutine molecule_lo_d_sizes - - subroutine alex_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(alex), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("alex_sizes: descriptor object not initialised", error) - endif - - n_descriptors = 0 - n_cross = 0 - - do i = 1, at%N - if( at%Z(i) /= this%Z .and. this%Z /=0 ) cycle - if(present(mask)) then - if(.not. mask(i)) cycle - endif - n_descriptors = n_descriptors + 1 - n_cross = n_cross + n_neighbours(at,i,max_dist=this%cutoff) + 1 - enddo - - if( present(n_index) ) n_index = 1 - - endsubroutine alex_sizes - - subroutine distance_Nb_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(distance_Nb), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer :: i, j, n - logical :: Zi1, Zi2, Zj1, Zj2 - real(dp) :: r_ij - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("distance_Nb_sizes: descriptor object not initialised", error) - endif - - call distance_Nb_calc_get_clusters(this,at,n_descriptors=n_descriptors,mask=mask,error=error) - n_cross = n_descriptors * this%order - - if( present(n_index) ) n_index = this%order - - endsubroutine distance_Nb_sizes - - subroutine soap_express_sizes(this,at,n_descriptors,n_cross,mask,n_index,error) - type(soap_express), intent(in) :: this - type(atoms), intent(in) :: at - integer, intent(out) :: n_descriptors, n_cross - logical, dimension(:), intent(in), optional :: mask - integer, intent(out), optional :: n_index - integer, optional, intent(out) :: error - - integer :: i - - INIT_ERROR(error) - - if(.not. this%initialised) then - RAISE_ERROR("soap_express_sizes: descriptor object not initialised", error) - endif - - n_descriptors = 0 - n_cross = 0 - - do i = 1, at%N - if(present(mask)) then - if(.not. mask(i)) cycle - endif - n_descriptors = n_descriptors + 1 - n_cross = n_cross + n_neighbours(at,i,max_dist=this%cutoff) + 1 - enddo - - if( present(n_index) ) n_index = 1 - - endsubroutine soap_express_sizes - - function descriptor_n_permutations(this,error) - type(descriptor), intent(in) :: this - integer, optional, intent(out) :: error - - integer :: descriptor_n_permutations, i - - INIT_ERROR(error) - - selectcase(this%descriptor_type) - case(DT_BISPECTRUM_SO4,DT_BISPECTRUM_SO3,DT_BEHLER,DT_DISTANCE_2b,DT_COORDINATION, & - DT_ANGLE_3B,DT_CO_ANGLE_3B,DT_CO_DISTANCE_2b,DT_COSNX,DT_TRIHIS,DT_WATER_MONOMER,DT_BOND_REAL_SPACE,& - DT_ATOM_REAL_SPACE,DT_POWER_SO3,DT_POWER_SO4,DT_SOAP,DT_RDF, DT_ALEX, DT_COM_DIMER,DT_SOAP_EXPRESS) - - descriptor_n_permutations = 1 - - case(DT_WATER_DIMER) - descriptor_n_permutations = NP_WATER_DIMER - case(DT_A2_DIMER) - descriptor_n_permutations = NP_A2_DIMER - case(DT_AB_DIMER) - descriptor_n_permutations = NP_AB_DIMER - case(DT_AN_MONOMER) - if(this%descriptor_AN_monomer%do_atomic) then - descriptor_n_permutations = factorial(this%descriptor_AN_monomer%N-1) - else - descriptor_n_permutations = factorial(this%descriptor_AN_monomer%N) - endif - case(DT_GENERAL_MONOMER) - if (.not. this%descriptor_general_monomer%permutation_data%initialised)then - RAISE_ERROR("descriptor_n_permutations: permutation_data not initialised "//this%descriptor_type,error) - end if - descriptor_n_permutations = this%descriptor_general_monomer%permutation_data%n_perms - case(DT_GENERAL_DIMER) - if (.not. this%descriptor_general_dimer%permutation_data%initialised)then - RAISE_ERROR("descriptor_n_permutations: permutation_data not initialised "//this%descriptor_type,error) - end if - descriptor_n_permutations = this%descriptor_general_dimer%permutation_data%n_perms - case(DT_GENERAL_TRIMER) - if (.not. this%descriptor_general_trimer%permutation_data%initialised)then - RAISE_ERROR("descriptor_n_permutations: permutation_data not initialised "//this%descriptor_type,error) - end if - descriptor_n_permutations = this%descriptor_general_trimer%permutation_data%n_perms - case(DT_MOLECULE_LO_D) - if (.not. this%descriptor_molecule_lo_d%permutation_data%initialised)then - RAISE_ERROR("descriptor_n_permutations: permutation_data not initialised "//this%descriptor_type,error) - end if - descriptor_n_permutations = this%descriptor_molecule_lo_d%permutation_data%n_perms - case(DT_DISTANCE_NB) - descriptor_n_permutations = this%descriptor_distance_Nb%n_permutations - case default - RAISE_ERROR("descriptor_n_permutations: unknown descriptor type "//this%descriptor_type,error) - endselect - - endfunction descriptor_n_permutations - - subroutine descriptor_permutations(this,permutations,error) - type(descriptor), intent(in) :: this - type(permutation_data_type) :: my_permutation_data - integer, dimension(:,:), intent(out) :: permutations - integer, optional, intent(out) :: error - - integer :: i, d, np, n, m, ip, j - integer,dimension(1) :: unit_vec - integer, dimension(:), allocatable :: this_perm - integer, dimension(:,:), allocatable :: distance_matrix, atom_permutations, sliced_permutations - - INIT_ERROR(error) - - d = descriptor_dimensions(this,error) - np = descriptor_n_permutations(this,error) - call check_size('permutations',permutations, (/d,np/),'descriptor_permutations',error) - - selectcase(this%descriptor_type) - case(DT_BISPECTRUM_SO4,DT_BISPECTRUM_SO3,DT_BEHLER,DT_DISTANCE_2b,DT_COORDINATION, & - DT_ANGLE_3B,DT_CO_ANGLE_3B,DT_CO_DISTANCE_2b,DT_COSNX,DT_TRIHIS,DT_WATER_MONOMER,DT_BOND_REAL_SPACE,& - DT_ATOM_REAL_SPACE,DT_POWER_SO3,DT_POWER_SO4,DT_SOAP,DT_RDF, DT_ALEX, DT_COM_DIMER,DT_SOAP_EXPRESS) - - permutations(:,1) = (/ (i, i = 1, size(permutations,1)) /) - case(DT_WATER_DIMER) - permutations(:,1) = (/1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15/) ! original order - permutations(:,2) = (/1, 3, 2, 4, 5, 7, 6, 8, 9, 10, 13, 14, 11, 12, 15/) ! swap Hs on monomer A - permutations(:,3) = (/1, 2, 3, 5, 4, 6, 7, 9, 8, 10, 12, 11, 14, 13, 15/) ! swap Hs on monomer B - permutations(:,4) = (/1, 3, 2, 5, 4, 7, 6, 9, 8, 10, 14, 13, 12, 11, 15/) ! swap Hs on both monomers - permutations(:,5) = (/1, 8, 9, 6, 7, 4, 5, 2, 3, 15, 11, 13, 12, 14, 10/) ! swap monomers A and B - permutations(:,6) = (/1, 9, 8, 6, 7, 5, 4, 2, 3, 15, 12, 14, 11, 13, 10/) ! swap monomers and Hs on monomer A - permutations(:,7) = (/1, 8, 9, 7, 6, 4, 5, 3, 2, 15, 13,